0968140191Miền Nam
0975897066Miền Bắc

Điều khiển động cơ DC servo: vòng dòng – tốc độ – vị trí, PID, encoder và cầu H

Viết bởi: Vũ Hồng Phúc
Vũ Hồng Phúc
Vũ Hồng Phúc, sinh năm 1985, sau khi tốt nghiệp cử nhân tại Đại Học Bách Khoa Hà Nội, Vũ Hồng Phúc đã tự mình khám phá thế giới qua việc du học tại EF Language School London và nhiều trường đại học khác. Tích lũy kinh nghiệm trong nhiều năm, anh quyết định trở về đất nước. Vũ Hồng Phúc đã hướng đến mục tiêu phát triển Dongco3pha.com là thương hiệu "Động cơ điện" hàng đầu Việt Nam. Trong nhiều năm liền danh liên tục mang lại nhiều thành tựu cho doanh nghiệp và đóng góp nhiều giải pháp tối ưu về chế tạo máy, chế tạo động cơ giảm tốc, động cơ điện.
12 thg 10 2026 08:32

Điều khiển động cơ DC servo là cho một motor điện một chiều chạy theo lệnh vị trí, tốc độ hay mô-men với phản hồi liên tục từ cảm biến, thường là encoder. Bộ điều khiển đo sai lệch giữa lệnh và thực tế, tính điện áp cần cấp bằng thuật toán PID rồi đóng cắt cầu H bằng PWM để triệt tiêu sai lệch, hàng nghìn lần mỗi giây. Một motor DC giảm tốc 12V bình thường, gắn thêm encoder và bộ điều khiển đúng cách, đã thành một DC servo đủ dùng cho robot, bàn trượt hay cơ cấu định vị.

Các phần dưới đây đi vào những việc làm được ngay: cấu trúc ba vòng điều khiển, đọc encoder không mất xung, chọn cầu H và tần số PWM, đo dòng, hãm motor, chỉnh Kp Ki Kd, code mẫu Arduino, biến motor giảm tốc thành servo và so sánh DC servo với servo AC, BLDC.

1. Động cơ DC servo là gì và gồm những phần nào?

Động cơ DC servo là một hệ gồm motor DC, cảm biến phản hồi, bộ điều khiển và tầng công suất làm việc trong vòng kín. Cùng một motor, chạy hở thì là motor DC thường; khi tốc độ và vị trí được đo và hiệu chỉnh liên tục thì nó làm việc như servo.

Thành phầnChức năngVí dụ
MotorBiến điện thành mô-menDC chổi than nam châm vĩnh cửu, coreless, BLDC
Cảm biếnĐo vị trí, tốc độ trụcEncoder 2 kênh A-B, biến trở, máy phát tốc (tacho)
Bộ điều khiểnSo lệnh với phản hồi, tính PID, sinh quỹ đạoVi điều khiển, DSP, driver DC servo
Tầng công suấtCấp điện áp hai chiều cho motorCầu H MOSFET, IC cầu H

Servo RC loại SG90 hay MG996R thực chất là một DC servo thu nhỏ: motor DC chổi than, hộp số và biến trở gắn trên trục ra làm cảm biến vị trí. Hình dưới là sơ đồ quen thuộc dùng Arduino và biến trở ra lệnh góc cho servo RC; vòng kín của servo RC nằm sẵn trong vỏ, còn với DC servo tự xây, người làm phải tự viết vòng kín đó.

Sơ đồ Arduino Uno, biến trở và servo RC - dạng DC servo thu nhỏ có phản hồi vị trí bằng biến trở

Motor DC dễ điều khiển servo vì mô-men tỉ lệ dòng (T = Kt × I) và tốc độ gần tỉ lệ điện áp, nên bộ PID đơn giản đã cho kết quả tốt.

2. Ba vòng điều khiển động cơ DC servo: dòng – tốc độ – vị trí

Driver servo chuyên nghiệp xếp ba vòng lồng nhau (cascade): vòng ngoài tạo lệnh cho vòng trong, vòng trong phải nhanh hơn vòng ngoài khoảng 5–10 lần. Nếu vòng tốc độ chậm ngang vòng vị trí, hệ sẽ dao động dù chỉnh PID thế nào.

VòngĐoXuất raTần số cập nhật điển hìnhBộ điều khiển
Dòng (mô-men)Dòng phần ứngĐiện áp/PWM10–20 kHz (công nghiệp), 1–5 kHz (vi điều khiển nhỏ)PI
Tốc độEncoder hoặc tachoLệnh dòng1–5 kHzPI
Vị tríSố xung encoderLệnh tốc độ0,5–2 kHzP hoặc PID, kèm bù trước

a. Vòng dòng điện

