Chọn Encoder: độ phân giải bao nhiêu là đủ cho odometry?
Atlasbot · 17/8/2026 · 12 phút đọc
Bài Encoder đã giải thích nguyên lý quadrature encoder. Nối tiếp bài Chọn Motor, câu hỏi bây giờ là: động cơ đã chọn xong (RPM đã biết) — cần encoder độ phân giải bao nhiêu để odometry đủ mượt mà không lãng phí tài nguyên xử lý ngắt trên MCU?
Khái niệm chính
Chọn độ phân giải encoder là bài toán cân bằng 2 chiều đối lập:
- Quá thấp — dữ liệu tốc độ tính từ encoder bị "giật cục", ảnh hưởng chất lượng vòng PID
- Quá cao — tần số ngắt sinh ra vượt khả năng xử lý thời gian thực của MCU, gây mất xung đếm
Điểm khởi đầu quan trọng: độ phân giải cần quan tâm là độ phân giải hiệu dụng tại bánh xe, không phải thông số danh nghĩa của bản thân encoder.
Nguyên lý hoạt động
Nếu encoder gắn trước hộp số (trên trục động cơ, như đã bàn ở bài Encoder), độ phân giải hiệu dụng tại bánh xe được nhân thêm tỉ số truyền hộp số:
độ_phân_giải_hiệu_dụng = xung_encoder_mỗi_vòng × tỉ_số_truyền_hộp_số
Ví dụ encoder 12 xung/vòng (khá thấp), hộp số tỉ số 1:150 — độ phân giải hiệu dụng tại bánh xe là 12 × 150 = 1800 xung/vòng, đủ mượt dù bản thân encoder có độ phân giải danh nghĩa thấp. Đây là lý do nhiều động cơ giảm tốc giá rẻ (gear motor) vẫn cho odometry đủ tốt dù encoder tích hợp có vẻ "yếu" trên giấy tờ.
Mỗi xung encoder thường kích hoạt một ngắt (interrupt) trên MCU để đếm — tần số ngắt quá cao có thể chiếm hết thời gian xử lý của MCU, ảnh hưởng tới các tác vụ thời gian thực khác (như vòng PID đã học ở bài PID trong hệ thống điều khiển robot).
Kiến thức kỹ thuật
Công thức
Tần số ngắt tối đa sinh ra khi động cơ chạy ở tốc độ tối đa:
f_ngắt = (RPM / 60) × độ_phân_giải_hiệu_dụng × 4
(nhân 4 vì quadrature encoder tạo 4 sự kiện cạnh lên/xuống trên mỗi chu kỳ xung —
kỹ thuật "x4 decoding" phổ biến để tăng độ phân giải hiệu dụng mà không cần
đĩa encoder mịn hơn)
VD động cơ 120 RPM, độ phân giải hiệu dụng 1800 xung/vòng:
f_ngắt = (120/60) × 1800 × 4 = 14,400 ngắt/giây
Ngược lại, khoảng thời gian giữa 2 xung liên tiếp ở tốc độ thấp nhất cần vận hành — quá lớn sẽ gây "bậc thang" trong dữ liệu tốc độ đo được:
Δt_giữa_2_xung = 60 / (RPM_thấp_nhất × độ_phân_giải_hiệu_dụng)
Nếu Δt_giữa_2_xung lớn hơn đáng kể chu kỳ vòng lặp PID (ví dụ vòng PID chạy 100Hz = chu kỳ 10ms, nhưng 50ms mới có 1 xung mới), việc tính tốc độ tức thời từ encoder sẽ không cập nhật kịp trong nhiều chu kỳ liên tiếp — ảnh hưởng trực tiếp tới chất lượng điều khiển PID.
Thông số
| Độ phân giải hiệu dụng | Phù hợp |
|---|---|
| < 500 xung/vòng | Chỉ đủ cho robot tốc độ cao, không cần odometry chính xác |
| 500-2000 xung/vòng | Phổ biến cho AMR cỡ nhỏ-vừa, cân bằng tốt |
| > 2000 xung/vòng | Cần thiết cho ứng dụng đòi hỏi định vị rất chính xác, MCU đủ mạnh xử lý |
Ứng dụng thực tế
Với đa số dự án AMR nghiên cứu/DIY cỡ như các dự án showcase ở trang này, khoảng 1000-2000 xung/vòng hiệu dụng (thường đạt được nhờ tỉ số truyền hộp số, không cần encoder độ phân giải cao đắt tiền) là điểm cân bằng hợp lý — vừa đủ mượt cho odometry và PID, vừa nằm an toàn trong khả năng xử lý ngắt của các MCU phổ biến (STM32, ESP32) ngay cả khi cả 2-4 bánh cùng chạy tần số ngắt này đồng thời.
Ví dụ thực tế
So sánh 2 lựa chọn encoder cho cùng động cơ 120 RPM (max), 20 RPM (min khi chạy chậm):
Lựa chọn A: encoder 12 xung/vòng, hộp số 1:150 → độ phân giải hiệu dụng 1800 xung/vòng
- f_ngắt (max) = (120/60) × 1800 × 4 = 14,400 ngắt/giây → MCU xử lý tốt
- Δt_giữa_2_xung (min RPM) = 60/(20×1800) ≈ 1.7ms → đủ nhanh so với chu kỳ PID 10ms
Lựa chọn B: encoder 512 xung/vòng, hộp số 1:150 → độ phân giải hiệu dụng 76,800 xung/vòng
- f_ngắt (max) = (120/60) × 76800 × 4 = 614,400 ngắt/giây → VƯỢT khả năng hầu hết MCU
Kết luận: Lựa chọn A đã đủ mượt (bước 1.7ms << chu kỳ PID 10ms) — Lựa chọn B
"chính xác hơn trên giấy" nhưng thực tế gây quá tải ngắt, phản tác dụng
Lỗi thường gặp
- Chọn encoder độ phân giải càng cao càng tốt mà không kiểm tra tần số ngắt — như ví dụ Lựa chọn B ở trên, vượt khả năng xử lý MCU gây mất xung đếm, odometry sai lệch thay vì chính xác hơn.
- Chỉ kiểm tra tần số ngắt ở RPM tối đa mà bỏ qua độ mượt ở RPM tối thiểu — robot chạy chậm (đỗ chính xác, thao tác gần vật cản) cần kiểm tra riêng
Δt_giữa_2_xungở tốc độ thấp nhất dự kiến vận hành. - Quên nhân tỉ số truyền hộp số khi so sánh thông số datasheet encoder — dễ đánh giá nhầm một encoder "12 xung/vòng" là quá thấp trong khi độ phân giải hiệu dụng thực tế (sau hộp số) hoàn toàn đủ dùng.
- Không tính vòng PID cùng chạy trên nhiều bánh cùng lúc — với AMR 4 bánh (Mecanum), tổng tần số ngắt từ cả 4 encoder cộng dồn có thể đáng kể hơn nhiều so với tính riêng lẻ từng bánh.
Kết luận
Chọn encoder không phải "càng chính xác càng tốt" một cách vô điều kiện — cần cân bằng giữa độ mượt dữ liệu ở tốc độ thấp và khả năng xử lý ngắt thực tế của MCU ở tốc độ cao. Độ phân giải hiệu dụng (sau hộp số) mới là con số cần quan tâm, không phải thông số danh nghĩa của riêng encoder. Bài Chọn LiDAR tiếp theo áp dụng cách tư duy tương tự — cân bằng giữa độ chi tiết dữ liệu và khả năng xử lý thực tế — cho một cảm biến khác.