본문 바로가기

AVR

스텝모터 구동

으아~ 만 한달동안 고생해서 이제 스텝 모터를 돌렸다;;
정말 기분이 째진다..;;
중간에 기사 시험공부도 하고 해서 한달이나 걸렸지만..
그래도..;; 기분이 이빠이 좋네.. ㅋㅋ
이대로 쭉쭉 나가 보는거야~ ㅋㅋ
일단 밑 소스는 스텝모터 한 바퀴를 돌리는 거니깐.. 저장 해 놔야지.. ㅋ

#include<avr/io.h>

void delay_us(unsigned char time_us)
{
 register unsigned char i;
 for(i=0; i < time_us; i++)
 {
  asm volatile("PUSH R0"); //2 cycle = 0.125us
  asm volatile("POP R0"); //2 cycle = 0.125us
  asm volatile("PUSH R0"); //2 cycle = 0.125us
  asm volatile("POP R0"); //2 cycle = 0.125us
  asm volatile("PUSH R0"); //2 cycle = 0.125us
  asm volatile("POP R0"); //2 cycle = 0.125us
  // Sum = 16 cycle=1 us for 16MHz
 }
}

void delay_ms(unsigned int time_ms)
{
 register unsigned int i;
 for(i=0; i < time_ms; i++)
 {
  delay_us(250); // 250us
  delay_us(250); // 250us
  delay_us(250); // 250us
  delay_us(250); // 250us
 }
}


char nextMotorCLK(char step)
{
 char next = 0;
 switch(step)
 {
  case 0x4a: next = 0x59; break;
  case 0x59: next = 0x95; break;
  case 0x95: next = 0xa4; break;
  case 0xa4: next = 0x4a; break;
  default  : next = 0x4a; break;
 
 } // 정회전 4-5-9-a 순서

 return next;
}


int main()
{
 DDRC = 0XFF;
 char step = 0;
 unsigned char text = 0;

 while(text < 200) // 200으로 한 바퀴 돌림
 {
  step = nextMotorCLK(step);
  PORTC = step;

  delay_ms(4); 
  text = text + 1;
 }
 return 0;

 

}