3.3.모터의 회전 속도 조절 - PWM II
in Mechatronics on Classnote
주의사항
[고장주의] 12V 전원을 잘못 연결하면 라즈베리파이가 망가진다. 회로를 구성한 후에 확인을 반드시 하기 바라며 전원 공급을 가장 마지막에 하도록 한다.
모터 돌려보기
모터 드라이버
모터는 현대의 기계에서 필수불가결한 장비이다. 이러한 모터는 어떻게 제어될까. PWM은 디지털 신호만을 가지고 아날로그 신호를 모사할 수 있다는 것을 고려한다면, LED 예제와 같이 모터가 켜져있는 시간과 꺼져있는 시간을 잘 조절하면 모터의 속도를 조절할 수 있을 것이다.
먼저 모터의 회로를 구성해보자. 모터의 방향을 바꾸거나 속도를 조절하기 위해서는 모터 드라이버라는 것이 필요하다. 모터 드라이버는 모터를 더욱 유연하게 사용할 수 있도록 돕는 집적회로이다. 모터 드라이버는 H-bridge를 포함하고 있기 때문에 전류의 방향을 바꿔줄 수 있다.
모터 드라이버 내부의 H-bridge는 아래 그림과 같이 전류의 방향을 바꿀 수 있다. 이는 S1, S2, S3, 그리고 S4 이렇게 총 4개의 스위치를 개폐하는 방식에 달려있다.
[주의] 여담으로 모터 드라이브는 전류가 많이 흐르는 집적회로이기 때문에 오래 켜두면 발열이 심하다. 오래 모터를 가동한 직후에 만지지 않도록 주의하라.
-H-bridge
- S1, S4를 닫고 S2, S3를 열면 중앙의 모터에 전류가 좌측에서 우측으로 흐른다.
- S2, S3를 닫고 S1, S4를 열면 중앙의 모터에 전류가 우측에서 좌측으로 흐른다.
메카트로닉스 수업에서 제공된 모터 드라이버는 TA8050P이다. 해당 모터 드라이버에 대한 데이터 시트는 해당 링크에서 확인하 수 있다.
-모터 드라이버 내부 개념도
PIN 번호 | 기호 | 설명 |
---|---|---|
1 | DI1 | 출력 상태 제어용 핀 1 |
2 | DI2 | 출력 상태 제어용 핀 2 |
3 | M(+) | DC 모터의 극 중 하나에 연결 |
4 | GND | 접지. 전원의 (-)극 연결 |
5 | M(-) | DC 모터의 극 중 하나에 연결 |
6 | NC | 사용하지 않음 |
7 | VCC | 전원 공급 핀. (+)극에 연결 |
-모터 드라이버의 블록 다이어그램과 핀 레이아웃
이는 모터 드라이버의 핀맵이며, 1번 핀과 2번 핀에 들어가는 전기 신호에 따라서 H-bridge가 작동하며 이에 따라서 3번과 5번 핀에서 출력이 아래의 표와 같이 결정된다.
INPUT | OUTPUT | ||
---|---|---|---|
DI1 | DI2 | M(+) | M(-) |
HIGH | HIGH | LOW | LOW |
LOW | HIGH | LOW | HIGH |
HIGH | LOW | HIGH | LOW |
LOW | LOW | OFF | OFF |
-모터 드라이버에서의 입력에 대한 출력의 정리
모터 회로 구성 및 예제
다음과 같이 회로를 구성하여 모터를 구동해보자. 가장 상단의 짧은 주황색 전선은 모터 드라이버에 공급하는 12V 전원이며, 노란색 전선은 오른쪽 그림의 모터 단자에 연결하면 된다. 12V 전원은 맨 마지막에 공급하는 것을 잊으면 안된다
-모터를 구동하기 위한 회로의 구성
그리고 다음의 예제 코드를 입력한다.
#include <stdio.h>
#include <wiringPi.h>
#include <softPwm.h>
#define MOTOR1 19
#define MOTOR2 26
int main(void)
{
wiringPiSetupGpio();
softPwmCreate(MOTOR1, 0, 100);
softPwmCreate(MOTOR2, 0, 100);
while (1)
{
int cnt = 0;
for (; cnt < 100; cnt++)
{
softPwmWrite(MOTOR1, cnt);
softPwmWrite(MOTOR2, 0);
delayMicroseconds(100000);
}
cnt = 0;
for (; cnt <100; cnt++)
{
softPwmWrite(MOTOR1, 0);
softPwmWrite(MOTOR2, cnt);
delayMicroseconds(100000);
}
}
return 0;
}
해당 코드를 실행하면 아주 천천히 가속하다가 정지하고 반대 방향으로 가속하다가 정지하고 하는 것을 확인할 수 있다.