PID方程如下
U ( t ) = K p ∗ [ e ( t ) + 1 T i ∫ 0 t e ( t ) d t + T d d e ( t ) d t ] U(t) = K_p*[e(t)+\cfrac{1}{T_i}\int_0^te(t)dt+T_d\cfrac{de(t)}{dt}] U(t)=Kp∗[e(t)+Ti1∫0te(t)dt+Tddtde(t)]
U ( k ) = K p ∗ [ e ( k ) + T T i ∑ i = 0 k e ( i ) d t + T d e ( k ) − e ( k − 1 ) T ] U(k) = K_p*[e(k)+\cfrac{T}{T_i}\displaystyle\sum_{i=0}^ke(i)dt+T_d\cfrac{e(k)-e(k-1)}{T}] U(k)=Kp∗[e(k)+TiTi=0∑ke(i)dt+TdTe(k)−e(k−1)]
代码如下:
int Kp,Ki,Kd; //比例,积分,微分系数,需要根据实际情况设定
float max,min;
void PID_Position(float target,float actual)
{
float Error,Sum_error=0,D_error;
float Last_error; //e(k-1)
Error=target-actual; //当前偏差 e(k)
Sum_error+=error; //偏差和
D_error=Error-Last_error; //e(k)-e(k-1)
Last_error=Error; //新的偏差为e(k)
return (Kp*Error+Ki*Sum_error+Kd*D_error);//最后返回u(k)
}
本人在实际应用上现在的位置式程序出现了一点问题,当输出实际值一直没达到目标值得时候,偏差和(积分)会一直累加,导致程序跑飞,所以又加上积分限幅。
Δ U ( k ) = K p ∗ [ e ( k ) − e ( k − 1 ) + T T i e ( k ) d t + T d e ( k ) − 2 e ( k − 1 ) + e ( k − 2 ) T ] \Delta U(k) = K_p*[e(k)-e(k-1)+\cfrac{T}{T_i}e(k)dt+T_d\cfrac{e(k)-2e(k-1)+e(k-2)}{T}] ΔU(k)=Kp∗[e(k)−e(k−1)+TiTe(k)dt+TdTe(k)−2e(k−1)+e(k−2)]
代码如下:
int Kp,Ki,Kd;
float max,min;
void PID_Delta(float target,float actual)
{
float Error,Sum_error=0,D_error;
float Last_error,Pre_error;
Error=target-actual; //当前偏差 e(k)
D_error=Error-Last_error; //积分项 e(k)-e(k-1)
Sum_error=Error-2*Last_error+Pre_error; // e(k)-2e(k-1)+e(k-2)
Pre_error=Last_error;
Last_error=Pre_error;
return (Kp*D_error+Ki*Error+Kd*Sum_error); //delta u(k)
}