PID算法快速上手

发布于 2022-05-05  418 次阅读


这个文章本来是我几周前就准备更的,最近比较忙,所以现在才更新,大家刚接触PID闭环控制的时候可能会比较懵,不知道P,I,D这三个是什么东西,但只要搞懂它是什么的时候其实也没有那么难理解。

那么我就以位置式公式先给大家大概讲讲他们都充当着什么角色,都有哪些作用。

PID位置式:

Kp:比例控制算法

打个比喻,m是我电机转速的目标,z是我当前的速度,e是当前转速与目标转速的差,u为减小误差而去要调节值,那么电机当前转速z会慢慢加上u这个调整值,来接近目标转速m。既 u=Kp*e。

Ki: 积分控制算法

单用上面的算法,当前转速和目标转速会有一定的误差,这个误差称为静态误差,比如目标转速m是10,而我们每次调节的转速u为3,你会发现,我们当前的转速z调节到9的时候,再加个3就大于目标速度m了,中间这点误差就要靠积分控制算法去消除了。所以比例+积分控制算法为:
u=kp*error+ ki∗∫error ,∫error为历史所有误差之和。

Kd: 微分控制算法

如果转速调整过快,然而误差却很小,可能会出现刹不住的情况,调整过头,达不到我们理想的状态,我们这时需要加入一定的阻力,防止它过度调整,而微分控制就是这个阻力。微分,说白了在离散情况下,就是error的差值就是t时刻和t-1时刻e的差,即u=kd*(e(t)-e(t-1),可以看到,在刹车过程中,因为是越来越小的,所以这个微分控制项一定是负数,当调整速越快,且距离目标值越小,阻力越大。

代码实现

位置式

e(k) = 目标转速 - 当前转速;
P = kp*e(k);                         
I += ki*e(k);  
D = kd*((e(k) - e(k-1))/dt);  //previous_error上次误差
PID=P + I + D ;                 
e(k-1) = e(k);//更新上次误差

增量式

增量PID公式

PWM+=Kp×[e(k)-e(k-1)]+Ki×e(k)+Kd×[e(k)-2e(k-1)+e(k-2)]

增量式离散PID
参考资料: 
增量式离散PID公式:
PID+=Kp*[e(k)-e(k-1)]+Ki*e(k)+Kd*[e(k)-2e(k-1)+e(k-2)]
e(k):本次偏差
e(k-1):上一次偏差
e(k-2):上上次偏差
在速度闭环控制系统里面我们只使用PI控制,因此对PID公式可简化为:
PID+=Kp*[e(k)-e(k-1)]+Ki*e(k)
e(k):本次偏差
e(k-1):上一次偏