Vòng dòng giữ dòng motor bằng giá trị đặt; lợi ích lớn nhất là giới hạn dòng khi kẹt cơ khí hay khởi động đột ngột, bảo vệ motor, cầu H và hộp số. Motor DC có hằng số thời gian điện τ = L/R rất nhỏ (motor 12V điện trở 2 Ω, điện cảm 1 mH có τ = 0,5 ms) nên vòng dòng phải chạy nhanh, thường gắn với từng chu kỳ PWM. Với dự án Arduino, có thể thay bằng giới hạn dòng mềm: đo dòng, vượt ngưỡng thì giảm PWM.

b. Vòng tốc độ

Vòng tốc độ dùng cho băng tải, bánh xe robot, trục cần tốc độ ổn định khi tải đổi; khâu I bù tải bằng cách tăng PWM tới khi tốc độ về đúng. Điểm hay bị bỏ qua là cách tính tốc độ từ encoder:

  • Phương pháp M (đếm xung trong thời gian cố định): chính xác ở tốc độ cao, thô ở tốc độ thấp.
  • Phương pháp T (đo thời gian giữa hai xung): chính xác ở tốc độ thấp, nhiễu ở tốc độ cao.

Ví dụ encoder trục ra 1.320 đếm/vòng, lấy mẫu 1 ms: độ phân giải tốc độ chỉ khoảng 45 vòng/phút, tốc độ đo nhảy bậc mạnh. Đo trên cửa sổ 10 ms (độ phân giải khoảng 4,5 vòng/phút), lọc thông thấp hoặc dùng phương pháp T khi chạy chậm sẽ khắc phục được.

c. Vòng vị trí

Vòng vị trí đưa trục tới đúng số đếm đích. Khi có vòng tốc độ bên trong, nó thường chỉ cần khâu P cộng bù trước tốc độ; hệ đơn giản trên Arduino thì một bộ PID vị trí xuất thẳng PWM là đủ. Lệnh vị trí không nên nhảy bậc từ 0 lên 10.000 xung một lần: bộ sinh quỹ đạo hình thang (tăng tốc đều, chạy đều, giảm tốc đều) cho mỗi chu kỳ một đích nhỏ, giúp motor bám sát, không quá dòng, không vọt lố.

3. Đọc encoder quadrature cho DC servo

Encoder tương đối hai kênh A, B lệch pha 90° điện là cảm biến phổ biến nhất của DC servo: thứ tự sườn giữa A và B cho biết chiều quay, số sườn cho biết quãng đường.

Kiểu giải mãĐếm sườnSố đếm/vòng với encoder 500 xungSố ngắt cần
x1Sườn lên kênh A5001
x2Sườn lên và xuống kênh A1.0001 (kiểu CHANGE)
x4Mọi sườn của A và B2.0002

Tem encoder thường ghi PPR (xung mỗi vòng trên một kênh), còn driver hay ghi CPR là số đếm sau x4. Nhầm hai con số này làm tính bánh răng điện tử sai đúng 4 lần. Encoder Hall sau motor giảm tốc loại JGB37-520 hay GA25-370 thường có 11 xung/vòng trục motor; với hộp số tỉ số 30, độ phân giải trục ra là 11 × 4 × 30 = 1.320 đếm/vòng, khoảng 0,27°/đếm.

Bảng trạng thái chống đếm sai

Cách đọc đúng là ghép A, B thành trạng thái 0–3 rồi tra bảng chuyển. Một chiều đi theo chuỗi 00 → 01 → 11 → 10 → 00, chiều kia theo chuỗi đảo. Chuyển nhảy cóc (00 → 11) là dấu hiệu mất xung; bảng gán 0 cho trường hợp đó thay vì đếm sai chiều.

Giới hạn tốc độ đếm

Tần số sườn = vòng/phút trục motor × PPR × 4 / 60. Motor 10.000 vòng/phút, encoder 11 xung cho khoảng 7.300 sườn/giây, Arduino Uno đếm bằng ngắt thoải mái. Encoder quang 500 xung trên motor 3.000 vòng/phút cho 100.000 sườn/giây, vi điều khiển 8 bit 16 MHz sẽ bắt đầu mất xung. Khi đó dùng bộ đếm phần cứng: timer chế độ encoder của STM32, khối PCNT của ESP32 (thư viện ESP32Encoder) hoặc IC giải mã LS7366R qua SPI.

Hai lỗi phần mềm hay gặp: quên khai báo biến đếm volatile, và đọc biến 32 bit trên vi điều khiển 8 bit mà không tạm khóa ngắt, khiến giá trị thỉnh thoảng sai hàng nghìn đếm và motor giật không rõ lý do.

Chống nhiễu

