Atlas Robotics
Điều khiển động cơCơ bản

DC Motor là gì? Vì sao MCU không thể điều khiển trực tiếp

Atlasbot · 16/8/2026 · 11 phút đọc

DC Motor là gì? Vì sao MCU không thể điều khiển trực tiếp
Vì sao cần H-bridge thay vì nối thẳng động cơ vào MCU

Động cơ DC (DC motor) là loại động cơ điện đơn giản và rẻ nhất — cấp điện một chiều là quay, đảo cực tính là đảo chiều quay. Đây thường là lựa chọn đầu tiên khi làm bánh xe cho một robot di động. Nhưng có một hiểu lầm rất phổ biến ở người mới: nghĩ rằng có thể nối động cơ thẳng vào chân GPIO của vi điều khiển giống như nối một chiếc LED.

Khái niệm chính

Bên trong một động cơ DC có cuộn dây và nam châm — khi dòng điện chạy qua cuộn dây, nó tạo ra từ trường tương tác với nam châm, sinh ra lực làm trục quay. Muốn quay nhanh hơn, cần dòng điện hoặc điện áp lớn hơn; muốn đảo chiều, cần đảo chiều dòng điện.

Vấn đề là một chân GPIO của MCU chỉ cung cấp được vài chục miliampe (mA), trong khi một động cơ DC nhỏ đã cần vài trăm mA tới vài ampe khi khởi động hoặc có tải — nối trực tiếp gần như chắc chắn sẽ làm hỏng chân GPIO hoặc cả chip.

H-bridge — mạch cầu H giải quyết cả hai vấn đề

Một mạch driver động cơ (thường dùng cấu hình H-bridge, gồm 4 transistor/MOSFET xếp hình chữ H quanh động cơ) đứng giữa MCU và động cơ, giải quyết đồng thời hai việc:

  • Khuếch đại dòng điện — MCU chỉ cần gửi tín hiệu điều khiển dòng nhỏ, H-bridge cấp dòng lớn thực tế cho động cơ từ một nguồn riêng
  • Đảo chiều quay — bằng cách bật cặp transistor chéo nhau trong hình chữ H, dòng điện qua động cơ đảo chiều mà MCU không cần đảo cực nguồn

Tóm lại: MCU không bao giờ "chạy" động cơ trực tiếp — nó chỉ gửi tín hiệu điều khiển (mức logic + PWM) tới driver, driver mới là thứ thực sự cấp dòng lớn cho động cơ từ nguồn riêng.

Nguyên lý hoạt động

MCU (tín hiệu điều khiển, dòng nhỏ)
   │  IN1, IN2, PWM
   ▼
H-Bridge Driver (VD: L298N, TB6612)  ◄── Nguồn động cơ riêng (VD: 12V)
   │  dòng lớn, có thể đảo chiều
   ▼
Động cơ DC quay

Tốc độ quay được điều khiển bằng PWM (Pulse Width Modulation) — thay vì cấp điện áp cố định, MCU bật/tắt tín hiệu điều khiển rất nhanh (hàng nghìn lần/giây), tỷ lệ thời gian "bật" trên tổng chu kỳ (duty cycle) quyết định điện áp trung bình thực tế đặt lên động cơ:

// Duty cycle 75% → tốc độ khoảng 75% tốc độ tối đa
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 750); // thang 0-1000
HAL_GPIO_WritePin(IN1_Port, IN1_Pin, GPIO_PIN_SET);   // Chiều quay thuận
HAL_GPIO_WritePin(IN2_Port, IN2_Pin, GPIO_PIN_RESET);

Kiến thức kỹ thuật

Công thức

Điện áp trung bình đặt lên động cơ tỷ lệ thuận với duty cycle — công thức nền tảng cho mọi phép điều khiển tốc độ bằng PWM:

V(trung bình) = duty cycle (%) × V(nguồn)

VD: nguồn 12V, duty cycle 75%
V(trung bình) ≈ 0.75 × 12V = 9V

Một con số quan trọng khác là dòng khởi động/kẹt trục (stall current) — khi động cơ bị chặn không quay được (VD: robot đâm vào vật cản), chỉ còn điện trở cuộn dây (rất nhỏ) cản dòng, khiến dòng tăng vọt so với lúc chạy bình thường:

I(stall) = V(nguồn) / R(cuộn dây)

VD: nguồn 12V, điện trở cuộn dây động cơ nhỏ = 6Ω
I(stall) = 12V / 6Ω = 2A  (cao hơn nhiều so với dòng chạy không tải ~100-200mA)

Thông số

Dòng điện động cơ DC nhỏ thay đổi rất lớn tuỳ trạng thái vận hành — driver phải chọn theo dòng kẹt trục (trường hợp xấu nhất), không phải dòng chạy bình thường:

Trạng tháiDòng điện điển hình (động cơ giảm tốc nhỏ)
Không tải (quay tự do)~60 – 200mA
Tải bình thường~300mA – 1A
Kẹt trục (stall)1.5 – 3A trở lên

