3.15. Điều khiển động cơ DC

Động cơ DC có chổi than là một cuộn dây trên trục đặt bên trong từ trường. Cho dòng điện chạy qua cuộn dây, từ trường tác dụng lực lên cuộn dây; lực đó tạo ra mô-men xoắn trên trục. Các chổi than bên trong động cơ đảo chiều dòng điện trong cuộn dây khi trục quay, giúp mô-men xoắn luôn đẩy trục theo cùng một hướng. Cấp điện áp DC vào hai cực của động cơ thì trục quay; đảo cực thì trục quay theo chiều ngược lại.

Động cơ thường cần hàng trăm miliampe đến vài ampe, ở điện áp nguồn cao hơn mức logic 3,3 V của camera. Một chân GPIO chỉ có thể cung cấp khoảng 25 mA và không thể đảo cực -- nó chỉ có thể điều khiển hai mức điện áp của mình. Tầng điều khiển nằm giữa camera và động cơ phải chịu được dòng của động cơ, dẫn nguồn điện áp cao riêng cho động cơ, và cho phép camera đảo cực theo lệnh. H-bridge bốn transistor là giải pháp tiêu chuẩn cho bài toán này.

3.15.1. H-bridge

Một H-bridge gồm bốn công tắc bố trí thành hình chữ H xung quanh động cơ:

An H-bridge schematic. Vmotor at top connects through switch S1 down to a node A on the left, and through switch S2 down to a node B on the right. The motor M sits horizontally between A and B. From A another switch S3 goes down to ground; from B another switch S4 goes down to ground.

H-bridge: bốn công tắc (S1 -- S4) kết nối động cơ M giữa Vmotor và mass.

Đóng các cặp công tắc khác nhau sẽ quyết định động cơ nhận được điện áp nào ở hai cực:

  • S1 + S4 đóng, S2 + S3 mở. Dòng điện chạy từ Vmotor qua S1, vào A, qua động cơ đến B, và qua S4 xuống mass. Động cơ quay theo một chiều.

  • S2 + S3 đóng, S1 + S4 mở. Dòng điện chạy ngược chiều qua động cơ. Động cơ quay theo chiều ngược lại.

  • Cả bốn mở. Cả hai cực của động cơ đều nổi; động cơ chạy quán tính.

  • S3 + S4 đóng (hoặc S1 + S2 đóng). Cả hai cực của động cơ đều được nối vào cùng một đường ray; năng lượng động năng của chính động cơ tạo ra dòng điện bị cặp đóng tản ra dưới dạng nhiệt. Động cơ hãm.

Tổ hợp không hợp lệ là đóng cả hai công tắc trong cùng một cột -- S1 + S3 hoặc S2 + S4 -- tạo ra đoản mạch trực tiếp từ Vmotor xuống mass. Đây là hiện tượng shoot-through, và code của camera tuyệt đối không được phép để xảy ra.

Trong thực tế, bốn công tắc là các MOSFET (giới thiệu trên trang Dịch chuyển mức điện áp) bên trong một IC driver tích hợp. Chip này cung cấp hai hoặc ba chân logic đầu vào ánh xạ nội bộ đến bốn công tắc, và bao gồm logic khóa liên động ngăn ngừa shoot-through, vì vậy code của camera không cần quản lý trực tiếp.

3.15.2. PWM và điện cảm của động cơ

Điều chỉnh tốc độ của động cơ cần nhiều hơn chỉ bật hoàn toàn và tắt hoàn toàn. Thủ thuật này giống với cách dùng cho LED trong Làm mờ LED bằng PWM: phát xung điều khiển ở tần số cao và để tải tự lấy trung bình kết quả. Với LED, bộ lấy trung bình là mắt người; với động cơ, đó chính là cuộn dây.

Cuộn dây động cơ có điện cảm đáng kể. Dòng điện qua một cuộn cảm không thể thay đổi tức thời; nó thay đổi với tốc độ tỷ lệ với điện áp đặt vào. Phát xung bridge bật và tắt ở 20 kHz làm tăng dòng cuộn dây trong mỗi pha bật, và trong pha tắt dòng điện phải tiếp tục chạy -- cuộn dây tự đảo ngược điện áp để duy trì dòng.

Nếu không có đường thoát, dòng điện đó sẽ tạo ra đột biến điện áp qua công tắc vừa mở và có thể làm hỏng transistor. Diode freewheeling mắc song song với mỗi công tắc -- thường chỉ là diode body của chính MOSFET bên trong chip driver -- cung cấp đường dẫn cần thiết cho dòng điện. Dòng chạy qua diode và trở lại qua một trong các công tắc đang đóng, tạo thành vòng freewheel trong đó dòng điện giảm dần qua các điện trở nhỏ của bridge và chính động cơ. Diode cũng kẹp điện áp qua công tắc vừa mở trong phạm vi một bước diode so với đường ray mà vòng trở về, hoàn toàn nằm trong vùng hoạt động an toàn của MOSFET.

