스텝모터 제어 프로그램

#include <mega128.h> 

#include <delay.h>

 

// Declare your global variables here

void RotateStep(char bDirection, int Step);

void RotateAngle(char bDirection, float Angle);

void RotateRpm(char bDirection, int rpm);

 

char cM=0;  // cM=분할선택신호(D.S) 0=m1, 1=m2   

char m1=2,m2=0;  // 보드의 분해능 m1,m2 스위치 선택

 

void main(void)

{

// Declare your local variables here     

 

// Input/Output Ports initialization

// Port A initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTA=0x00;

DDRA=0x00;

 

// Port B initialization

// Func0=Out Func1=Out Func2=Out Func3=Out Func4=Out Func5=Out Func6=Out Func7=Out

// State0=0 State1=0 State2=0 State3=0 State4=0 State5=0 State6=0 State7=0

PORTB=0x00;

DDRB=0xFF;

 

// Port C initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTC=0x00;

DDRC=0x00;

 

// Port D initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTD=0x00;

DDRD=0x00;

 

// Port E initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTE=0x00;

DDRE=0x00;

 

// Port F initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=In

// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=T

PORTF=0x00;

DDRF=0x00;

 

// Port G initialization

// Func0=In Func1=In Func2=In Func3=In Func4=In

// State0=T State1=T State2=T State3=T State4=T

PORTG=0x00;

DDRG=0x00;

 

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=FFh

// OC0 output: Disconnected

TCCR0=0x00;

ASSR=0x00;

TCNT0=0x00;

OCR0=0x00;

 

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: Timer 1 Stopped

// Mode: Normal top=FFFFh

// OC1A output: Discon.

// OC1B output: Discon.

// OC1C output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

TCCR1A=0x00;

TCCR1B=0x00;

TCNT1H=0x00;

TCNT1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

OCR1CH=0x00;

OCR1CL=0x00;

 

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

TCCR2=0x00;

ASSR=0x00;

TCNT2=0x00;

OCR2=0x00;

 

// Timer/Counter 3 initialization

// Clock source: System Clock

// Clock value: Timer 3 Stopped

// Mode: Normal top=FFFFh

// OC3A output: Discon.

// OC3B output: Discon.

// OC3C output: Discon.

TCCR3A=0x00;

TCCR3B=0x00;

TCNT3H=0x00;

TCNT3L=0x00;

OCR3AH=0x00;

OCR3AL=0x00;

OCR3BH=0x00;

OCR3BL=0x00;

OCR3CH=0x00;

OCR3CL=0x00;

 

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

// INT2: Off

// INT3: Off

// INT4: Off

// INT5: Off

// INT6: Off

// INT7: Off

EICRA=0x00;

EICRB=0x00;

EIMSK=0x00;

 

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x00;

ETIMSK=0x00;

 

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

// Analog Comparator Output: Off

ACSR=0x80;

SFIOR=0x00;

 

//while (1)

//      {

      // Place your code here

          //RotateRpm(1,10);

          //RotateStep(1,500);

          RotateAngle(0,180);

//      };

} 

   

// 스텝모터의 속도 조절

// bDirection 0=CW 1=CCw  

// M1 S/W NO=0으로만 제어를 한다.

void RotateRpm(char bDirection, int rpm)  

{

              char cOut=0x40; // B포트 출력값

              int i,j;

              unsigned int step;

             

              if(bDirection == 0)

                             cOut |= 0x04;

              for(i=0;i<500;i++) {

                             PORTB=cOut; 

      delay_us(1); 

      PORTB.6=0;

      //delay_us(500);

      step=(unsigned int)(30/rpm*1000/500);      //500us 단위로 제어

      for(j=0;j<=step;j++)

          delay_us(500);

              }

              PORTB=0x10;        // 모터여자 신호를 Off 하여 모터의 발생을 방지한다.    

}   

          

// bDirection 0=CW 1=CCw

void RotateStep(char bDirection, int Step)  

{

              char cOut=0x40; // B포트 출력값

              char m;

              int i;

             

              if(cM==1) {

                             m = m2;

                             cOut |= 0x10;

              }

              else

                             m = m1;

             

              if(bDirection == 0)

                             cOut |= 0x04;

              for(i=0;i<Step;i++) {

                             PORTB=cOut; 

      delay_us(1); 

      PORTB.6=0;

      delay_ms(1);

              }

              PORTB=0x10;        // 모터여자 신호를 Off 하여 모터의 발생을 방지한다.    

}   

 

// bDirection 0=CW 1=CCw

void RotateAngle(char bDirection, float Angle)  

{

              char cOut=0x40; // B포트 출력값

              char m;

              int i,Step;

             

              if(cM==1) {

                             m = m2;

                             cOut |= 0x10;

              }

              else

                             m = m1;

                              

              // M1,M2 의한 분해능을 조절하여 스텝을 결정한다.

              switch(m) {

                             case 0:

                                           Step = (int)(Angle/0.72);        // 보드의 M1=0

                                           break;  

                             case 1:

                                           Step = (int)(Angle/0.72)*2;

                                           break;

                             case 2:

                                           Step = (int)(Angle/0.72)*4; 

                                           break;

                             case 3:

                                           Step = (int)(Angle/0.72)*5; 

                                           break;

                             case 4:

                                           Step = (int)(Angle/0.72)*8; 

                                           break;

                             case 5:

                                           Step = (int)(Angle/0.72)*10; 

                                           break;

                             case 6:

                                           Step = (int)(Angle/0.72)*20; 

                                           break;

                             case 7:

                                           Step = (int)(Angle/0.72)*40; 

                                           break;

                             case 8:

                                           Step = (int)(Angle/0.72)*80; 

                                           break;

                             case 9:

                                           Step = (int)(Angle/0.72)*16; 

                                           break;

              }

                 

              if(bDirection == 0)

                             cOut |= 0x04;

             

              for(i=0;i<Step;i++) {

                             PORTB=cOut; 

      delay_us(1); 

      PORTB.6=0;

      delay_ms(1);

              }

              PORTB=0x10;        // 모터여자 신호를 Off 하여 모터의 발생을 방지한다.

}

처음

중요함수