Cách hiệu chỉnh PID cho đối tượng lò nhiệt dân dụng

40701002

Thành Viên PIF
Chào các bạn,
Mình có một vấn đề thế này, mong các bạn góp ý giúp mình.
Đây là hàm pid mà mình đã viết cho tối tượng lò nhiêt:
Code:
double pid (double e0)
{
    double a0 = 0, a1 = 0, a2 = 0, u = 0;
    a0=Kp+Ki*T/2+Kd/T;
    a1=-Kp+Ki*T/2-2*Kd/T;
    a2=Kd/T;
    u=u_1+a0*e0+a1*e_1+a2*e_2;
    if(u>200) u = 200;
    if(u<0)    u = 0;
    u_1 = u;
    e_1 = e0;
    e_2 = e_1;
    return u;
}
Với T = 2 (giây) là chu kỳ lấy mẫu của lò nhiệt. Vấn đề đặt ra là cái tầm chặn Umax và Umin của pid. Như code ở trên, mình chặn 0 và 200. Hai con số này là do mình ước chừng sai số e với các hệ số Kp,Ki,Kd mà chọn đại.Tiếp theo, mình nhân u * 10000 để tạo ra khoảng từ 0us đến 2000000us (từ 0 đến 2s). Đây cũng chính là duty cycle của một xung PWM có chu kỳ 2s. Sau đó, xung này mình đưa vào đóng cắt triac.
Vậy, cách chặn Umax, Umin của mình đã đúng chưa ?
Mình đặt T = 150 độ, thì thấy khi nhiệt độ tăng từ 0 đên < 150, lò luôn đóng, tức duty cycle = 100% (2000000us). khi nhiệt độ lò > 150 thì lò OFF. Điều lạ lùng là không có vọt lố hoặc vọt lố rất ít, còn xác lập không được cứ quanh quẩn giá trị 150 --> giống ON-OFF chứ không phải PID -->:((.
Và đây là kết quả điều khiển.

 

tungbk

Cố Vấn CLB
Staff member
Nhìn chung thì thấy code PID ok.
Lò luôn đóng có thể do Kp lớn --> PID dễ rơi vào bão hòa (Umax, Umin). Mình có thể thử bằng cách cho Kd, Ki về 0 hết; Set nhiệt độ thấp thôi (khỏi phải chờ lâu và để cho PID k vào vùng bão hòa Umax, Umin) rồi cho Kp lớn lên, thường thì nó sẽ ra hình vọt lố. Thêm nữa anh thử coi lại code phần sai số tính đúng k?
 

40701002

Thành Viên PIF
Đã sửa được rồi, thanks tùng nha.
Phát hiện ra một điều là cái lò nó không kín (lò nướng gà, tmax = 450 độ). Nếu điều khiển dưới 150 độ, thì nó có vọt lố, nhưng trên 150 thì do chênh lệch nhiệt độ lò và môi trường lớn --> thất thoát nhiệt ra rất lớn --> không có vọt lố hoặc vọt lố rất ít.
Cái tầm chặn Umax, Umin phụ thuộc vào cách mình chọn hệ số Kp,Ki,Kd và phạm vi điều khiển.
Tạo pwm với T = 2s dùng timer1 của pic16f877a thật là vãi hàng, nhưng bên cao thắng ko dùng pic16f877a thì không biết dùng con nào nữa !!!???.
 
Top