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:
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.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;
}
Đánh dấu