Dây encoder đi sát dây motor nhận nhiễu từ PWM và tia lửa chổi than. Dùng cáp có lưới chống nhiễu, đi tách dây động lực, thêm tụ 1–10 nF từ A, B xuống GND với encoder Hall tốc độ thấp, và dùng encoder ngõ ra vi sai khi dây dài trên 1–2 m.

4. Cầu H và tần số PWM cho DC servo

Cầu H gồm bốn khóa cho phép đảo chiều điện áp trên motor; PWM chỉnh điện áp trung bình theo độ rộng xung.

Cầu HĐiện ápDòngPWM tối đaĐặc điểm
VNH50195,5–24 V12 A liên tục, đỉnh 30 A20 kHzNgõ đo dòng khoảng 0,14 V/A, nhận logic 3,3 V
BTS7960 (module IBT-2)5,5–27 VGiới hạn dòng khoảng 30–40 A25 kHzChân IS đo dòng, tự ngắt quá nhiệt
MOSFET rời + IC driver cổngĐến 48–60 V tùy linh kiệnHàng chục ampe20–40 kHzPhải tự thiết kế thời gian chết, bảo vệ
Driver DC servo đóng gói18–80 V tùy loạiĐỉnh đến 20 ATối ưu sẵnCó đủ ba vòng, nhận xung/hướng

Điện áp nguồn cần chừa biên với ngưỡng ngắt quá áp: VNH5019 có thể ngắt từ khoảng 24 V, nên tránh dùng ắc quy 24 V sạc đầy.

Vì sao PWM phải 16–20 kHz

Arduino Uno mặc định xuất PWM khoảng 490 Hz (chân 3, 9, 10, 11) và 980 Hz (chân 5, 6). Ở tần số này motor rít, dòng dao động mạnh trong từng chu kỳ, mô-men gợn và motor nóng hơn. Độ gợn dòng của cầu H điều chế đơn cực, lớn nhất ở độ rộng xung 50%, xấp xỉ ΔI ≈ U / (4 × L × f). Với motor 12 V, 1 mH:

  • Ở 20 kHz: ΔI ≈ 12 / (4 × 0,001 × 20.000) = 0,15 A, dòng gần như phẳng.
  • Ở 490 Hz: chu kỳ PWM 2 ms dài gấp 4 lần hằng số thời gian 0,5 ms, dòng gần như bật tắt hoàn toàn mỗi xung; motor kêu, rung, mô-men trung bình thấp hơn tính toán.

Dải 16–20 kHz nằm ở ngưỡng tai người khó nghe. Tăng cao hơn nữa chỉ làm tăng tổn hao đóng cắt; ngoại lệ là motor coreless điện cảm rất thấp, thường cần 30–50 kHz hoặc thêm cuộn cảm nối tiếp.

Kiểu điều chế

  • Dấu – độ lớn: một chân quyết định chiều, một chân PWM. Gợn dòng nhỏ, hiệu suất cao, phổ biến với BTS7960, VNH5019.
  • Ngược pha (locked anti-phase): một chân PWM, 50% là đứng yên. Chuyển chiều trơn quanh điểm 0, hợp vòng vị trí, nhưng gợn dòng lớn hơn và vẫn tốn dòng khi đứng yên.

Module PCA9685 không hợp với DC servo

Module PCA9685 rất tiện cấp xung cho nhiều servo RC từ Arduino Mega như sơ đồ dưới, nhưng tần số PWM tối đa chỉ khoảng 1,5 kHz. Dùng nó cấp PWM cho cầu H của DC servo sẽ gặp đúng vấn đề rít và gợn dòng ở trên, cộng thêm độ trễ cập nhật qua I2C.

Arduino Mega điều khiển servo RC qua hai module PCA9685 - không phù hợp cấp PWM cho cầu H động cơ DC servo

5. Đo dòng điện trong mạch DC servo

Đo dòng phục vụ vòng dòng, bảo vệ kẹt motor và phát hiện va chạm (dòng tăng vọt khi cơ cấu chạm vật cản).

  • Chân đo dòng của cầu H: không cần thêm linh kiện, nhưng thường chỉ đo khi khóa phía trên dẫn; lúc xả hoặc hãm đọc gần 0.
  • Shunt và khuếch đại (INA240, INA181): chính xác, đo hai chiều; INA240 chịu được điện áp chung nhảy theo PWM.
  • Cảm biến Hall (ACS712, ACS723): cách ly mạch công suất nhưng kém nhạy với dòng nhỏ.

