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

Servo Motor là gì? Động cơ đã 'tự lo' vòng điều khiển vị trí

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

Servo Motor là gì? Động cơ đã 'tự lo' vòng điều khiển vị trí
Bên trong servo đã có sẵn động cơ + cảm biến + mạch điều khiển

Động cơ DC thường cần thêm driver (H-bridge) và encoder rời nếu muốn điều khiển vị trí chính xác. Servo motor (thường gọi tắt là "servo", loại phổ biến trong mô hình RC) giải quyết gọn cả hai việc đó ngay bên trong vỏ động cơ — chỉ cần một dây tín hiệu duy nhất để ra lệnh "quay tới góc này".

Khái niệm chính

Một servo hobby tiêu chuẩn có 3 dây: nguồn (+), GND (-), và tín hiệu điều khiển. Bên trong vỏ nhựa nhỏ gọn đã tích hợp sẵn: một động cơ DC nhỏ, bộ bánh răng giảm tốc, một chiết áp (potentiometer) đo góc quay trục hiện tại, và một mạch điều khiển nhỏ tự so sánh góc mong muốn với góc đo được rồi tự chỉnh động cơ — nói cách khác, vòng điều khiển vị trí đã nằm sẵn bên trong servo, MCU không cần tự làm việc đó.

Điều khiển bằng độ rộng xung PWM

Servo hobby tiêu chuẩn nhận lệnh qua độ rộng của một xung PWM lặp lại mỗi 20ms:

Độ rộng xungGóc quay
1.0 ms0°
1.5 ms90° (giữa)
2.0 ms180°

Servo loại thường chỉ quay trong phạm vi giới hạn (thường 0°-180°), khác với continuous rotation servo (servo quay liên tục) — biến thể đã tháo bỏ giới hạn cơ khí, dùng độ rộng xung để điều khiển tốc độ và chiều quay thay vì góc, hoạt động giống động cơ DC có sẵn driver hơn là servo vị trí thông thường.

Tóm lại: Servo = động cơ + encoder (chiết áp) + driver + vòng điều khiển vị trí, đóng gói sẵn trong một khối — đổi lại sự tiện lợi (chỉ 1 dây tín hiệu) để lấy giới hạn về công suất và độ chính xác so với việc tự ráp DC motor + encoder + PID.

Nguyên lý hoạt động

MCU tạo xung PWM (chu kỳ 20ms, độ rộng 1-2ms)
        ↓
Mạch điều khiển bên trong servo đọc độ rộng xung
        ↓
So sánh với góc hiện tại (đọc từ chiết áp nội bộ)
        ↓
Tự động chỉnh động cơ nội bộ quay tới đúng góc yêu cầu

Tạo tín hiệu điều khiển servo bằng thư viện Arduino:

#include <Servo.h>

Servo myServo;

void setup() {
  myServo.attach(9);   // Chân tín hiệu
}

void loop() {
  myServo.write(90);   // Ra lệnh quay tới góc 90° — thư viện tự tạo đúng xung PWM
}

Kiến thức kỹ thuật

Công thức

Quan hệ giữa góc mong muốn và độ rộng xung là tuyến tính trong khoảng 1.0-2.0ms tương ứng 0°-180°:

Độ rộng xung (ms) = 1.0 + (góc / 180) × 1.0

VD: góc = 45°
Độ rộng xung = 1.0 + (45/180) × 1.0 = 1.25ms

Thư viện Servo của Arduino tự thực hiện phép tính này bên trong hàm write() — người dùng chỉ cần nghĩ bằng đơn vị độ, không cần tự tính độ rộng xung bằng micro-giây.

Thông số

Lực kéo (torque) và tốc độ phản ứng khác nhau nhiều lần tuỳ kích cỡ servo — chọn sai loại cho tải thực tế là nguyên nhân phổ biến khiến servo "yếu, không đủ lực":

Loại servoTorque điển hìnhĐiện áp hoạt động
Micro servo (VD: SG90)~1.8 kg·cm4.8 – 6V
Servo cỡ tiêu chuẩn (VD: MG996R)~10 kg·cm4.8 – 7.2V
Servo công suất cao (dùng cho cánh tay/chân robot)20 kg·cm trở lênTuỳ loại, thường 6-12V

Register / Bit / Byte

