Điều khiển động cơ bước lưỡng cực: STEP/DIR, vi bước, băm dòng và cấu hình driver TMC
Điều khiển động cơ bước lưỡng cực là việc tạo ra dòng điện đảo chiều có kiểm soát trong hai cuộn pha A và B, theo đúng trình tự và đúng biên độ, để rôto đi từng bước hoặc từng vi bước tới vị trí mong muốn. Trong thực tế, phần lớn hệ thống hiện nay không tự đóng cắt cầu H bằng vi điều khiển nữa mà giao việc đó cho một IC driver chuyên dụng (A4988, DRV8825, TMC2209, TMC5160…); bộ điều khiển phía trên chỉ cần phát hai tín hiệu STEP (mỗi xung là một bước) và DIR (chiều quay), đồng thời tính toán tốc độ, gia tốc cho đúng.
Chất lượng chuyển động – êm hay rung, khỏe hay mất bước, chính xác hay trôi vị trí – phụ thuộc phần lớn vào cách điều khiển chứ không chỉ vào motor: bảng dòng vi bước, chế độ băm dòng (decay), tần số xung, profile gia tốc và cấu hình thanh ghi của driver. Các mục dưới đây đi theo đúng thứ tự một người lắp máy CNC mini, máy in 3D, bàn trượt hay thiết bị tự động hóa nhỏ sẽ gặp: từ tín hiệu, trình tự dòng, chọn IC, đến lập trình và về gốc không cần công tắc.
Phần nguyên lý cuộn dây, cầu H, cách đấu motor 8 dây, chọn điện áp nguồn theo điện cảm và cộng hưởng cơ học đã có trong bài động cơ bước lưỡng cực; bài này chỉ tập trung vào kỹ thuật điều khiển.
Nội dung
- 1. Sơ đồ khối một hệ điều khiển động cơ bước lưỡng cực
- 2. Giao tiếp STEP/DIR/ENABLE và yêu cầu thời gian
- 3. Trình tự dòng full step, half step và vi bước sin-cos
- 4. Băm dòng (chopper) và các chế độ decay
- 5. Chọn IC driver cho động cơ bước lưỡng cực
- 6. StealthChop và SpreadCycle trên driver TMC
- 7. Cấu hình driver TMC2208/TMC2209 qua UART
- 8. StallGuard: về gốc không cần công tắc hành trình
- 9. Gia tốc hình thang và S-curve khi điều khiển động cơ bước lưỡng cực
- 10. Thư viện lập trình: AccelStepper, FastAccelStepper, TMCStepper
- 11. Chống trôi vị trí, nhiễu và xử lý sự cố khi vận hành
- 12. Câu hỏi thường gặp về điều khiển động cơ bước lưỡng cực
1. Sơ đồ khối một hệ điều khiển động cơ bước lưỡng cực
Một hệ điều khiển động cơ bước lưỡng cực luôn gồm bốn tầng: bộ tạo quỹ đạo (vi điều khiển, firmware GRBL/Marlin/Klipper, PLC ngõ ra xung hoặc card Mach3) tính vị trí, tốc độ, gia tốc và xuất chuỗi xung; driver nhận STEP/DIR, tra bảng vi bước và băm dòng; tầng công suất gồm hai cầu H, điện trở đo dòng, tụ lọc; cuối cùng là motor cùng cơ khí truyền động. Tổng quan các loại motor dùng trong hệ này có ở trang động cơ bước.
Phân tầng giúp tìm lỗi nhanh: motor rung đều ở mọi tốc độ thường do tầng driver (dòng, decay, dây pha); chạy đúng ở tốc thấp nhưng mất bước khi tăng tốc thường do bộ tạo quỹ đạo (gia tốc quá gắt, xung không đều) hoặc motor hết mô-men; vị trí lệch dần mà không nghe tiếng mất bước thường do nhiễu trên dây STEP. Khi cần phản hồi vị trí thật, có thể thay cụm driver và motor bằng motor servo nhận cùng kiểu tín hiệu xung.
2. Giao tiếp STEP/DIR/ENABLE và yêu cầu thời gian
Giao tiếp STEP/DIR là chuẩn trên thực tế cho mọi driver động cơ bước lưỡng cực: mỗi cạnh lên của chân STEP làm driver tiến thêm một vi bước trong bảng dòng, mức logic chân DIR quyết định tiến hay lùi trong bảng, còn chân ENABLE bật hoặc tắt tầng công suất.
Thông số thời gian của các IC phổ biến
| Thông số | A4988 | DRV8825 | TMC2208/2209 |
| Độ rộng xung STEP mức cao tối thiểu | 1 µs | 1,9 µs | khoảng 100 ns |
| Độ rộng mức thấp tối thiểu | 1 µs | 1,9 µs | khoảng 100 ns |
| DIR phải ổn định trước cạnh STEP | 200 ns | 650 ns | khoảng 20 ns |
| Tần số STEP tối đa theo datasheet | khoảng 500 kHz | 250 kHz | vài MHz (bị giới hạn bởi vi điều khiển) |
| Chân ENABLE | tích cực mức thấp | tích cực mức thấp | tích cực mức thấp |
Trong thực tế giới hạn nằm ở bộ phát xung: Arduino Uno dùng thư viện phổ thông chỉ phát ổn định vài nghìn xung/giây, PLC ngõ ra transistor phổ biến ở mức 100 kHz. Khi dùng ngõ ra PLC hoặc card cách ly, cách đấu tín hiệu chung dương hay chung âm và điện trở hạn dòng được trình bày riêng ở bài điều khiển động cơ bước bằng PLC và bài mạch điều khiển TB6600.
Tính tần số xung cần thiết
Tần số xung (Hz) = tốc độ (vòng/phút) × số bước gốc/vòng × hệ số vi bước ÷ 60. Ví dụ motor 1,8° (200 bước/vòng) chạy 300 vòng/phút ở vi bước 1/32 cần 300 × 200 × 32 ÷ 60 = 32.000 xung/giây. Nếu bộ điều khiển chỉ phát được 10 kHz thì ở 1/32 tốc độ tối đa chỉ còn khoảng 94 vòng/phút; muốn nhanh hơn phải giảm vi bước hoặc dùng driver có nội suy (mục 4).
Thứ tự thao tác đúng
- Đổi mức DIR, chờ ít nhất vài micro giây rồi mới phát xung STEP tiếp theo; đổi DIR giữa lúc đang phát xung làm sai một bước mỗi lần đảo chiều, sai số cộng dồn sau nhiều chu kỳ đi về.
- Bật ENABLE trước khi phát xung khoảng 1–5 ms để dòng kịp xác lập; với TMC chạy StealthChop, lần bật đầu tiên cần motor đứng yên để driver tự dò thông số.
- Đặt ENABLE ở mức tắt khi khởi động vi điều khiển (điện trở kéo lên), tránh motor giật khi chân GPIO còn trôi.