Chân IS của BTS7960 cấp ra dòng bằng dòng tải chia hệ số danh định khoảng 8.500. Với điện trở 1 kΩ xuống GND: U(IS) ≈ I / 8.500 × 1.000 ≈ 0,118 V/A, tức 10 A cho khoảng 1,18 V và ADC 5 V đầy thang ở khoảng 42 A. Khi IC báo lỗi, chân IS bị kéo lên mức cố định không liên quan dòng tải, nên giá trị vọt cao bất thường cũng là tín hiệu lỗi. Hệ số này chênh giữa các IC, cần hiệu chuẩn bằng ampe kìm DC nếu muốn chính xác. Dòng PWM là dòng xung, nên lấy mẫu ADC đồng bộ giữa chu kỳ PWM hoặc lọc RC (1 kΩ, 1 µF) trước ADC.

6. Hãm động năng, hãm tái sinh và năng lượng trả về nguồn

Cầu H có ba cách dừng motor:

  • Thả trôi: mở cả bốn khóa, motor quay theo quán tính, vị trí dừng không xác định.
  • Hãm động năng: đóng hai khóa phía dưới, back-EMF tạo dòng ngược và chính motor sinh lực hãm; năng lượng thành nhiệt trong cuộn dây và MOSFET.
  • Hãm tái sinh: cầu H tiếp tục điều chế để motor làm máy phát, đẩy năng lượng về nguồn. Điều này tự xảy ra khi vòng tốc độ ra lệnh giảm tốc nhanh.

Với nguồn xung không nhận dòng ngược, năng lượng dồn vào tụ lọc và điện áp DC tăng: E = ½ × J × ω². Ví dụ quán tính quy về trục motor J = 0,0002 kg·m² chạy 3.000 vòng/phút (ω ≈ 314 rad/s) có E ≈ 9,9 J; nếu dồn hết vào tụ 1.000 µF ở 24 V, theo U = √(U² + 2E/C), điện áp có thể vượt 140 V. Thực tế một phần tiêu tán trong cuộn dây, nhưng rủi ro quá áp với tải quán tính lớn là có thật.

Cách xử lý: giới hạn gia tốc hãm trong quỹ đạo, tăng tụ DC bus lên vài nghìn µF, thêm mạch xả (MOSFET đóng điện trở công suất khi bus vượt ngưỡng, ví dụ 28 V cho hệ 24 V), hoặc dùng ắc quy làm đệm.

Hãm điện chỉ là hãm động. Trục mang tải đứng cần phanh cơ khí để giữ khi mất điện; cơ cấu dạng này nên chọn động cơ giảm tốc có phanh.

7. PID cho DC servo và cách chỉnh Kp, Ki, Kd thực tế

Bộ PID tính lệnh ra từ sai lệch e = đích − thực tế: u = Kp × e + Ki × ∑e × Δt + Kd × Δe / Δt.

  • Kp: càng lớn càng cứng, phản ứng nhanh; quá lớn thì dao động.
  • Ki: triệt tiêu sai lệch còn lại do ma sát, trọng lực; quá lớn thì vọt lố, dao động chậm.
  • Kd: giảm chấn khi tiến tới đích; quá lớn thì khuếch đại nhiễu encoder, motor rè rè.

Bốn chi tiết làm PID chạy được ngoài đời thực

  • Chu kỳ lấy mẫu cố định: chạy PID theo nhịp đều (ví dụ 1 ms) bằng ngắt timer hoặc micros(). Ki, Kd gắn với chu kỳ lấy mẫu; đổi chu kỳ thì phải chỉnh lại.
  • Chống bão hòa tích phân: khi motor kẹt hoặc PWM đã 100%, khâu I vẫn cộng dồn, hết kẹt là vọt lố mạnh. Kẹp giới hạn tích phân và ngừng tích phân khi lệnh ra bão hòa.
  • Vi phân theo phép đo: đổi đích đột ngột làm Δe nhảy lớn, khâu D bắn xung lệnh cực đại. Tính D theo độ biến thiên vị trí đo được (đổi dấu) để tránh giật.
  • Vùng chết ma sát: motor giảm tốc thường không nhúc nhích khi PWM dưới 10–20%. Gần đích lệnh PID nằm trong vùng này, motor dừng cách đích vài đếm. Cộng PWM tối thiểu theo dấu lệnh và chấp nhận vùng dừng ±1–2 đếm.

Quy trình chỉnh PID vị trí

1) Kẹp chặt cơ cấu, giới hạn PWM tối đa 30–50% trong lúc chỉnh.

2) Kiểm tra chiều phản hồi: Ki = Kd = 0, Kp nhỏ, ra lệnh +100 đếm. Motor phải tiến về +100; nếu quay vọt không dừng, chiều encoder ngược chiều motor (phản hồi dương), đảo hai dây motor hoặc đảo A–B trong code.

3) Tăng Kp tới khi motor bắt đầu dao động quanh đích; ghi giá trị Ku và chu kỳ dao động Tu.

4) Hạ Kp còn 50–60% Ku.

5) Tăng Kd tới khi vọt lố gần hết; motor rè hoặc nóng khi đứng yên thì giảm Kd hoặc lọc tốc độ đo.

