학습목표    1

학습주제    1

예습내용    1

실습방법    1

        3

중요함수    3

스텝모터제어

학습목표

스텝모터의 회전방향, 각도를 제어한다.

학습주제

오토닉스의 스템모터와 드라이버를 AVR 연결하여 이를 제어한다.

사용기기 : 모터드라이버(오토닉스KR55M), 스텝모터(오토닉스02K-S523)

예습내용

 

오른쪽 사진의 기능스위치 S/W2 ON으로 하여 1펄스 입력방식으로 제어를 한다.

PWM으로 제어를 하기 위하여 회로와 같이 PB6 J0-1 연결하였다.

분해능 설정 S/W m1,m2 소프트웨어에서 선택하여 운전할 있도록 프로그램 하였다.

[주의] 스텝모터에서 발생하는 열의 발생을 줄이기 위해서 사진의 파란색 스위치 좌측2개를 조절한다.

그림과 같이 스텝모터 드라이버의 “SIGNAL” 콘넥터를 RCM128 “B”포트와 연결한다.

여기서 PB0 PB6 위치를 바꾸어 놓은 것은 PWM1(16비트) 속도를 제어하기 위해서이다.

 

콘트롤 신호

CW

CCW

H.O

D.S

Z.P

 

+

-

+

-

+

-

+

-

+

-

 

보드 SIGNAL No

1

2

3

4

5

6

7

8

9

10

 

 

보드의 B포트

PB6

PB1

PB2

PB3

PB4

PB5

PB0

PB7

 

 

 

 

 

 

실습방법

   

 

모터의 회전방향과 진행 회전양을 제어한다.

펄스의 모양은 AVR에서 오른쪽 그림과 같이 발생 시켜 모터드라이버를 제어한다.

0.1mSec

 

 

 

 

1mSec

 

예제1 모터를 CW+ 방향으로 1스텝 움직이려면 아래와 같다.

 

 

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

cOut |= 0x40;   // PORTB.6=1 만든다.

PORTB=cOut; 

delay_ms(0.1); 

PORTB.6=0;

delay_ms(1);          // PORTB.6=0 만든다.

 

 

CW- 방향은 cOut |= 0x44; 한다.

[소스 프로그램 내려받기]

 

 

방향과 스템을 조절하는 함수는 다음과 같이 한다.

 

예제2 모터의 방향과 스텝을 제어하는 함수

BDirection=0 : CW+ 방향

BDirection=1 : CW- 방향

Step : 1 펄스에 대응하는 모터의 회전

분해능은 모터드라이버 보드의 M1=M2=0으로 맟추어 놓으면 한스텝이 0.72°이다. 그러므로 306° 500(=360/0.72) 된다.

CM=0 보드의 M1분해능을 따르고 CM=1 보드의 M2분해능을 따른다.

m1,m2 스위치 선택 번호 이다.

 

 

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

char m1=2,m2=0;

// 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 하여 모터의 발생을 방지한다.         

}

 

 

 

 

회전 각도로 입력하는 함수는 다음과 같다

 

예제3 모터의 방향과 각도를 제어하는 함수

BDirection=0 : CW+ 방향

BDirection=1 : CW- 방향

Angle : 회전 각도

 

 

// 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 하여 모터의 발생을 방지한다.

}

 

 

 

 

 

 

예제4 모터를 CW+ 방향으로 500스텝(1회전), CW- 방향으로 500스텝(1회전), CW+ 방향으로 360° (1회전), CW- 방향으로 360° (1회전) 하는 프로그램

 

 

RotateStep(0,500);

delay_ms(1000);

RotateStep(1,500); 

delay_ms(1000);

RotateAngle(0,360); 

delay_ms(1000);

RotateAngle(1,360);

 

 

[전체 프로그램 보기] [소스 프로그램 내려받기]

 

 

처음

   

 

중요함수