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:
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.
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ậ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.