-
Little PLC
Cách viết PID như thế nào là hay?!
Chào mọi người.
Hiện nay mình có giải thuật PID từ một số chỗ để viết khối PID như thế nào cho hay thì mình đưa ra một số nhờ mọi người tư vấn giúp:
Code C chuẩn theo giải thuật PID từ lý thuyết:
output = Kp * err + (Ki * int * dt) + (Kd * der /dt);
Kp = Proptional Constant.
Ki = Integral Constant.
Kd = Derivative Constant.
err = Expected Output - Actual Output ie. error;
int = int from previous loop + err; ( i.e. integral error )
der = err - err from previous loop; ( i.e. differential error)
dt = execution time of loop.
Cái này thì cách viết từ VĐK mình copy lại:
/*u=kp*(e+Td*diff(e)+Td*int(e))
y0=analog input 1;
r0=ref=set point or reference;
T=sample time;
qd=diff constant=Kp*Td/T; //Td:diff time
qi=integral cosntant=Kp*T/Ti; //Ti:Integration time
Kp=prop gain;*/
float pid (float r0, float y0)
{
e0=r0-y0;
D=qd*(e0-e1);
if (((u>umin)|(e>0))&((u<umax)|(e<0))) //antiwindup integral
I=I+qi*(r0-y0);
u=Kp*e0+D+I;//pid control signal
if (u>umax) u=umax; //antiwindup PID
if (u<umin) u=umin;
e1=e0; //save old values
y1=y0;
}
PID đơn giản:
Simple PID
PID = GainP * actual error + GainI * SUM(previous errors) + GainD * (actual error - last error)
error = sp(set point) - pv(process value)
float pid (float sp, float pv)
{
err_old = err;
err = sp - pv;
// note
P_err = err;
I_err += err_old;
D_err = err - err_old;
return 0.1*P_err + 0.3*I_err + 0.02*D_err;
}
Nói chung là khá nhiều. Nhưng mình cảm thấy mình viết khác chứ nhìn lại vẫn là 1 thứ. ^^. Nên mong các bạn nào thiên về giải thuật tư vấn giúp.
-
Bài viết của "tran_hieu0983" đã được cám ơn bởi các thành viên:
Tag của Chủ đề này
Quyền viết bài
- Bạn Không thể gửi Chủ đề mới
- Bạn Không thể Gửi trả lời
- Bạn Không thể Gửi file đính kèm
- Bạn Không thể Sửa bài viết của mình
-
Nội quy - Quy định
Back to Top
Múi giờ GMT +7. Bây giờ là 04:10 PM.
Phiên bản 4.2.5
Phát triển bởi thành viên PLCVietNam®.
Đánh dấu