6) Thêm Ki nhỏ để đẩy nốt sai lệch cuối, tăng tới khi thấy vọt lố chậm thì lùi lại.

7) Thử với tải thật, quãng ngắn và dài, rồi nới giới hạn PWM về 100%.

Điểm xuất phát theo Ziegler–Nichols từ Ku, Tu:

Bộ điều khiểnKpKiKd
P0,5 × Ku00
PI0,45 × Ku0,54 × Ku / Tu0
PID0,6 × Ku1,2 × Ku / Tu0,075 × Ku × Tu

Bộ số này cho đáp ứng khá gắt; cơ cấu định vị thường phải giảm Kp, Ki thêm 20–40%. Hệ chạy tốt khi không tải nhưng dao động khi có tải là do quán tính tải lớn: chỉnh lại với tải thật và giảm gia tốc.

8. Code mẫu điều khiển vị trí động cơ DC servo bằng Arduino

Code dùng Arduino Uno, encoder nối chân 2 và 3 (hai chân ngắt ngoài), module BTS7960 với RPWM ở chân 9, LPWM ở chân 10, R_EN và L_EN nối 5V. Timer1 được đặt PWM 20 kHz (phase-correct, TOP = 400), độ phân giải 400 bước. Đích (số đếm) nhập qua Serial Monitor; PID chạy đều 1 ms, đích được tiến dần để motor tăng tốc mềm.

// DC servo vi tri: Arduino Uno + encoder x4 + BTS7960, PWM 20 kHz
const int PWM_TOP = 400;               // 16 MHz / (2 * 400) = 20 kHz
volatile long encCount = 0;
volatile uint8_t encState = 0;
// chi so = (trang thai cu << 2) | trang thai moi
const int8_t QDEC[16] = {0,-1,1,0, 1,0,0,-1, -1,0,0,1, 0,1,-1,0};

float Kp = 0.8, Ki = 0.5, Kd = 0.02;   // diem xuat phat, phai chinh lai
const float DT = 0.001;                // chu ky PID 1 ms
const int PWM_MIN = 40;                // bu ma sat tinh
const long DEAD_BAND = 2;              // vung dung +-2 dem
const float MAX_STEP = 3.0;            // dem/ms: toc do tien dich

long targetFinal = 0, lastPos = 0;
float targetNow = 0, integ = 0;
unsigned long lastMicros;

void encISR() {
  uint8_t s = (PIND >> 2) & 0x03;      // doc chan 2 (A) va 3 (B) cung luc
  encCount += QDEC[(encState << 2) | s];
  encState = s;
}

long readEncoder() {
  noInterrupts();
  long c = encCount;
  interrupts();
  return c;
}

void setMotor(int u) {                 // u: -PWM_TOP .. +PWM_TOP
  u = constrain(u, -PWM_TOP, PWM_TOP);
  if (u >= 0) { OCR1B = 0; OCR1A = u; }
  else        { OCR1A = 0; OCR1B = -u; }
}

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(20);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  encState = (PIND >> 2) & 0x03;
  attachInterrupt(digitalPinToInterrupt(2), encISR, CHANGE);
  attachInterrupt(digitalPinToInterrupt(3), encISR, CHANGE);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11);
  TCCR1B = _BV(WGM13) | _BV(CS10);     // phase-correct, TOP = ICR1, chia 1
  ICR1 = PWM_TOP;
  OCR1A = 0;
  OCR1B = 0;
  lastMicros = micros();
}

void loop() {
  if (Serial.available()) {
    targetFinal = Serial.parseInt();
    while (Serial.available()) Serial.read();
  }
  if (micros() - lastMicros < 1000) return;
  lastMicros += 1000;

  targetNow += constrain(targetFinal - targetNow, -MAX_STEP, MAX_STEP);
  long pos = readEncoder();
  float err = targetNow - pos;
  float dMeas = (pos - lastPos) / DT;  // vi phan theo phep do
  lastPos = pos;

  float u = Kp * err - Kd * dMeas + Ki * integ;
  if (fabs(u) < PWM_TOP) {             // chong bao hoa tich phan
    integ = constrain(integ + err * DT, -300.0, 300.0);
  }

  int out = (int)u;
  if (labs(targetFinal - pos) <= DEAD_BAND && targetNow == targetFinal) {
    out = 0;
    integ = 0;
  } else if (out > 0 && out < PWM_MIN) out = PWM_MIN;
  else if (out < 0 && out > -PWM_MIN) out = -PWM_MIN;
  setMotor(out);
}

