21
2016-Feb
[AVR] 서보모터 제어
작성자: Blonix
IP ADRESS: *.148.87.98 조회 수: 1668
* DC모터와 마찬가지로 꽤나 전류를 먹기 때문에 왠만하면 외부전원에 연결하도록 하자.
전류가 약하면 회전이 약하거나 아예 안 돌아갈 수도 있다.
서보모터는 50Hz, 즉 20ms 의 펄스파를 필요로 한다. (완벽히 정확할 필요는 없다)
HIGH 상태는 위의 그림과 같이 각도에 따라 600~2400us 만큼 유지하고 나머지를 LOW 상태로 유지해야 한다.
즉, 0도 위치에 머무르고 싶으면 1500us 동안 HIGH, 20ms 동안 LOW 인 셈이다.
90도 서보모터의 경우 -45 ~ 45 만큼 움직인다고 보면 된다.
360도 서보모터는 아예 작동방식이 다른데, 얘는 걍 속도, 방향조절이 되는 DC모터라고 보면 된다.
(근데 DC도 드라이버 달면 되잖아? 쓸모없군.)
서보 한개야 뭐 대충 PWM 쓰든 delay로 무식하게 하든 하면 되는데, 여러개가 되면 이야기가 달라진다.
나는 서보 여럿을 동시에 조절하기 위해 아래와 같이 만들었다. C++ 형식이므로 C로 만들 경우 알아서 적당히 바꾸자.
대체로 내가 예전에 올려둔 DC 컨트롤러와 비슷한데, 잘 이해가 안되면 내가 전에 올려둔 프로젝트 받아서 분석해보면 된다.
#define SERVO_PORT PORTC
#define SERVO_DDR DDRC
#define SERVO_MASK pwmMaskPortc // 얘는 uint8_t 전역변수다. 서보 추가할 때 바꿔준다.
타이머1은 분주비8 이다.