本系列旨在以我本身写的PID lib为例,讲一下PID的几点基本优化,PID的基本原理网上有不少资料,所以本系列将不会涉及PID的基本实现原理,在这里特别推荐Matlab tech talk的PID教程:https://ww2.mathworks.cn/videos/series/understanding-pid-control.html。html
因为笔者大一在读,尚未学习自动控制原理等课程,所以本系列将不会从自控原理角度展开,相反的,本系列将试图从“直觉”展开,经过直观的描述让你们从直觉上感觉并理解PID的一些包括微分先行、积分分离等基础的优化。算法
因为笔者水平有限,文中不免存在一些不足和错误之处,诚请各位批评指正。ide
个人PID库与PID基本优化(一)中讲解了代码结构与代码使用,算法有关内容于该篇开始学习
积分项的做用在绝大多数状况下是消除静差,为了更精准的消除静差,咱们须要提升积分项的计算精度。在通常的PID算法中,咱们经过矩形面积来近似计算积分,在微积分中咱们了解到,当 \(\Delta t\) 趋近于无穷小时,这些矩形面积的累加就会无限逼近曲线与坐标轴围成的面积。优化
为了达到更精准的控制,咱们通常能够经过提升控制频率来实现,但在某些状况下受制于控制设备算力,咱们没法以很高的频率来运行咱们的算法。所以咱们能够用梯形代替矩形,以此得到更高的积分精度,这种方式在控制频率越低的场合提升精度的效果越好。spa
static void f_Trapezoid_Intergral(PID_TypeDef *pid) { pid->ITerm = pid->Ki * ((pid->Err + pid->Last_Err) / 2); }
在常规PID中,微分项是微分系数乘偏差的微分,而偏差的微分又能够化成目标信号的微分减去输入(测量值)的微分,即:code
当目标信号瞬间发生变化时,其微分会变得很是很是大,这会致使微分项的值也在瞬间变得巨大。这样异常的微分项添加至控制算法中,会致使PID的输出出现咱们不但愿看到的峰值,这样的峰值可能会影响系统的稳定性,甚至对执行器或者系统其余部分形成损坏,咱们称这种现象为微分冲击(Derivative Kick)。htm
以下图所示,微分冲击会使被控对象发生瞬间的抖动,经过观察PID输出与微分项输出,咱们能够直观感觉到微分冲击的威力:对象
将图像2放大来看,在阶跃信号刚产生时,微分项会给整个输出带来巨大的尖峰:blog
经过公式咱们能够看到,是目标信号的微分引入的异常数值,所以咱们只须要扔掉目标信号的微分,只保留输入(测量值)的微分(注意不要漏掉符号):
通过对微分项的一点点调整,咱们能够看到,如今的控制曲线变得更加平滑,PID的输出也不会出现异常的峰值:
static void f_Derivative_On_Measurement(PID_TypeDef *pid) { pid->Dout = pid->Kd * (pid->Last_Measure - pid->Measure); }