Lưu ý khi dùng:

  • Code ghi thẳng thanh ghi Timer1 nên không dùng analogWrite() ở chân 9, 10 hay thư viện dùng Timer1 song song được; millis(), micros() chạy trên Timer0, không ảnh hưởng.
  • Kp, Ki, Kd chỉ là điểm xuất phát cho motor giảm tốc khoảng 1.000–2.000 đếm/vòng trục ra; chỉnh lại theo mục 7. Có thể in thêm đích, vị trí, PWM mỗi 100 ms rồi xem bằng Serial Plotter.
  • MAX_STEP = 3 đếm/ms là 3.000 đếm/giây, khoảng 136 vòng/phút với 1.320 đếm/vòng. Đặt thấp hơn tốc độ không tải thực của motor, nếu không PID sẽ bão hòa liên tục.

9. Biến motor DC giảm tốc 12V/24V thành DC servo

Đây là cách rẻ nhất để có một trục định vị mô-men lớn mà servo RC không đáp ứng nổi.

Chọn motor

Ưu tiên motor có sẵn encoder sau đuôi, vì độ phân giải được nhân với tỉ số truyền. Motor chổi than nam châm vĩnh cửu dễ điều khiển nhất; các dòng motor DC 12V/24V vài chục tới vài trăm watt dùng tốt cho bàn trượt, cánh tay, cửa đẩy. Một motor như motor 12V 100W cần cầu H loại 15–30 A vì dòng khởi động gấp nhiều lần dòng định mức. Các động cơ giảm tốc mini bản điện một chiều cũng dùng được khi cần mô-men lớn ở tốc độ thấp; bản xoay chiều 1 pha thì không điều khiển bằng cầu H được.

Encoder ở trục motor hay trục ra?

Encoder ở trục motor cho độ phân giải cao và vòng điều khiển ổn định nhưng không thấy độ rơ hộp số; encoder ở trục ra đo đúng vị trí tải nhưng đưa độ rơ vào vòng kín, dễ lạch cạch. Hộp số bánh răng trụ của motor giảm tốc nhỏ có độ rơ khoảng 1–3°; cần chính xác hơn thì dùng hộp số hành tinh khe hở thấp hoặc đặt encoder ở tải và giảm Kp. Hộp trục vít tự hãm giữ được tải khi mất điện, nhưng ma sát lớn và thay đổi theo nhiệt khiến vùng chết PWM không ổn định, chỉ hợp cơ cấu chậm.

Về gốc và giới hạn hành trình

Encoder tương đối không nhớ vị trí khi mất điện. Khi khởi động, chạy chậm về công tắc gốc, gặp công tắc thì đặt encCount = 0. Thêm giới hạn mềm trong code và công tắc hành trình cuối ngắt cứng cầu H.

Một bộ điều tốc motor chỉ chỉnh tốc độ, không biết trục đang ở đâu; có encoder và vòng vị trí khép kín mới là DC servo.

10. Động cơ DC servo công nghiệp và driver làm sẵn

a. Động cơ DC servo công nghiệp có tacho

Trước khi servo AC phổ biến, máy CNC, máy dệt, máy in dùng motor DC servo nam châm vĩnh cửu rotor quán tính thấp, gắn máy phát tốc và encoder ở đuôi. Máy phát tốc cho điện áp tỉ lệ tốc độ, ghi trên tem dạng vôn trên 1.000 vòng/phút, đưa thẳng về vòng tốc độ analog của driver. Driver loại này thường nhận lệnh tốc độ hoặc mô-men bằng điện áp ±10 V, còn vòng vị trí nằm ở bộ điều khiển CNC.

Khi cải tạo máy cũ, kiểm tra cực tính tacho trước (đấu ngược là phản hồi dương, motor vọt tốc độ tối đa), kiểm tra chổi than, cổ góp và chọn nguồn driver không vượt điện áp định mức motor quá vài vôn.

b. Driver làm sẵn

LoạiMotorĐiện áp, dòngLệnh điều khiển
Driver DC servo xung/hướng (như Leadshine DCS810)DC chổi than + encoder18–80 VDC, đỉnh 20 AXung/hướng tới 500 kHz
Bo hai kênh có PID (dòng RoboClaw)DC chổi than + encoderTheo phiên bảnSerial, RC, analog
ODrive S1BLDC + encoder12–48 V, 20 A liên tục (40 A có tấm tản nhiệt)CAN, UART, xung/hướng
SimpleFOC + bo driver 3 nửa cầuBLDC, motor gimbalTheo bo driverCode Arduino, STM32, ESP32

Driver DC servo xung/hướng giải mã encoder x4 và có sẵn ba vòng; tham số gồm Kp, Ki vòng dòng, Vp, Vi vòng tốc độ, Kp, Ki, Kd vòng vị trí và bù trước gia tốc. Khi sai lệch bám vượt giới hạn cài đặt, driver ngắt và báo lỗi. Thử nhanh độ cứng sau khi chỉnh bằng cách vặn nhẹ trục: khó xoay nhưng motor kêu là hệ số quá cao; xoay dễ và driver báo lỗi bám là hệ số quá thấp.

