Embedded System/ATmega128

[ATmega128] sg90(서보모터) 제어

전두선 2019. 10. 2. 17:03

서보모터(sg90)란?

sg90

서보 (Servo)의 어원은 라틴어의 Servue로서 노예라는 의미를 가지고 있으며, 목표치에 대한 위치,방위, 자세 등의 제어가 자동화되어 있는 장치 이름에 붙여지곤 합니다.이와 같이 서보모터는 모터와 기어박스 그리고 제어회로로 구성되어있어,
특정 위치로 이동하거나, 특정한 수치(속도 등)만큼 가동시킬 때,모터로 부터의 피드백을 통해 정확하게 제어할 수 있는 구조를 갖추고 있는 모터로자동화 생산 시스템, 로봇, 장난감, 가전제품 등 광범위하게 쓰이고 있습니다.

즉, 서보모터란 지정된 각도만큼 회전할수 있고, 목표치에대한 위치, 방위, 자세 등의 제어가 자동으로 가능하다.

 

서보모터(sg90)의 연결 및 제어방법

sg90 연결방법

3개의 선이 나와있는 sg90 제품의 연결은 빨간선 VCC, 갈색선 GND, 그리고 주황선에 PWM 신호입력을 해주면된다. sg90 제품은 0~180도의 범위를 가지며 입력해주는 PWM 신호의 펄스주기에 따라 원하는 각도로 움직이게 할 수 있다.

데이터 시트에 기입되있는 내용을 살펴보니 PWM Period를 20 ms(50Hz)로 설정하고, Duty Cycle을 1.5 ms pulse로 구성했을때 0 degree에 위치로 움직이게 되고, Duty Cycle을 ~1 ms pulse로 구성하면 -90 degree, 그리고 ~2ms pulse로 구성하면 90 degree의 위치로 움직인다고 나와있다.

 

 

PWM(Pulse Width Modulation, 펄스폭 변조)이란?

PWM이란 Pulse Width Modulation의 준말로 펄스의 폭을 컨트롤하는 주기 제어방법입니다. 출력되는 전압값을 일정한 비율(duty)동안은 High를 유지하고, 나머지는 Low를 출력하여 아래와 같은 사각파의 출력을 만들어 내는데, 디지털 신호인 PWM을 사용하면 0V와 5V사이의 아날로그 신호를 묘사할 수가 있습니다.

 

즉, 일정한 주기 내에서 Duty 비를 변화시켜서 평균 전압(Average Voltage)를 제어하는 방법입니다.

 

pwm

이러한 PWM 신호를 이용해서 대표적으로 DC모터에 적용하면 모터의 속도를 조절할 수가 있게되고, 본 글에서 설명한 서보모터(sg-90)에서는 일정한 주기(50ms)에서 Duty 비(1-2ms pulse) 조정을 통해 원하는 각도로 이동시킬 수 있다.

추가적으로 PWM은 진동을 나타내므로 피에조부저에서 경보음을 구현할때 사용이 되기도 한다.

 


ATmega128를 이용하여 sg90 제어(using Atmel studio)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define F_CPU 8000000UL
#include <avr/io.h> 
#include <util/delay.h>
 
int main(void)
{
    DDRB=0x20;   // PB5 out 
    TCCR1A=0x82; TCCR1B=0x1A; OCR1A=3000; ICR1=19999// OCR1A -> OC Clear / Fast PWM TOP = ICR1 / 8분주
    while(1)
    {
        OCR1A = 2000// 0 degree,  >2ms pulse
        _delay_ms(1000);
        OCR1A = 1000// 180 degree, <1ms pulse
        _delay_ms(1000);    
    }
}
cs

실험은 간단하게 0도와 180도일때를 1초간격으로 움직이게 하였고, 실험결과 데이터 시트상과 다르게 1ms가 180도가 아니였다. 그래서 사용자가 직접 조정이 필요하다. 위 코드 상에는 180도가 1000으로 되있지만 실제로는 500정도로 해서 사용해야지 180도가 되었다.