Driver phổ biến: L298N chịu tối đa ~2A/kênh (thường thực tế nên dùng dưới mức này do toả nhiệt); TB6612 hiệu suất cao hơn, ~1.2A liên tục/kênh, đỉnh ngắn hạn tới ~3.2A.

Register / Bit / Byte

Duty cycle PWM trên STM32 được xác định bởi 2 thanh ghi timer: ARR (Auto-Reload Register — quyết định chu kỳ/tần số PWM) và CCR (Capture/Compare Register — quyết định độ rộng xung, chính là phần "bật"):

Duty cycle (%) = (CCR / ARR) × 100%

VD: ARR = 1000, CCR = 750
Duty cycle = 750 / 1000 × 100% = 75%

Dòng lệnh __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 750) ở phần Nguyên lý hoạt động thực chất chỉ ghi giá trị 750 vào thanh ghi CCR — timer phần cứng tự động tạo xung PWM đúng tỷ lệ mà không cần CPU can thiệp liên tục.

Ứng dụng thực tế

Robot di động 2 bánh (differential drive) dùng 2 động cơ DC, mỗi động cơ 1 kênh H-bridge riêng — điều khiển độc lập tốc độ và chiều mỗi bánh cho phép robot đi thẳng, rẽ, hoặc xoay tại chỗ chỉ bằng cách phối hợp duty cycle 2 bên. Nhiều driver hiện đại còn có chân đọc dòng điện (current sense) — theo dõi dòng tăng đột ngột bất thường (gần giá trị stall current đã tính ở trên) là một cách phát hiện robot bị kẹt/va chạm vật cản mà không cần thêm cảm biến va chạm riêng, dù độ tin cậy thấp hơn cảm biến chuyên dụng.

Ví dụ thực tế

#include <stdio.h>

int main() {
    float v_nguon = 12.0;
    float duty[] = {0.25, 0.50, 0.75, 1.00};

    for (int i = 0; i < 4; i++) {
        float v_tb = duty[i] * v_nguon;
        printf("Duty %.0f%% -> V trung binh = %.2fV\n", duty[i]*100, v_tb);
    }
    return 0;
}
Output:
Duty 25% -> V trung binh = 3.00V
Duty 50% -> V trung binh = 6.00V
Duty 75% -> V trung binh = 9.00V
Duty 100% -> V trung binh = 12.00V

Kết quả tăng tuyến tính theo duty cycle đúng như công thức đã nêu — đây là cơ sở để tính ngược: nếu cần một tốc độ động cơ tương ứng khoảng điện áp cụ thể, có thể ước lượng duty cycle cần đặt (dù thực tế còn phụ thuộc tải, không hoàn toàn tuyến tính tuyệt đối).

Lỗi thường gặp

  • Không tính tới dòng kẹt trục khi chọn driver — chỉ nhìn dòng chạy bình thường (vài trăm mA) rồi chọn driver sát ngưỡng đó, tới khi robot va chạm vật cản dòng tăng vọt lên mức stall current có thể làm cháy driver — luôn chọn driver có dòng định mức dư so với stall current, không chỉ dòng vận hành bình thường.
  • Đặt cả 2 chân IN1/IN2 cùng mức cao — đây là trạng thái không hợp lệ với nhiều loại H-bridge (một số driver hiểu là "phanh" động cơ, số khác có thể gây đoản mạch nội bộ) — luôn tra đúng bảng trạng thái IN1/IN2 trong datasheet của driver cụ thể đang dùng.
  • Nguồn cấp cho driver không đủ dòng lúc động cơ khởi động — dòng khởi động cao hơn nhiều dòng chạy ổn định (gần giá trị stall current trong khoảnh khắc đầu) có thể làm sụt áp toàn hệ thống nếu nguồn không đủ dư, gây robot tự khởi động lại (brownout) đúng lúc bắt đầu di chuyển.
  • Quên diode bảo vệ khi tự làm mạch driver rời — như đã nói ở bài Diode, cuộn dây động cơ tạo xung điện áp ngược khi ngắt dòng đột ngột, có thể phá huỷ transistor/MOSFET trong H-bridge nếu không có bảo vệ (hầu hết module H-bridge bán sẵn đã tích hợp sẵn).

Kết luận

Động cơ DC đơn giản về nguyên lý nhưng đòi hỏi driver H-bridge đúng cách để điều khiển an toàn — hiểu rõ mối quan hệ duty cycle/điện áp trung bình và luôn tính tới dòng kẹt trục khi chọn driver là kiến thức nền tảng trước khi ráp bất kỳ robot bánh xe nào. Bài tiếp theo trong chuyên mục nói về Encoder — cảm biến đo tốc độ/vị trí thực tế của trục động cơ, bước bắt buộc để chuyển từ điều khiển "mù" (open-loop) sang điều khiển có phản hồi chính xác.

DC Motor là gì? Vì sao MCU không thể điều khiển trực tiếp — Atlasbot