이제 pwm의 기본적인 이론을 알아봤으니 서보모터의 제어를 해보도록 해요.


소스와 회로를 짜기 전에 서보모터에 대한 기초적인 지식을 조금 알고 가시면 소스를 이해하시는 대에 도움이 되실 겁니다.


먼저 서보모터의 데이터 시트를 아무거나 한번 보도록 하죠.


이 데이터시트에서 서보모터를 제어를 위해 소스를 짤 때 중점으로 볼 부분이 파란 점 부분 2곳입니다.


먼저 control system 여기를 보시면 펄스폭 1500usec(=1.5ms)에서 0도인 것을 볼 수 있습니다.

그리고 operating angle 여기를 보시면 펄스폭이 0.4ms 일 때 40도를 움직입니다. 즉 10us(=0.01ms)에 1도 움직이네요.


이제 우리는 모터를 제어하기 위해 1.5ms±0.9ms 사이의 펄스를 만들어주면 됩니다.











내용을 어렵게 풀어 나간것 같아 펄스 만드는법은 새로운 글로 대신 하겠습니다.

밑의 링크로 가주세요.


>>  서보모터



그래서 펄스를 어떻게 만드냐?



TCCR에  값을 넣어서 COM bit, CS bit, WGM(Fast PWM mode(14))를 사용하고 


ICR, OCR, TCNT 등을 쓰는데 차근차근 나가 봅시다.


먼저 주기가 20ms인 주기를 만듭니다. 
(서보모터 제어회로에서 펄스 입력을 20ms마다 검출하므로 20ms 이하로 잡는 게 바람직합니다. 주기가 길다면 입력이 없는 것으로 판명되어 오작동을 일으키게 됩니다.)




먼저 식을 봅시다.


16MHz / 64 / (1+4999) = 50Hz = 20ms



외부 크리스털 16MHz 클록을 CS bit의 64클록으로 나누고 ICR(아래 사진 TOP) =4999로 설정해서 나누면 20ms의 스위칭 주기가 만들어집니다.



이제 2.4ms 펄스를 만들어야겠지요?
(1+4999) * 2.4 / 20 = 600 

  ICR 값         펄스폭   주기      OCR 값


600 / 24 = 25
0.1ms만큼의 폭을 알기 위해 나눠줍니다.



0.6, 1.5, 2.4ms => 150, 375, 600
-90도 0도  90도에 해당하는 값들을 찾습니다.




그럼 이제 우리가 쓰기 쉽도록 각도 값으로 바꿔 줍시다.


OCR1A = (600 - 375)*X/90 +375 = 225*X/90 +375
X에 원하는 회전각을 쓰시면 됩니다.





회로는 딱히 그릴 것도 없네요.


서보모터의 검은색 빨간색>+ , 노란색 제어 입력 신호


이렇게만 연결해주시면 됩니다.(16MHz 크리스털 써주시고요)




아래는 기본적인 소스입니다.(atmega32 용입니다. atmega128 사용자분들은 조금 수정이 필요할 수 있습니다)



소스       svtest.c



#include <avr/io.h>

#include "./../../header/delay.h"


#define  f_cpu 16000000;

void svangle (float angle)

{

unsigned int pulse;

pulse = angle*225/90 +375 +0.5;

OCR1A = pulse;

}


int main(void)

{

DDRD = 0xff;

PORTD = 0x00;

        TCCR1A= 0x82;

TCCR1B= 0x1b;

ICR1 = 4999;

OCR1A = 0;

TCNT1 = 0x00;

/* Replace with your application code */

    while (1) 

    {

   svangle(0);

delay_ms(1000);

svangle(90);

delay_ms(1000);

svangle(50);

delay_ms(1000);

svangle(0);

delay_ms(1000);

svangle(-50);

delay_ms(1000);

svangle(-90);

    }

}


led 제어와 같이 응용하시면 이런식 으로도 만들수 있습니다.








그럼 다들 수고하세요

'avr 기초' 카테고리의 다른 글

avr 모터제어의 꽃 PWM제어를 알아보자  (0) 2016.04.27
귀찮은 avr F_CPU설정 한번에 해버리자!  (0) 2016.03.21
atmega32/ 128 fnd(7-segment)제어  (0) 2016.03.12
atmega led switch  (0) 2016.03.07
atmega로 led켜기  (0) 2016.03.04
Posted by 탕구이

블로그 이미지
엔지니어를 꿈꾸는 공대생
탕구이

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

글 보관함