[Điều khiển PID chuẩn]Các bạn đã hiểu sai về PID

cenakhoa

em thích màu hồng
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ơ):

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
và đây là code PID đúng như nó lẽ ra nên được viết:

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.
Giải thích: Bộ trước có thành phần I cộng dồn theo cấp số cộng, không giảm tính tổng quát, giả sử điều khiển PID vị trí, Setpoint = 3000, vận tốc hiện thời bằng không. Bộ PID thứ nhất có thành phần I luôn dương theo thời gian và càng ngày càng lớn ngược lại bộ PID thứ hai có thành phần I càng ngày càng nhỏ và phù hợp hơn. Do đó nếu như Setpoint của các bạn cao (trong trường hợp điều khiển vị trí hoặc điều khiển vận tốc với encoder xịn nhiều xung), sai số tích lũy cộng dồn sẽ rất lớn, lớn đến một mức nào đó mà khi đã xác lập rồi thành phần I vẫn dương dẫn đến vọt lố, sau một thời gian vọt lố, thành phần I mới giảm dần về trạng thái cân bằng. Ngoài ra dựa theo công thức còn rất nhiều trường hợp nữa mà bộ PID viết sai thể hiện nhược điểm, các bạn có thể trải nghiệm thêm.

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.
 

tuane06

Trứng gà
hix, đây chính là câu trả lời cho câu hỏi PID là gì từ xưa đến giờ của mình và cũng là cơ sở để chuyển từ lý thuyết sang thực tế, cảm ơn bác chủ nhiều, em còn phải đọc tài liệu dài dài nữa mới mong hiểu hết vấn đề bác đã đề cập, dù sao cũng có hướng đi cho mình chứ ko còn bị mông lung mò mẫm nữa
 
Nên chuyển code sang dạng MAC để tính toán cho nhanh nếu cpu có hỗ trợ. Công thức rút gọn thì dễ nhìn đối với con người nhưng khó nhìn đối với máy tính. :)
 

40701002

Thành Viên PIF
Đã làm từ lúc đồ án 1 (điều khiển lò nhiệt). Nhưng chia sẻ như bạn thì chưa bao giờ vì nghĩ ai cũng như mình :). Bây giờ thì đã hiểu
 

cenakhoa

em thích màu hồng
Nên chuyển code sang dạng MAC để tính toán cho nhanh nếu cpu có hỗ trợ. Công thức rút gọn thì dễ nhìn đối với con người nhưng khó nhìn đối với máy tính. :)
dạng MAC là sao bác, xin thỉnh giáo các một chút (y)
 

chung

Trứng gà
cho mình hỏi, các số Kp, Ki, Kd lúc setup thường nằm từ khoảng nào tới khoảng nào vậy mọi người. Mình ko biết con số cụ thể nên ko biết setup thế nào để cân chỉnh
 

hmtuong

Trứng gà
Theo ý kiến của mình, bạn cenakhoa hiểu chưa cặn kẽ rồi. Tùy theo phương pháp tính gần đúng mà hàm rời rạc của bộ PID sẽ khác nhau. Code PID rời rạc trên mạng thường là làm gần đúng theo phương pháp Euler, còn cách làm gần đúng trong sách DKTD là phương pháp trapezoidal.
Ví dụ, phương pháp Euler gần đúng khâu tích phân là: Ki*Ts*[1/(z-1)]
còn theo phương pháp trapezoidal: Ki*Ts/2*[(z+1)/(z-1)]
Vì vậy, tùy theo yêu cầu mà chúng ta dùng phương pháp gần đúng cho phù hợp.
 
Top