Trên MCU tạo xung servo bằng Timer phần cứng (giống nguyên lý ARR/CCR đã nói ở bài DC Motor), servo đòi hỏi cấu hình chu kỳ Timer chính xác 20ms (tần số 50Hz) — sai lệch chu kỳ dù nhỏ có thể khiến một số servo phản ứng không ổn định hoặc rung nhẹ liên tục dù giá trị góc yêu cầu không đổi.

Protocol

Ngoài PWM analog truyền thống, một số servo cao cấp hơn (VD: dòng Dynamixel dùng trong tay máy/robot hình người) dùng giao thức bus số nối tiếp (thường qua UART half-duplex trên 1 dây) — cho phép nối nhiều servo trên cùng 1 bus (giống ý tưởng địa chỉ hoá của Modbus/CAN đã học), đồng thời đọc ngược được vị trí/dòng điện/nhiệt độ hiện tại của từng servo, điều mà servo PWM analog thông thường không làm được.

Ứng dụng thực tế

Servo thường dùng cho cơ cấu pan-tilt (xoay ngang-dọc) gắn camera hoặc cảm biến khoảng cách trên AMR — cho phép robot "quét" khu vực xung quanh mà không cần xoay toàn bộ thân robot, hoặc cho cơ cấu lái (steering) trên các robot dạng xe (Ackermann) cần bẻ lái chính xác một góc cụ thể. Với những khớp này, độ chính xác vị trí quan trọng hơn tốc độ/công suất — đúng thế mạnh của servo so với việc tự ráp DC motor + encoder + PID chỉ để giữ 1 góc cố định.

Ví dụ thực tế

#include <stdio.h>

int main() {
    int angles[] = {0, 45, 90, 135, 180};

    for (int i = 0; i < 5; i++) {
        float pulse_ms = 1.0 + ((float)angles[i] / 180.0) * 1.0;
        printf("Goc %3d do -> do rong xung = %.2fms\n", angles[i], pulse_ms);
    }
    return 0;
}
Output:
Goc   0 do -> do rong xung = 1.00ms
Goc  45 do -> do rong xung = 1.25ms
Goc  90 do -> do rong xung = 1.50ms
Goc 135 do -> do rong xung = 1.75ms
Goc 180 do -> do rong xung = 2.00ms

Kết quả khớp đúng bảng tra ở phần Khái niệm chính (1.0ms = 0°, 1.5ms = 90°, 2.0ms = 180°) — xác nhận công thức tuyến tính áp dụng đúng cho toàn dải góc, không chỉ 3 điểm mốc.

Lỗi thường gặp

  • Ra lệnh góc vượt quá giới hạn cơ khí thực tế của servo — dù công thức toán học chấp nhận mọi giá trị 0-180°, một số servo có giới hạn cơ khí hẹp hơn — cố ép servo quay quá giới hạn gây kẹt bánh răng, có thể làm mòn/gãy răng nhựa bên trong.
  • Nguồn không đủ dòng khi nhiều servo cùng hoạt động — mỗi servo có thể kéo dòng đỉnh vài trăm mA đến hơn 1A khi đang chống lại tải hoặc khởi động di chuyển — cấp nguồn từ cùng nguồn 5V yếu với MCU cho nhiều servo cùng lúc dễ gây sụt áp, khiến cả MCU lẫn servo hoạt động bất thường.
  • Dây tín hiệu quá dài không có chống nhiễu — tín hiệu PWM analog (không có cơ chế sửa lỗi như bus số) dễ bị nhiễu trên dây dài, biểu hiện thành servo rung giật nhẹ liên tục dù giá trị góc gửi đi ổn định.
  • Nhầm continuous rotation servo với servo vị trí thông thường — gọi write(90) trên continuous rotation servo không đưa nó về góc 90° mà làm nó dừng quay (vì độ rộng xung giữa được diễn giải là "tốc độ 0"), khác hoàn toàn hành vi mong đợi nếu nhầm 2 loại này.

Kết luận

Servo motor đóng gói sẵn động cơ, cảm biến vị trí, và vòng điều khiển bên trong 1 khối — giải pháp nhanh gọn cho các khớp cần vị trí chính xác với công suất vừa phải, đổi lấy sự tiện lợi so với việc tự ráp hệ thống DC motor + encoder + PID hoàn chỉnh. Bài tiếp theo trong chuyên mục nói về Stepper Motor — cách tiếp cận điều khiển vị trí hoàn toàn khác, không cần cảm biến phản hồi nhưng đòi hỏi driver và cách điều khiển đặc thù riêng.

Servo Motor là gì? Động cơ đã 'tự lo' vòng điều khiển vị trí — Atlasbot