Cách chọn linh kiện cầu H cho servo tự chế và cấu trúc driver servo AC có ở bài mạch điều khiển động cơ servo.

11. So sánh DC servo, AC servo và BLDC

Tiêu chíDC servo chổi thanAC servoBLDC có encoder (FOC)
Điều khiểnPID trên một kênh điện ápVector 3 pha, driver chuyên dụngVector 3 pha, cần cảm biến góc
Điện áp thường gặp6–90 VDC220 V 1 pha/3 pha, 380 V12–60 VDC
Bảo trìThay chổi than, vệ sinh cổ gópGần như khôngGần như không
Phù hợpRobot học tập, cơ cấu chạy pin, cải tạo máy cũMáy công nghiệp chạy nhiều caRobot, gimbal, cơ cấu gọn nhẹ

Máy chạy liên tục nhiều giờ ở công suất từ vài trăm watt thường kinh tế hơn khi dùng servo AC đóng gói sẵn motor, encoder 17–23 bit và driver, như các cỡ trong danh mục motor servo. DC servo tự xây hợp lý khi chạy ắc quy, cần điện áp thấp an toàn hoặc cần tùy biến thuật toán.

Để thấy rõ khác biệt về cấu tạo, video dưới đây giới thiệu các linh kiện bên trong một motor servo AC: rotor nam châm vĩnh cửu, stator và encoder phản hồi vị trí.

12. Câu hỏi thường gặp về điều khiển động cơ DC servo

Động cơ DC servo khác motor DC thường ở điểm nào?

Khác ở hệ điều khiển, không bắt buộc khác ở motor. Motor DC thường chạy hở, tốc độ phụ thuộc tải; DC servo có encoder hoặc tacho phản hồi và bộ điều khiển hiệu chỉnh liên tục. Motor DC servo chuyên dụng có thêm rotor quán tính thấp và chịu dòng đỉnh lớn để tăng tốc nhanh.

Có cần đủ cả ba vòng dòng, tốc độ, vị trí không?

Không bắt buộc. Cơ cấu nhỏ, tải nhẹ chỉ cần một vòng PID vị trí xuất thẳng PWM. Vòng tốc độ cần khi tải đổi nhiều hoặc phải bám quỹ đạo mịn; vòng dòng cần khi phải giới hạn lực chính xác.

Encoder bao nhiêu xung mỗi vòng là đủ cho DC servo?

Đủ khi mỗi đếm sau x4 nhỏ hơn sai số cho phép của tải khoảng 4–10 lần. Vít me bước 5 mm cần sai số 0,05 mm thì nên có 400–1.000 đếm/vòng trục vít me. Encoder quá mịn so với khả năng đếm của vi điều khiển chỉ gây mất xung.

Vì sao motor quay vọt hết tốc độ ngay khi bật PID?

Gần như luôn do chiều encoder ngược chiều motor, tạo phản hồi dương. Đảo hai dây motor hoặc đảo kênh A, B trong code là hết. Nguyên nhân khác là encoder không đếm (đứt dây, sai chân ngắt) nên sai lệch không bao giờ giảm.

Vì sao motor lắc qua lại liên tục quanh điểm dừng?

Do Kp quá lớn so với độ rơ và ma sát, hoặc thiếu vùng dừng. Giảm Kp, tăng Kd vừa phải, thêm vùng dừng ±1–2 đếm và xóa khâu I khi đã vào vùng dừng.

Vì sao motor dừng cách đích vài xung mà không chịu tới?

Lệnh PID gần đích nhỏ hơn mức PWM cần để thắng ma sát tĩnh. Thêm khâu I nhỏ hoặc cộng PWM tối thiểu như code mẫu; trục chịu trọng lực thì khâu I là bắt buộc.

Chu kỳ lấy mẫu PID nên chọn bao nhiêu?

Thường 0,5–2 ms cho vòng vị trí motor nhỏ, khoảng nhỏ hơn 10 lần hằng số thời gian cơ của hệ. Lấy mẫu 20–100 ms khiến hệ chỉ ổn khi Kp rất thấp, phản ứng ì.

DC servo có giữ được vị trí khi mất điện không?

Không. Mất điện thì vòng kín mất tác dụng, trục quay tự do trừ khi hộp số tự hãm hoặc có phanh. Encoder tương đối cũng mất vị trí, có điện lại phải chạy về gốc.

Có điều khiển DC servo bằng xung và hướng như động cơ bước được không?

Có, với driver DC servo nhận xung/hướng. Mỗi xung lệnh ứng với một số đếm encoder theo bánh răng điện tử cài trên driver, cho phép thay động cơ bước trên máy CNC mà giữ nguyên bộ điều khiển.

