Báo cáo:
- Một chu kỳ lệnh đếm encoder mất 6us
- Một chu kỳ lệnh tính PID mất 90us.
Về lý thuyết khi dùng ngắt (interrupt)
Nếu encoder là 1000ppr thì vận tốc maximum mà vlx đếm không sai (bỏ khã năng nhiểu) là <10000rpm. Nên việc đếm encoder là không phải lo.
Tuy nhiên.. cuộc chơi không chỉ có vậy, ngoài việc đếm encoder thì còn phải tính PID... An toàn nhất là thời gian giữa 2 lần đếm encoder phải bao gồm luôn thời gian tính PID. Khi đó tổng thời gian cần là 96us. Vẫn với encoder 1000ppr thì vận tốc max đạt được là <625rpm.
* 1000ppr -- < 625 rpm
* 500ppr -- < 1250 rpm
* 250ppr -- < 2500 rpm
Nhìn vào thấy quá chậm. Tại sao chậm.. từ đầu bác Nhất Sơn & Gamo đã chỉ rỏ.
- Tốc độ của vxl chậm, mà phần lớn các phép toán dều tính trên fload (4byte) nên mất nhiều thời gian xử lý và tính toán.
- Arduino dùng atmega328, không tích hợp module đếm encoder nên mất thêm thời gian xử lý đếm encoder.
- Dùng ngắt (interrupt) nên thời gian đếm encoder được ưu tiên, do đó càng mất nhiều thời gian khi vận tốc motor lớn. Theo tính toán ở trên thì với encoder 1000ppr, nếu motor chạy >625rpm thì vxl sẽ chỉ tập trung vào xử lý đếm encoder, lơ là việc tính PID, vận tốc tiếp tục tăng nhanh sẽ bỏ qua luôn việc tính PID.
Chuyển qua đọc encoder bằng counter thì tốc độ & độ kiểm soát có thể được cải thiện.. lại cần time, nên cứ từ từ
.
Em tối ưu được mô hình điều khiển chạy trên chip rùa.. mà Ok thì.. nâng lên ARM thì chắc phải chạy xé gió bác Gamo nhỉ
Bác Nhất Sơn có thể góp ý giúp.. vụ đo dòng trên motor (hoặc trên cuộn dây) với ạ. Nếu dùng chính vxl và kênh AD có sẵn thì có thể đo được ko?