Mức logic 3,3 V và 5 V
A4988 và DRV8825 chấp nhận logic 3,3 V nên ESP32, STM32, Raspberry Pi Pico nối trực tiếp được; TMC2208/2209 lấy mức logic theo chân VIO, cấp 3,3 V hay 5 V tùy vi điều khiển. Module công nghiệp có opto thường thiết kế cho 5 V; với tín hiệu 3,3 V cần kiểm tra dòng kích LED opto (thường cần 7–16 mA) hoặc thêm tầng đệm 74HCT245. Các trường hợp cấp nguồn motor và logic chỉ bằng 5 V nằm ở bài điều khiển động cơ bước 5 V.
3. Trình tự dòng full step, half step và vi bước sin-cos
Muốn điều khiển động cơ bước lưỡng cực tốt cần hiểu driver đang làm gì sau mỗi xung STEP: nó nhảy sang một hàng trong bảng dòng và đặt dòng cuộn A, cuộn B theo hàng đó. Chiều dòng (dấu + hoặc −) do cầu H quyết định, độ lớn do bộ băm dòng quyết định.
Full step hai pha cùng kích (4 trạng thái/chu kỳ điện)
| Bước | Dòng cuộn A | Dòng cuộn B | Góc vector từ trường |
| 1 | +70,7 % | +70,7 % | 45° |
| 2 | −70,7 % | +70,7 % | 135° |
| 3 | −70,7 % | −70,7 % | 225° |
| 4 | +70,7 % | −70,7 % | 315° |
Lưu ý: driver vi bước khi đặt chế độ full step thường cấp 70,7 % dòng đặt cho mỗi cuộn để tổng vector bằng 100 %. Mạch cầu H trần như L298N lại cấp đủ 100 % cho cả hai cuộn nên mô-men full step lớn hơn khoảng 1,4 lần nhưng motor nóng gấp đôi – chi tiết ở bài điều khiển động cơ bước dùng L298.
Half step (8 trạng thái/chu kỳ điện)
| Bước | Dòng cuộn A | Dòng cuộn B | Góc vector |
| 1 | +100 % | 0 | 0° |
| 2 | +70,7 % | +70,7 % | 45° |
| 3 | 0 | +100 % | 90° |
| 4 | −70,7 % | +70,7 % | 135° |
| 5 | −100 % | 0 | 180° |
| 6 | −70,7 % | −70,7 % | 225° |
| 7 | 0 | −100 % | 270° |
| 8 | +70,7 % | −70,7 % | 315° |
Vi bước sin-cos
Ở vi bước, dòng hai cuộn được đặt theo IA = Imax × cos θ và IB = Imax × sin θ, trong đó θ tăng đều 90°/n mỗi vi bước (n là hệ số chia: 4, 8, 16, 32…). Ví dụ vi bước 1/4 trong một phần tư chu kỳ:
| Vi bước | Góc θ | Dòng cuộn A (cos θ) | Dòng cuộn B (sin θ) |
| 0 | 0° | 100 % | 0 % |
| 1 | 22,5° | 92,4 % | 38,3 % |
| 2 | 45° | 70,7 % | 70,7 % |
| 3 | 67,5° | 38,3 % | 92,4 % |
| 4 | 90° | 0 % | 100 % |
Driver lưu sẵn bảng này trong ROM: A4988 có 16 mức cho một phần tư chu kỳ, DRV8825 có 32 mức, dòng TMC có 256 mức và cho phép nạp bảng tùy chỉnh (thanh ghi MSLUT) để bù méo của từng loại motor. Vi bước làm chuyển động mịn và giảm tiếng ồn, nhưng mô-men tăng thêm cho mỗi vi bước rất nhỏ, nên vị trí vi bước dưới tải không chính xác như con số độ phân giải – vấn đề này phân tích kỹ ở bài động cơ bước độ chính xác cao.
4. Băm dòng (chopper) và các chế độ decay
Motor lưỡng cực thường có điện trở cuộn chỉ 1–3 Ω nhưng được cấp nguồn 12–48 V, cao hơn nhiều lần điện áp định mức. Để không cháy cuộn, driver dùng phương pháp băm dòng (chopper): đóng cầu H cho dòng tăng, đo dòng qua điện trở sense, khi chạm ngưỡng đặt thì ngắt hoặc đảo cầu một khoảng thời gian ngắn (off-time) cho dòng giảm, rồi lặp lại ở tần số khoảng 20–50 kHz. Cách dòng giảm trong pha "off" chính là chế độ decay.
| Chế độ decay | Cầu H trong pha off | Dòng giảm | Ưu điểm | Nhược điểm |
| Slow decay | Hai khóa phía dưới (hoặc trên) cùng dẫn, cuộn tự ngắn mạch | Chậm | Gợn dòng nhỏ, motor êm, ít tổn hao | Không bám kịp khi dòng đặt cần giảm nhanh, méo sin ở tốc cao |
| Fast decay | Đảo cầu, đẩy năng lượng về nguồn | Nhanh | Bám dòng đặt tốt khi giảm | Gợn dòng lớn, ồn, nóng |
| Mixed decay | Đầu pha off chạy fast, phần sau chạy slow | Trung bình | Dung hòa, dùng cho đa số motor | Tỉ lệ fast/slow chưa hợp motor thì vẫn rung |
| Thích nghi (auto/smart) | Driver tự đo và chỉnh tỉ lệ | Tùy tình huống | Ít phải chỉnh tay | Chỉ có ở IC đời mới |
Dấu hiệu decay chưa phù hợp
- Motor kêu "rè" hoặc rít đều ở tốc độ thấp, dòng đo được méo phẳng ở gần điểm qua 0: thiếu fast decay, thường gặp với motor điện cảm cao.
- Motor ồn, nóng hơn bình thường dù dòng đặt đúng: quá nhiều fast decay, gợn dòng lớn.
- Rung tăng mạnh ở một dải tốc độ trung bình dù cơ khí chắc chắn: thử đổi chế độ decay trước khi đổi motor.
Trên DRV8825, chân DECAY để hở là mixed decay, nối mức thấp là slow, mức cao là fast; nhiều module bán sẵn để chân này hở. A4988 tự chọn mixed decay khi dòng đặt đang giảm và slow decay khi dòng đặt đang tăng. Dòng TMC dùng thuật toán SpreadCycle với các tham số TOFF, HSTRT, HEND, TBL chỉnh qua UART/SPI; giá trị mặc định của thư viện chạy ổn với đa số motor NEMA 17, cách đặt dòng Vref cho từng module cũng nằm ở bài đó.
5. Chọn IC driver cho động cơ bước lưỡng cực
Việc chọn IC quyết định gần như toàn bộ chất lượng điều khiển động cơ bước lưỡng cực. Bảng dưới so sánh các IC thông dụng nhất ở mức module (giá trị đỉnh theo datasheet; mức dùng thực tế không tản nhiệt chủ động thấp hơn).
| IC | Dải nguồn motor | Dòng thực dùng | Vi bước | Giao tiếp cấu hình |
| A4988 | 8–35 V | khoảng 1 A/pha (2 A đỉnh) | đến 1/16 | Chân MS1–MS3 |
| DRV8825 | 8,2–45 V | khoảng 1,5 A/pha (2,5 A đỉnh) | đến 1/32 | Chân MODE0–2, DECAY |
| TMC2208 | 4,75–36 V | khoảng 1,2 A RMS | 1/2–1/256, nội suy 256 | Chân hoặc UART |
| TMC2209 | 4,75–29 V | khoảng 2 A RMS (module thực tế 1,2–1,7 A) | 1/2–1/256, nội suy 256 | UART địa chỉ, có StallGuard4 |
| TMC5160 | 8–60 V | đến 3 A RMS trở lên, tùy MOSFET ngoài | 1/256 | SPI, có bộ tạo profile tích hợp |
Gợi ý chọn theo tình huống
- Học tập, thử nghiệm, máy nhỏ dùng Arduino: A4988 hoặc DRV8825 đủ dùng, rẻ, dễ thay. Nhược điểm chính là ồn và rung ở tốc thấp.
- Máy in 3D, máy khắc laser, camera slider cần êm: TMC2209 chạy StealthChop gần như im lặng, cấu hình được bằng UART, có về gốc không công tắc.
- Máy CNC mini nguồn 36–48 V, motor NEMA 23 dòng 2,5–4 A: TMC5160 (module SPI) hoặc driver hộp rời. Khi motor lớn hơn hoặc cần cách ly hoàn toàn, dùng driver công nghiệp dạng hộp như TB6600 hay dòng DM, xem bài động cơ bước 2 pha để ghép bộ motor – driver – nguồn.
- Thiết bị chạy pin, nguồn 5 V: loại trừ A4988 và DRV8825 vì cần tối thiểu khoảng 8 V; chọn TMC2208/2209 hoặc DRV8833.
Cảnh báo khi dùng module driver
- Không cắm hoặc rút dây motor khi driver đang có nguồn: điện áp cảm ứng có thể phá cầu H ngay lập tức.
- Gắn tụ điện phân 47–100 µF sát chân nguồn motor của module, nhất là khi dây nguồn dài; xung điện áp lúc cấp nguồn là nguyên nhân hỏng module rất phổ biến.
- Cắm module ngược chiều trên board máy in 3D gần như chắc chắn cháy cả module và có thể hỏng vi điều khiển; đối chiếu chân EN/GND trước khi cấp điện.
6. StealthChop và SpreadCycle trên driver TMC
Hai chế độ này là lý do driver TMC phổ biến khi điều khiển động cơ bước lưỡng cực cần êm. Hiểu đúng khi nào dùng chế độ nào giúp tránh hiện tượng motor đang chạy êm thì mất bước khi tải nặng.
| Tiêu chí | StealthChop | SpreadCycle |
| Nguyên lý | Điều chế điện áp PWM, dòng điều khiển gián tiếp | Băm dòng theo chu kỳ, đo dòng trực tiếp |
| Độ ồn | Gần như im lặng ở tốc thấp và trung bình | Có tiếng rít nhẹ |
| Mô-men ở tốc cao | Giảm sớm hơn, dễ mất bước khi tải đổi đột ngột | Giữ mô-men tốt, phản ứng tải nhanh |
| Về gốc không công tắc (TMC2209) | Có (StallGuard4 chỉ hoạt động ở chế độ này) | Không |
Chuyển chế độ tự động theo tốc độ
Thanh ghi TPWMTHRS đặt ngưỡng tốc độ: dưới ngưỡng driver chạy StealthChop, trên ngưỡng chuyển sang SpreadCycle. Giá trị so sánh là TSTEP – khoảng thời gian giữa hai vi bước đo bằng chu kỳ xung nhịp 12 MHz – nên tốc độ càng cao thì TSTEP càng nhỏ. Cách dùng phổ biến: chạy êm khi in hoặc di chuyển chậm, chuyển SpreadCycle khi chạy không tải tốc độ cao.
Lưu ý khi dùng StealthChop
- Sau khi bật nguồn, motor phải đứng yên ít nhất khoảng 130 ms có dòng giữ để driver tự đo điện trở cuộn (bước dò tự động AT#1), sau đó chạy vài vòng ở tốc độ vừa phải để hoàn tất bước AT#2.
- Đổi điện áp nguồn hoặc đổi motor thì nên khởi động lại để driver dò lại, nếu không dòng có thể sai và motor yếu.
- Tải có quán tính lớn, tăng tốc gắt (trục X/Y máy CNC) dễ mất bước ở StealthChop: đặt ngưỡng TPWMTHRS thấp hoặc dùng hẳn SpreadCycle.
7. Cấu hình driver TMC2208/TMC2209 qua UART
Không có UART, TMC2209 chỉ chạy được vài chế độ cài cứng bằng chân MS1/MS2 (1/8, 1/16, 1/32, 1/64, tất cả có nội suy lên 1/256) và dòng đặt bằng biến trở Vref. Có UART, gần như mọi thông số đều chỉnh được bằng phần mềm, kể cả lúc máy đang chạy.
Đấu UART một dây
| Chân TMC2209 | Nối tới | Ghi chú |
| PDN_UART | RX của vi điều khiển, và qua điện trở 1 kΩ tới TX | UART bán song công một dây |
| MS1, MS2 | GND hoặc VIO | Chọn địa chỉ 0–3, cho phép 4 driver chung một đường UART |
| DIAG | Ngõ vào ngắt của vi điều khiển | Báo kẹt trục khi dùng StallGuard |
| VIO | 3,3 V hoặc 5 V | Phải cùng mức logic với vi điều khiển |
| EN | GPIO, kéo lên khi khởi động | Mức thấp là chạy |
TMC2208 không có địa chỉ, mỗi driver cần một đường UART riêng (hoặc dùng UART mềm). Tốc độ truyền phổ biến 115.200 baud; driver tự nhận tốc độ baud.
Các thông số thường chỉnh qua thư viện TMCStepper
- rms_current(dòng mA): đặt dòng hiệu dụng bằng phần mềm thay cho xoay biến trở, thường đặt 70–85 % dòng định mức motor.
- en_spreadCycle(false/true): chọn StealthChop hay SpreadCycle.
- TPWMTHRS: ngưỡng chuyển chế độ theo tốc độ như mục 6.
- ihold, iholddelay: dòng giữ khi đứng yên và thời gian chuyển từ dòng chạy sang dòng giữ.
Kiểm tra UART đã thông chưa
Cách nhanh nhất là đọc thanh ghi trạng thái (ví dụ test_connection hoặc đọc phiên bản IC). Nếu đọc về 0 hoặc 0xFF: kiểm tra điện trở 1 kΩ, mức VIO, chân PDN trên module đã được nối jumper chưa (một số module mặc định chân này không ra ngoài) và địa chỉ MS1/MS2 có khớp với khai báo trong code.
8. StallGuard: về gốc không cần công tắc hành trình
StallGuard là tính năng của driver TMC đo tải trên motor thông qua back-EMF; khi trục bị chặn cứng (chạm cữ cơ khí), giá trị đo giảm mạnh và driver kéo chân DIAG lên để báo. Nhờ vậy có thể điều khiển động cơ bước lưỡng cực về gốc (homing) mà không cần công tắc hành trình – giảm dây, giảm linh kiện trên máy in 3D, máy khắc laser, rèm tự động, cơ cấu kẹp.
Các thanh ghi chính trên TMC2209
| Thanh ghi | Ý nghĩa | Cách đặt thực tế |
| SGTHRS (0–255) | Ngưỡng nhạy; báo kẹt khi SG_RESULT ≤ 2 × SGTHRS | Bắt đầu khoảng 50–100, tăng dần nếu không nhận kẹt |
| SG_RESULT | Giá trị tải đo được, càng nhỏ càng nặng tải | Đọc trong lúc chạy không tải để biết mức nền |
| TCOOLTHRS | Tốc độ thấp nhất mà StallGuard được phép hoạt động | Đặt lớn hơn TSTEP ở tốc độ về gốc |
| TPWMTHRS | Ngưỡng chuyển sang SpreadCycle | Phải để tốc độ về gốc nằm trong vùng StealthChop |
Trình tự chỉnh StallGuard
- Cho motor chạy ở tốc độ về gốc dự kiến (thường 20–60 mm/s trên máy in 3D, tương đương vài vòng/giây), đọc SG_RESULT khi chạy tự do để có mức nền.
- Đặt SGTHRS sao cho 2 × SGTHRS thấp hơn mức nền một khoảng an toàn; chặn trục bằng tay để thử, chân DIAG phải lên mức cao ngay.
- Nếu motor dừng giữa chừng khi chưa chạm cữ: giảm SGTHRS. Nếu đâm vào cữ và kêu lạch cạch mà không dừng: tăng SGTHRS hoặc tăng tốc độ về gốc.
Giới hạn cần biết
- StallGuard không hoạt động ở tốc độ quá thấp (back-EMF quá nhỏ) và kém tin cậy ở tốc độ quá cao; về gốc chậm như công tắc cơ khí là không dùng được.
- Độ lặp lại điểm gốc thường kém công tắc quang hoặc công tắc cơ chất lượng tốt; với máy cần gốc chính xác cỡ 0,01 mm, vẫn nên dùng cảm biến.
- Trục có hộp số tỉ số lớn, vít me trục vít tự hãm hoặc tải nặng theo phương đứng làm StallGuard khó phân biệt kẹt và tải thường.
Trên TMC5160 và TMC2130, StallGuard2 hoạt động ở chế độ SpreadCycle với thanh ghi SGT (giá trị có dấu từ −64 đến +63) thay cho SGTHRS; nguyên tắc chỉnh tương tự nhưng chiều ngược lại: giá trị càng thấp càng nhạy.
9. Gia tốc hình thang và S-curve khi điều khiển động cơ bước lưỡng cực
Động cơ bước không thể nhảy tức thời từ đứng yên lên tốc độ cao: nếu tần số xung đầu tiên đã vượt tần số kéo vào (pull-in) của motor và tải, rôto không theo kịp, motor rung và đứng tại chỗ. Vì vậy bộ điều khiển phải tăng tần số xung dần theo một profile vận tốc.
Profile hình thang
Vận tốc tăng tuyến tính với gia tốc a không đổi, chạy đều, rồi giảm tuyến tính. Các công thức hay dùng:
- Số bước cần để tăng tốc từ 0 lên v: n = v² ÷ (2 × a), với v tính bằng bước/giây, a bằng bước/giây².
- Ví dụ: v = 8.000 bước/s, a = 40.000 bước/s² thì n = 64.000.000 ÷ 80.000 = 800 bước, mất 0,2 giây.
- Nếu quãng đường ngắn hơn 2n, motor không kịp đạt tốc độ đặt: profile thành hình tam giác, điểm đổi chiều gia tốc nằm ở giữa quãng đường.
- Khoảng cách giữa hai xung trong pha tăng tốc giảm dần; các thư viện dùng công thức gần đúng truy hồi để tính nhanh mà không cần khai căn ở mỗi bước.
Profile S-curve (giới hạn jerk)
S-curve làm gia tốc tăng giảm dần thay vì nhảy bậc. Ưu điểm: giảm rung khi dừng, giảm dao động đầu công cụ, giảm vết gợn trên chi tiết in 3D hoặc cắt laser, giảm tải sốc lên đai và hộp giảm tốc. Nhược điểm: với cùng gia tốc tối đa, thời gian di chuyển dài hơn hình thang khoảng 10–30 %, và tính toán nặng hơn cho vi điều khiển 8 bit.
Chọn gia tốc ban đầu
- Bắt đầu với gia tốc thấp, tăng dần 20 % mỗi lần cho tới khi motor mất bước, rồi lùi lại còn khoảng 60–70 % giá trị đó để có dự phòng.
- Tải quán tính lớn (đĩa xoay, bàn trượt nặng) cần gia tốc nhỏ hơn hẳn tải nhẹ dù cùng motor; nếu vẫn thiếu, cân nhắc thêm tỉ số truyền bằng động cơ bước có hộp số.
- Tốc độ khởi động (không cần tăng tốc) nên giữ dưới khoảng 1–2 vòng/giây với motor NEMA 17, NEMA 23 thông dụng.
10. Thư viện lập trình: AccelStepper, FastAccelStepper, TMCStepper
Với Arduino và ESP32, ba thư viện dưới đây đủ cho hầu hết dự án điều khiển động cơ bước lưỡng cực bằng driver STEP/DIR.
| Thư viện | Vai trò | Tốc độ xung thực tế | Điểm cần lưu ý |
| AccelStepper | Phát xung có gia tốc hình thang, điều khiển nhiều motor | Khoảng 4.000 bước/s trên Arduino 16 MHz | Phải gọi run() liên tục trong loop, không được dùng delay() |
| FastAccelStepper | Phát xung bằng timer/ngắt phần cứng | Khoảng 50 kHz trên AVR, cao hơn nhiều trên ESP32 | Chỉ dùng được các chân hỗ trợ timer; giới hạn số motor theo chip |
| TMCStepper | Cấu hình thanh ghi TMC qua UART/SPI | Không phát xung | Kết hợp với một trong hai thư viện trên |
Các bước tối thiểu với AccelStepper
- Khai báo kiểu driver STEP/DIR: AccelStepper motor(AccelStepper::DRIVER, chân STEP, chân DIR).
- Đặt tốc độ tối đa và gia tốc: setMaxSpeed(2000), setAcceleration(4000) – đơn vị là bước/giây và bước/giây².
- Ra lệnh vị trí bằng moveTo() hoặc move(), rồi gọi run() mỗi vòng loop; hàm này tự phát xung khi đến lúc.
- Chân EN dùng setEnablePin() và setPinsInverted() vì đa số driver tích cực mức thấp.
Lỗi lập trình hay gặp
- Dùng delay() hoặc Serial.print dài trong loop khiến run() không được gọi đúng lúc: motor giật, chạy chậm hơn đặt, phát tiếng lạch cạch.
- Dùng setSpeed() và runSpeed() khi muốn có gia tốc: hai hàm này chạy tốc độ không đổi, không tăng tốc, nên motor đứng nếu tốc độ đặt cao.
- Quên khai báo hệ số vi bước khi đổi từ đầu vào jumper: số bước/mm trong firmware phải nhân theo, nếu không trục đi sai tỉ lệ đúng bằng hệ số đó.
Với máy CNC, máy in 3D, nên dùng firmware sẵn có (GRBL cho Arduino Uno, FluidNC cho ESP32, Marlin hoặc Klipper cho máy in) thay vì tự viết, vì chúng đã có lập kế hoạch chuyển động nhiều trục, look-ahead và cấu hình TMC đầy đủ.
11. Chống trôi vị trí, nhiễu và xử lý sự cố khi vận hành
Điều khiển động cơ bước lưỡng cực ổn định trong máy thật còn cần chống trôi vị trí và chống nhiễu.
Đếm vị trí và chống trôi
Vòng hở nghĩa là bộ điều khiển chỉ biết vị trí theo số xung đã phát. Nên có ít nhất một điểm gốc mỗi lần khởi động; với chu kỳ dài (máy đóng gói chạy liên tục nhiều giờ), có thể đặt thêm cảm biến kiểm tra định kỳ ở một vị trí cố định để phát hiện mất bước sớm. Khi không chấp nhận mất bước, dùng driver vòng kín có encoder hoặc chuyển hẳn sang motor servo 400 W cho các trục tải lớn.
Nhiễu tín hiệu STEP
- Dùng cáp xoắn đôi hoặc cáp có lưới chống nhiễu cho STEP/DIR khi dây dài trên khoảng 1 m, đi tách xa dây pha motor và dây nguồn biến tần, dây motor 3 pha trong tủ điện.
- Xung nhiễu tạo thêm vi bước giả làm vị trí trôi dần mà không nghe tiếng mất bước; dấu hiệu là sai số luôn lệch về một phía.
- Tách mass logic và mass công suất, nối chung tại một điểm gần nguồn để tránh dòng motor chạy qua mass tín hiệu.

Bảng xử lý nhanh sự cố khi điều khiển
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
| Motor có giữ lực nhưng không quay khi phát xung | Chân SLEEP/RESET để hở (A4988), ENABLE sai mức, xung quá ngắn | Nối SLEEP với RESET, kiểm tra mức EN, kéo dài xung STEP |
| Motor quay đúng chiều nhưng quãng đường gấp đôi hoặc một nửa | Hệ số vi bước trên driver khác khai báo trong code | Đồng bộ jumper/thanh ghi vi bước với số bước/mm |
| Đảo chiều thì lệch dần sau nhiều chu kỳ | DIR đổi quá sát cạnh STEP | Thêm thời gian chờ sau khi đổi DIR |
| Chạy êm, tăng tốc là đứng | Gia tốc quá cao, tần số khởi động quá lớn | Giảm gia tốc, thêm pha tăng tốc |
| Motor rít ở tốc thấp, êm ở tốc cao | Decay chưa phù hợp, dòng quá cao | Đổi chế độ decay, giảm dòng 10–20 % |
12. Câu hỏi thường gặp về điều khiển động cơ bước lưỡng cực
- Có thể điều khiển động cơ bước lưỡng cực trực tiếp bằng chân Arduino không? Không. Chân GPIO chỉ cấp được khoảng 20–40 mA và không đảo chiều dòng được; cuộn motor cần hàng trăm mA đến vài ampe, dòng đảo chiều qua cầu H. Luôn cần ít nhất một driver cầu H kép, tốt nhất là IC có băm dòng như A4988, DRV8825 hay TMC2209.
- Xung STEP có cần đúng tỉ lệ 50 % mức cao, 50 % mức thấp không? Không cần. Driver chỉ đếm cạnh lên, miễn là độ rộng mức cao và mức thấp đều lớn hơn giá trị tối thiểu (1 µs với A4988, 1,9 µs với DRV8825). Nhiều bộ điều khiển phát xung cao vài micro giây cố định, phần thấp thay đổi theo tốc độ.
- Vì sao đặt vi bước 1/256 mà motor vẫn không chạy mượt hơn 1/16 trên TMC2209? Khi bật nội suy, TMC2209 đã tự chia mỗi vi bước 1/16 thành 1/256 bên trong, nên chuyển động gần như giống nhau. Đặt 1/256 thật chỉ làm tần số xung cần phát tăng 16 lần, dễ vượt khả năng vi điều khiển.
- StealthChop hay SpreadCycle tốt hơn cho máy CNC mini? Trục X/Y của CNC phay chịu lực cắt thay đổi nên SpreadCycle an toàn hơn vì giữ mô-men và phản ứng tải tốt. StealthChop hợp khi cần im lặng và tải nhẹ, đều; có thể kết hợp bằng ngưỡng TPWMTHRS để chạy êm ở tốc thấp và chuyển SpreadCycle khi chạy nhanh.
- TMC2209 về gốc bằng StallGuard có thay hoàn toàn công tắc hành trình được không? Với máy in 3D, máy khắc laser, rèm tự động, cơ cấu không cần gốc quá chính xác thì được. Với máy cần lặp lại gốc cỡ 0,01 mm, trục đứng nặng hoặc trục qua hộp số lớn, nên giữ công tắc quang hoặc công tắc cơ.
- Có thể nối nhiều driver TMC2209 chung một đường UART không? Được tối đa 4 driver, mỗi driver đặt một địa chỉ khác nhau bằng chân MS1/MS2 (0–3). TMC2208 không có địa chỉ nên mỗi driver cần đường UART riêng.
- Vì sao motor kêu rít khi đứng yên dù không có xung STEP? Driver vẫn băm dòng giữ, và khi tần số băm rơi vào dải nghe được hoặc dòng giữ đặt quá cao, cuộn dây phát tiếng. Thử giảm dòng giữ (ihold trên TMC), đổi chế độ decay hoặc bật StealthChop, vốn gần như im lặng khi đứng yên.
- Hai motor lưỡng cực chạy song song cho một trục (như trục Z hai vít me) có dùng chung một driver được không? Được nếu đấu nối tiếp hai motor và driver đủ điện áp, hoặc đấu song song khi driver đủ dòng gấp đôi. Cách an toàn hơn là mỗi motor một driver nhận chung tín hiệu STEP/DIR, giúp cân dòng chính xác và có thể tự cân trục bằng về gốc riêng.
- Thư viện Stepper mặc định của Arduino có dùng được với A4988 không? Không phù hợp, vì thư viện Stepper đóng cắt trực tiếp bốn dây pha cho mạch cầu H trần, không phát tín hiệu STEP/DIR và không có gia tốc. Với A4988, DRV8825, TMC, dùng AccelStepper ở chế độ DRIVER hoặc FastAccelStepper.
- Driver TMC5160 có cần vi điều khiển phát xung STEP không? Không bắt buộc. Ở chế độ motion controller, TMC5160 tự tạo profile và phát chuyển động theo lệnh vị trí ghi qua SPI; vi điều khiển chỉ cần gửi đích và đọc trạng thái. Nếu muốn, vẫn có thể dùng TMC5160 như một driver STEP/DIR thông thường.






