Chào các bạn, các em,
Qua kì thi Raise Your Arm 2013 vừa qua, mình có đọc một số code của vài team dự thi, mình thấy có vài điều bất ổn về code PID của các bạn, PID là một bộ điều khiển rất dễ và thâm niên gần 100 tuổi nhưng chắc chắn viết đúng code PID trong NƯỚC TA chỉ đếm trên đầu ngón tay, đa số là các bạn copy paste code vì quá khinh thường bộ điều khiển này. Sở dĩ mình nhận ra ngay các bạn copy paste code PID vì code này mình cũng từng dùng rồi, nhưng sau này nhận ra là nó sai, nó chỉ "có vẻ" đúng vì bộ PID khá đơn giản và code được áp dụng trong môi trường thí nghiệm, chứ nếu để ngoài thực tế nó SẼ bộc lộ nhiều điểm yếu.
Đầu tiên các bạn hãy download tài liệu cơ sở tự động của thầy Huỳnh Thái Hoàng, mục thiết kế PID rời rạc theo link sau:
http://www4.hcmut.edu.vn/~hthoang/cstd/Chuong9_CSTD.pdf
Đây là code cũ PID mà 99% mà các bạn dùng (E hay error là sai số giữa giá trị đặt và giá trị hiện tại, U hay Out là giá trị PWM điều khiển động cơ):
và đây là code PID đúng như nó lẽ ra nên được viết:
Còn đây là cơ sở khoa học mình viết để khẳng định những điều trên là đúng (các bạn phải đọc tài liệu ở trên mới hiểu được mấy dòng sau đây):
Note: T là thời gian lấy mẫu để điều khiển. G(s) là hàm truyền liên tục của bộ PID, G(z) là hàm truyền rời rạc của bộ PID theo lý thuyết rời rạc hóa của hai khâu tích phân và vi phân, còn z^-1 nhân cho một tín hiệu sẽ là tín hiệu ấy trong lần lấy mẫu trước đó theo môn xử lý số tín hiệu. Những công thức sau chỉ là khai triển đơn giản của công thức ban đầu, các bạn có thể tự tin xem hết, hiểu hết.
Hi vọng sau bài viết này ai cũng viết đúng PID nhé. Hãy test , chia sẻ và reply
Cập nhật: Bộ điều khiển hoạt động tốt với giải thuật mà mình đề ra, đã test trên nhiều mô hình. Bạn nào gặp hiện tượng output ngược dấu setpoint thì đảo 2 chân encoder lại.
Qua kì thi Raise Your Arm 2013 vừa qua, mình có đọc một số code của vài team dự thi, mình thấy có vài điều bất ổn về code PID của các bạn, PID là một bộ điều khiển rất dễ và thâm niên gần 100 tuổi nhưng chắc chắn viết đúng code PID trong NƯỚC TA chỉ đếm trên đầu ngón tay, đa số là các bạn copy paste code vì quá khinh thường bộ điều khiển này. Sở dĩ mình nhận ra ngay các bạn copy paste code PID vì code này mình cũng từng dùng rồi, nhưng sau này nhận ra là nó sai, nó chỉ "có vẻ" đúng vì bộ PID khá đơn giản và code được áp dụng trong môi trường thí nghiệm, chứ nếu để ngoài thực tế nó SẼ bộc lộ nhiều điểm yếu.
Đầu tiên các bạn hãy download tài liệu cơ sở tự động của thầy Huỳnh Thái Hoàng, mục thiết kế PID rời rạc theo link sau:
http://www4.hcmut.edu.vn/~hthoang/cstd/Chuong9_CSTD.pdf
Đây là code cũ PID mà 99% mà các bạn dùng (E hay error là sai số giữa giá trị đặt và giá trị hiện tại, U hay Out là giá trị PWM điều khiển động cơ):
Code:
Error_value = Set_Position - Position;
P_part = Kp * Error_value;
I_part += Ki * Error_value / T;
D_part = Kd * (Error_value - pre_Error_value) * T;
out+= P_part + I_part + D_part;
pre_Error = Error
Code:
P_part = Kp*(Error - pre_Error);
I_part = 0.5*Ki*T*(Error + pre_Error);
D_part = Kd/T*( Error - 2*pre_Error+ pre_pre_Error);
Out = pre_out + P_part + I_part + D_part ;
pre_pre_Error = pre_Error
pre_Error = Error
pre_Out = Out
- Bộ PID sau phụ thuộc vào cả những thông số trước đó nên rõ ràng tính thích nghi cao hơn.
- Bộ PID trước CHẮC CHẮN sẽ có vọt lố còn bộ PID sau thì chưa chắc. Cũng vì lý do này, các bạn cho hệ số I quá nhỏ, nhỏ đến mức bộ PID trở thành P hoặc PD mà các bạn vẫn đinh ninh là đang làm PID, ảnh hưởng đến chất lượng của bộ điều khiển.
Còn đây là cơ sở khoa học mình viết để khẳng định những điều trên là đúng (các bạn phải đọc tài liệu ở trên mới hiểu được mấy dòng sau đây):
Note: T là thời gian lấy mẫu để điều khiển. G(s) là hàm truyền liên tục của bộ PID, G(z) là hàm truyền rời rạc của bộ PID theo lý thuyết rời rạc hóa của hai khâu tích phân và vi phân, còn z^-1 nhân cho một tín hiệu sẽ là tín hiệu ấy trong lần lấy mẫu trước đó theo môn xử lý số tín hiệu. Những công thức sau chỉ là khai triển đơn giản của công thức ban đầu, các bạn có thể tự tin xem hết, hiểu hết.
Hi vọng sau bài viết này ai cũng viết đúng PID nhé. Hãy test , chia sẻ và reply
Cập nhật: Bộ điều khiển hoạt động tốt với giải thuật mà mình đề ra, đã test trên nhiều mô hình. Bạn nào gặp hiện tượng output ngược dấu setpoint thì đảo 2 chân encoder lại.