PID算法入门笔记

PID算法入门笔记(一)

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)+Ti10te(t)dt+Tddtde(t)]

  • 位置式PID

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=0ke(i)dt+TdTe(k)e(k1)]

代码如下:

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)
}

本人在实际应用上现在的位置式程序出现了一点问题,当输出实际值一直没达到目标值得时候,偏差和(积分)会一直累加,导致程序跑飞,所以又加上积分限幅。

  • 增量式PID

Δ 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(k1)+TiTe(k)dt+TdTe(k)2e(k1)+e(k2)]

代码如下:

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)
}

你可能感兴趣的:(学习笔记,算法,算法)