보통은 BLDC 모터를 제어할 때는 ESC(Electronic Speed Controller)를 사용하여 제어를 한다.
하지만 ESC는 말 그대로 속도를 제어하는 제어기이기 때문에 각도 제어를 해야 하는 짐벌에서는 사용하기 부적합하다.
그렇다면 어떻게 BLDC 모터를 제어할까? 그러기 위해서는 먼저 BLDC 모터와 ESC의 원리를 알아야 한다.
BLDC 모터는 위와 같이 권선 되어있다.
전류를 흘려주면 자기장이 발생하면서 모터가 회전하게 되는 구조이다.
3개의 선과 전류의 방향을 계산해보면 전류를 흘려주기만 함으로써 총 6가지의 방향 제어가 가능하다.
ESC는 이 6가지 방향을 하나하나씩 스위칭하여 모터를 회전하게 하고, 스위칭되는 속도를 조정하면 모터의 회전 속도가 결정된다.
그렇다면 우리는 전류의 방향과, 경로를 정해줄 수 있어야 한다.
모터에 흐르는 전류의 방향을 결정하는 데에는 대표적으로 H-bridge라는 회로가 사용된다.
H-bridge는 각각의 극에 (+) 극과 연결되는 스위치와 (-) 극 연결되는 스위치를 연결해 전류의 방향을 컨트롤할 수 있게 해 준다.
다음은 MOSFET 4개와 BLDC 모터의 2개 극을 사용하여 전류의 방향을 바꾸어 본 것이다.
void setup() {
pinMode(8,OUTPUT); // 8번 핀 OUTPUT으로 설정
pinMode(9,OUTPUT); // 9번 핀 OUTPUT으로 설정
pinMode(10,OUTPUT); // 10번 핀 OUTPUT으로 설정
pinMode(11,OUTPUT); // 11번 핀 OUTPUT으로 설정
}
void loop() {
delay(1000); // 1000ms (1초) 지연
digitalWrite(8,1); // 8번 핀 ON
digitalWrite(9,0); // 9번 핀 OFF
digitalWrite(10,1); // 10번 핀 ON
digitalWrite(11,0); // 11번 핀 OFF
delay(1000);
digitalWrite(8,0); // 8번 핀 OFF
digitalWrite(9,1); // 9번 핀 ON
digitalWrite(10,0); // 10번 핀 OFF
digitalWrite(11,1); // 11번 핀 ON
}
[코드 : H-brigde]
8, 9번 핀은 (+) 극, 10, 11번 핀은 (-) 극에 연결하고 전류를 1초마다 반대로 흐르게 한 코드이다.
하지만 BLDC 모터는 극이 3개이다. 3개의 극에 전류의 방향을 다르게 제어할 수 있으려면 3개의 H-bridge를 이용하여 다음과 같은 회로를 구성해야 한다.
다음은 3개의 극을 가진 H-bridge를 구성하고 6개 방향의 전류를 흘려 본 것이다.
#define p1 13 // 13번 핀 p1로 정의
#define p2 12
#define p3 11
#define m1 10
#define m2 9
#define m3 8
float ti = 20; // ti = 20
void setup() {
// put your setup code here, to run once:
pinMode(p1, OUTPUT); // p1(13번)핀 OUTPUT으로 설정
pinMode(p2, OUTPUT);
pinMode(p3, OUTPUT);
pinMode(m1, OUTPUT); // m1(10번)핀 OUTPUT으로 설정
pinMode(m2, OUTPUT);
pinMode(m3, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
motor(1, 3); // motor()함수 호출
motor(2, 3);
motor(2, 1);
motor(3, 1);
motor(3, 2);
motor(1, 2);
}
void motor(int p, int m) {
switch (p) {
case 1: // p 가 1일때
digitalWrite(p1, 1); // p1(13번)핀 ON
digitalWrite(p2, 0); // p2(12번)핀 OFF
digitalWrite(p3, 0); // p3(11번)핀 OFF
break;
case 2: // p 가 2일때
digitalWrite(p1, 0);
digitalWrite(p2, 1);
digitalWrite(p3, 0);
break;
case 3: // p 가 3일때
digitalWrite(p1, 0);
digitalWrite(p2, 0);
digitalWrite(p3, 1);
break;
}
switch (m) {
case 1:
digitalWrite(m1, 1); // m1(10번)핀 ON
digitalWrite(m2, 0); // m2(9번)핀 OFF
digitalWrite(m3, 0); // m3(8번)핀 OFF
break;
case 2:
digitalWrite(m1, 0);
digitalWrite(m2, 1);
digitalWrite(m3, 0);
break;
case 3:
digitalWrite(m1, 0);
digitalWrite(m2, 0);
digitalWrite(m3, 1);
break;
}
delay(ti); // ti 만큼 지연
}
[코드 : H-brigde]
p1(13), p2(12), p3(11) 은 (+) 극, m1(10), m2(9), m3(8) 은 (-) 극에 연결하고 6가지 방향으로 ti 만큼의 지연시간을 두고(본 코드에서는 20ms (1000ms=1초) 만큼 지연) 전류의 방향을 바꾼 것이다.
3개의 극에 전류를 흘려주는 것으로 모터의 회전을 구현할 수 있게 되었다.
하지만 짐벌은 모터의 회전을 제어하는 것만으로는 구현할 수가 없다.
짐벌을 모터의 각도를 제어할 수 있어야 한다.
모터의 각도를 제어하기 위해서는 정교한 제어가 필요할 것이다. 3극에 단순히 전류를 흘려주는 것으로는 모터가 12 폴 이므로 최대 24가지의 각밖에 제어하지 못한다.
'Project > Gimbal' 카테고리의 다른 글
[액션캠 짐벌 제작] 06. 프레임 모델링 (0) | 2019.06.09 |
---|---|
[액션캠 짐벌 제작] 05. 릴레이, MOSFET (0) | 2019.06.08 |
[액션캠 짐벌 제작] 04. PWM, analogWrite() (0) | 2019.06.08 |
[액션캠 짐벌 제작] 03. 제어기 선정 및 개발환경 구축 (0) | 2019.06.08 |
[액션캠 짐벌 제작] 02. 모터 선정 (0) | 2019.06.08 |