1. 이전의 모터 제어 관련 글들
라즈베리파이 피코보드를 사용하면서, 피코보드의 논리값으로 다양한 기계적 동작을 하려다 보면, 여러가지 종류의 모터를 조작할 필요가 생긴다.
이와 관련하여,
1. 서보모터를 제어하는 방법을 다음글에서 소개했었고,
https://blog.naver.com/mythee1/223186947086
2. 스텝모터를 제어하는 방법을 다음글에서
https://blog.naver.com/mythee1/223190144978
3. 그리고, DC모터(brushed)를 제어하는 방법을 다음글에서 각각 소개한 바 있었다.
https://blog.naver.com/mythee1/223187711541
2. BLDC (Brushless DC) Motor의 특징
그런데 최근 드론과 같은 장비에서 브러시가 없는 형태의 DC모터인 BLDC 모터의 사용이 늘고 있으며, 점차 일반적인 용도에서도 BLDC 모터의 사용빈도가 늘고 있다는 점 때문에 피코 보드에서 이러한 BLDC 모터를 조작하는 방법을 정리해 두면 좋을것 같았다.
BLDC 모터는 일반적인 DC모터에서 권선 축이 회전하는 것과 다르게, 모터의 자석 부분(통)을 회전시키는 형태인데, BLDC의 사용상 특징으로는 브러시가 존재하지 않기 때문에 내구성이 뛰어나고 발열도 적으며, 브러시드 모터에 비해 속도가 빠르고 주행시간도 훨씬 긴 장점이 있다.
내부 구조는 여러 개의 권선이 연결되어 있으며, 자석의 위치에 따라 특정 권선에 전력을 반도체를 이용하여 공급하는 형태인데, 이 때문에, 자석의 위치를 고려하여 특정 권선에 전류를 보내기 위해서는 자석의 위치를 정확히 알아내기 위한 홀센서 (Hall Sensor)가 사용되며 이 때문에 선의 수가 5선 8선 식이 되곤 한다.
그러나, 간혹 센서가 없는 BLDC들도 있는데, 이는 소형화를 위해 자석위치를 측정하는 Hall Sensor가 생략된 제품으로 Sensorless BLDC라고 부르며, 이 들 제품은 자석의 위치를 Lent’s Law(ahxj 회전시 정규 전압과 반대로 생성되는 역기전력이 발생)의 원리를 이용하여 계산한다고 하며, 이들은 센서를 위한 배선이 필요 없어 3선식으로도 배선이 이루어지는 간편함이 있다.
3. BLDC (Brushless DC) Motor의 제어
마침 서랍을 뒤져보니 BLDC가 2개 있기는 했는데, 예전 RC(Remote Control) 장비에 사용하던 매우 소형의 BLDC였다.
당시 다음 사진과 같은 무선조정기의 수신부에 ESC(Elecic Speed Control)를 연결하고 다시 BLDC에 연결하여 사용하던 제품이었다. 당시 무선 수신기는 서보모터도 연결해서 사용하던 것으로 수신기의 4개 채널 어느곳이든 서보모타가 잘 동작했었던 상태였고(동작하는 각도의 차이는 있었으나), 이러한 채널의 한곳에 BLDC용 ESC를 연결하여 BLDC를 제어했었다.
여기에서 BLDC모터의 제어원리에 대한 힌트를 얻을수 있었다.
즉, 서보모터와 동일한 방식으로, 그 Code를 그대로 사용하여 BLDC 모터를 ESC를 경유하여 제어할수 있는 것이다.
위에 소개한 서보모터의 제어에 사용했던 PWM방식으로 BLDC를 제어하기로 하고, 다음 사진과 같이 배선했다.
실제로 피코보드에서 연결된 선은 PWM출력선(GP15사용)으로, 이를 ESC의 신호선(오렌지색)에 연결했다. 그리고 ESC의 회로용전선 3가닥중 나머지인 Vcc와 GND는 각기 3.3V와 GND에 연결했다.
여기에 사용한 ESC는 BLDC전용 제품으로 지속 전류가 30A인 제품으로, 동작전압 범위가 4V-16V인 제품으로 예전에 RC용으로 구입해 두었던 제품이었다. ESC 모터용 전원을 처음에는 별도 배터리에 연결했으나, 현재 시도중인 BLDC가 워낙 작은 용량임을 고려해서 그냥 피코보드의 5V와 GND에 연결했는데, 별 문제없이 잘 동작했다.
4. BLDC (Brushless DC) Motor의 PWM 제어 시도
예전 서보모터의 PWM 제어에 사용하던 Code를 가져다가 “servo”라는 키워드만 “BLDC” 로 대체하여 그대로 적용하기로 했다. 그런데 한가지 문제는 내가 사용하려는 BLDC의 제어를 위한 PWM 설정 주파수와, 실제 동작이 일어날 Duty 값을 알수 없었다.
우선, 기존 RC 장치에서 SG-90서보 모터와 동일하게 작동했던 것을 기억하고 동일한 50Hz로 설정해 보기로 했다. 그리고 동작이 이루어지는 PWM 값을 모르기 때문에 0~65535값을 빠르게 시도해 보기로 했다.
import machine
import utime
bldc = machine.PWM(machine.Pin(15))
bldc.freq(50)
while True:
for i in range(250) :
out=i*300
print (“pwmoutput =”, out)
bldc.duty_u16(out)
utime.sleep(1)
이렇게 해 보니, 50Hz에서 동작이 되는 구간이 5개 구간이 있었다.
첫 구간은 대략 PWM출력값이 4500 부근에서 동작이 시작되어, 7520 부근에서 동작이 멈추었다. 이 구간 내에서 PWM 출력값이 커질수록 회전속도가 빨라지는 느낌을 속도로서 알수 있었는데, 전체 구간(4500–>7520) 중 약 1/3 정도를 지난 정도부터는 속도의 변화가 느껴지지는 않았고 그 이후로는 오히려 모터가 약간 쿨럭거리면서 과도하게 동작하는 느낌을 받았다.
이러한 경향성은 4500에서 시작하는 구간 외에도, 18000부근, 31400 부근, 44930 부근, 58000 부근에서 반복되었고, 각 구간의 PWM범위는 약 3000정도였다.
0~65535 구간을 빠르게 시도한 후, 확인된 동작 구간의 PWM을 조금 천천히, 그리고 조금씩 변화시키면서 동작이 개시되는 곳과 끝나는 부근의 정확한 PWM 값을 체크했다.
이렇게 BLDC를 PWM으로 제어할 수 있음이 확인되었다.
그런데, 한가지 의문이 생겼다. 내가 임의로 설정한 PWM주파수가 과연 최적일까?
PWM 제어용 주파수를 서보모터와 동일하게 맞추었던 50Hz에서, 각기 변화시키면서 BLDC의 동작을 체크해 보았는데, 그 결과를 요약하면 다음과 같다.
PWM 제어용 주파수를 50Hz에서 늘려갈수록, 50Hz였을때에 비하여 주파수를 늘린만큼의 PWM 출력값에서 동작이 이루어졌다. 그리고, 그만큼 동작이 이루어지는 PWM 출력값의 범위도 넓어졌다. 즉, 50Hz였을때는 4535정도의 값에서 동작되던 것이 400Hz에서는 약 8배인 36300 부근에서 동작이 시작되었고, 동작이 멈추는 값도7517에서 약 8배인 59850정도에서 동작이 멈추었다. 50Hz에서는 동작이 시작되어 끝나는 값까지의 차이가 약 3000 정도였던 것이, 약 23550 수준으로 약8배 확대되었고, 그만큼 제어가능한 숫자의 범위가 넓어진 것이었고, PWM출력치 변화에 따른 모터 동작도 좀 더 부드러워진 느낌이 들었다.
|
설정주파수Hz |
동작이 관찰되는 PWM Duty |
|
50 |
4535~7517, 18000-20980 31460-34442, 44930-47910 58080-61363 |
|
100 |
9070-15050 35990-42000 62930-64900 |
|
300 |
27230-45120 |
|
400 |
36300-59850 |
|
500 |
45300-62360 |
|
5000 |
동작 확인 안됨 |
|
50000 |
동작 확인 안됨 |
이러한 과정을 통해 현재 내가 시도한 소형 BLDC와 ESC 조합에서는 400Hz의 PWM주파수로 설정하고, 36300~59850 범위로 PWM출력값을 변화시켜 제어하는 것이 가장 바람직한 것으로 판단되었다.
(BLDC마다, 이러한 최적 주파수와 PWM 설정치는 차이가 있을듯 하며, 이후 다른 BLDC 모터가 확보되면 추가 시험해 볼 예정임)
참고로, 내가 BLDC 제어에 사용한 Code는 다음과 같다.
import machine
import utime
bldc = machine.PWM(machine.Pin(15))
bldc.freq(400)
while True:
for i in range(100) :
out=i*655
print ("pwmoutput =", out)
bldc.duty_u16(out)
utime.sleep(1)
한편, BLDC의 PWM제어와 관련하여 읽어볼만한 기사가 있어 소개한다.