Arduino Uno có làm DC servo cho hai trục cùng lúc được không?

Được, với encoder độ phân giải thấp. Uno chỉ có hai chân ngắt ngoài nên trục thứ hai phải dùng ngắt đổi trạng thái chân (pin change); nhiều trục hoặc encoder mịn nên chuyển sang STM32, ESP32 có bộ đếm encoder phần cứng.

Motor BLDC có điều khiển như DC servo được không?

Được, nhưng cần driver 3 pha và thuật toán đổi chiều dòng theo góc rotor, không dùng cầu H hai nhánh. Với điều khiển FOC, mô-men BLDC cũng tỉ lệ dòng nên ba vòng điều khiển tương tự DC servo.

Driver DC servo nhận lệnh analog ±10 V có cần chỉnh gì không?

Có, cần chỉnh điểm 0 (offset). Lệch vài milivôn cũng làm motor trôi chậm khi lệnh bằng 0; dây tín hiệu phải là cáp chống nhiễu.

13. Kết luận

Điều khiển động cơ DC servo xoay quanh ba việc: đo đúng (encoder x4 không mất xung, tính tốc độ phù hợp), cấp điện đúng (cầu H đủ dòng, PWM 16–20 kHz, đo dòng, xử lý năng lượng hãm) và tính đúng (PID chu kỳ cố định, chống bão hòa tích phân, chỉnh từng bước với tải thật). Khi máy cần công suất lớn chạy nhiều ca, servo AC đóng gói sẵn là bước nâng cấp hợp lý.

3.117 reviews

Tin tức liên quan

Mô Tơ Điện 1 Pha, 3 Pha 220V/380V: Bảng Giá Theo kW

Mô Tơ Điện 1 Pha, 3 Pha 220V/380V: Bảng Giá Theo kW

06 thg 11 2026 13:03

Mô tơ điện 3 pha 380V 4 cực giá 920.000 – 17.440.000 đ (0.37 – 30kW); mô tơ 1 pha 220V YL, YC giá 1.070.000 – 5.840.000 đ (0.37 – 3.7kW). Kèm cách chọn 1 pha hay 3 pha, số cực theo máy.
Đọc tiếp
Hộp giảm tốc harmonic: thông số, model CSF, SHF và cách chọn

Hộp giảm tốc harmonic: thông số, model CSF, SHF và cách chọn

14 thg 10 2026 15:12

Hộp giảm tốc harmonic (strain wave) size 14 – 32, tỉ số 1/50 – 1/120, mô men 5,4 – 137 Nm. Cách đọc tem, phân loại CSF, CSG, SHF-2UH, SHF-2UJ, SHF-2SO, SHD-2SH và cách chọn theo servo.
Đọc tiếp
Khám phá Bí Quyết Điều Khiển Động Cơ RC Servo Chính Xác Bằng STM32F4

Khám phá Bí Quyết Điều Khiển Động Cơ RC Servo Chính Xác Bằng STM32F4

15 thg 4 2025 20:44

Điều khiển động cơ RC Servo bằng STM32F4 mang đến độ chính xác cao và khả năng tùy chỉnh tín hiệu PWM tối ưu. Bài viết này hướng dẫn từ cấu hình bộ định thời, lập trình tín hiệu PWM, đến tối ưu hóa hiệu suất động cơ. Đây là giải pháp lý tưởng cho kỹ sư điện, kỹ sư cơ khí và các doanh nghiệp công nghiệp.
Đọc tiếp
Điều khiển động cơ RC servo bằng PWM: chu kỳ, độ rộng xung và cách tạo xung bằng timer

Điều khiển động cơ RC servo bằng PWM: chu kỳ, độ rộng xung và cách tạo xung bằng timer

10 thg 10 2026 17:36

Điều khiển động cơ RC servo bằng PWM: chu kỳ 20 ms, độ rộng xung 500–2500 µs, tính prescaler cho AVR, STM32, ESP32, PCA9685, mạch 555 và cách đo kiểm.
Đọc tiếp
Cách Điều Khiển Động Cơ DC Servo Chính Xác Bằng Giải Thuật PID

Cách Điều Khiển Động Cơ DC Servo Chính Xác Bằng Giải Thuật PID

12 thg 10 2026 08:32

Điều khiển động cơ DC Servo bằng giải thuật PID mang lại sự ổn định và hiệu suất cao cho hệ thống công nghiệp. Tìm hiểu cách áp dụng Proportional-Integral-Derivative, vi điều khiển và encoder để tối ưu hóa tốc độ và vị trí của động cơ. Phương pháp này được sử dụng rộng rãi trong robot, dây chuyền sản xuất và các hệ thống tự động hóa.
Đọc tiếp