Giá trị trung bình của dòng điện qua mỗi chu kỳ PWM là thứ tạo ra mô-men xoắn, và giá trị trung bình đó tỷ lệ tuyến tính với chu kỳ nhiệm vụ -- tăng gấp đôi duty cycle thì mô-men xoắn cũng tăng gấp đôi, và ở tải không đổi tốc độ cũng tăng gấp đôi. Không giống như làm mờ LED, nơi mắt người phản ứng phi tuyến đòi hỏi phải dùng đường cong, quét tuyến tính duty_u16 đã tương ứng trực tiếp với quét tuyến tính của lực động cơ.

Tần số PWM chỉ cần vượt qua hai ngưỡng:

  • Trên ~20 kHz, sóng mang nằm ngoài dải nghe của người. Dưới mức đó, lực từ trường lên cuộn dây tăng giảm theo từng xung PWM và các cuộn dây cùng lõi thép rung động vật lý ở tần số sóng mang -- động cơ thực sự trở thành một loa nhỏ phát âm thanh ở tần số PWM.

  • Vượt quá ~50 kHz, các MOSFET và driver gate bắt đầu mất hiệu suất do tổn thất chuyển mạch. Trong mỗi chuyển tiếp bật-tắt, MOSFET tạm thời chịu cả điện áp và dòng điện đáng kể, tản ra một lượng nhiệt nhỏ; điện dung gate của MOSFET cũng phải được nạp và xả mỗi chu kỳ, chi phí này do chip driver gánh chịu. Cả hai chi phí đều tỷ lệ với tần số PWM, nên ở tốc độ cao, nhiệt từ chuyển mạch có thể sánh ngang với nhiệt từ việc dẫn dòng điện động cơ.

20 kHz là giá trị mặc định thoải mái cho các động cơ cỡ hobby.

3.15.3. Điều khiển H-bridge

Một chip driver H-bridge hai đầu vào ánh xạ IN1IN2 đến bốn công tắc xấp xỉ như sau:

  • IN1 = 0, IN2 = 0 -- chạy quán tính (cả bốn công tắc mở).

  • IN1 = 1, IN2 = 0 -- chạy theo một chiều.

  • IN1 = 0, IN2 = 1 -- chạy theo chiều ngược lại.

  • IN1 = 1, IN2 = 1 -- hãm.

Điều khiển hai đầu vào như các ngõ ra PWM cho phép camera chọn chiều bằng cách chọn chân nào trong hai chân mang duty cycle, và tốc độ bằng chính giá trị duty cycle:

import time
from machine import PWM, Pin

in1 = PWM(Pin("P7"), freq=20_000, duty_u16=0)
in2 = PWM(Pin("P8"), freq=20_000, duty_u16=0)

def drive_a(speed):       # speed: 0..65535
    in1.duty_u16(speed)
    in2.duty_u16(0)

def drive_b(speed):
    in1.duty_u16(0)
    in2.duty_u16(speed)

def coast():
    in1.duty_u16(0)
    in2.duty_u16(0)

def brake():
    in1.duty_u16(65535)
    in2.duty_u16(65535)

drive_a(32768)    # half speed in direction A
time.sleep(2)
drive_b(16384)    # quarter speed in direction B
time.sleep(2)
coast()

Một ramping từ tắt đến toàn phần và trở lại tạo ra khởi động và dừng mượt mà:

for d in range(0, 65535, 256):
    in1.duty_u16(d)
    time.sleep_ms(10)
for d in range(65535, 0, -256):
    in1.duty_u16(d)
    time.sleep_ms(10)

3.15.4. Driver điều khiển hướng và tốc độ

Một họ chip H-bridge khác cung cấp giao diện thuận tiện hơn: một đầu vào hướng kỹ thuật số (thường được ghi nhãn DIR hoặc PH cho "phase") cộng với một đầu vào tốc độ (thường là PWM hoặc EN cho "enable"). Chân hướng chọn cách bridge điều khiển; duty cycle trên chân tốc độ đặt dòng điện trung bình.

Đây dễ điều khiển từ phần mềm hơn so với sơ đồ hai đầu vào PWM. Hai tín hiệu khớp với cách bài toán thường được đặt ra -- "quay theo hướng này, ở tốc độ này" -- nên code có thể viết set_direction(forward); set_speed(50) thay vì phân nhánh giữa in1in2. Chỉ cần một kênh PWM, giải phóng kênh còn lại trên cùng timer cho công việc khác. Và chân hướng có thể giữ nguyên giữa các lần thay đổi mà không kích hoạt lại bridge, vì vậy thay đổi tốc độ ở hướng cố định chỉ cần chạm vào một thanh ghi.

import time
from machine import PWM, Pin

dir_pin = Pin("P8", Pin.OUT)
speed = PWM(Pin("P7"), freq=20_000, duty_u16=0)

def drive(direction, speed_u16):
    dir_pin.value(direction)         # 0 or 1
    speed.duty_u16(speed_u16)        # 0..65535

drive(0, 32768)     # direction A at half speed
time.sleep(2)
drive(1, 16384)     # direction B at quarter speed
time.sleep(2)
speed.duty_u16(0)   # stop

"Dừng" thực sự làm gì trên loại driver này -- chạy quán tính hay hãm -- phụ thuộc vào chip. Với driver hai đầu vào, code của camera chọn (cả hai đầu vào thấp để chạy quán tính, cả hai cao để hãm); với driver hướng-và-tốc-độ, chip tự quyết định, vì vậy nên xem qua datasheet trước khi phụ thuộc vào hành vi nào.