开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2024.01.20浙江
PID(Proportional-Integral-Derivative)控制算法是一种经典的反馈控制方法,广泛应用于自动控制系统,例如温度控制、速度控制、位置控制等。
PID控制算法的核心包含三个部分:比例项(P),积分项(I),和微分项(D)。它们分别对系统的当前误差、过去误差的积累和误差的变化率进行响应。PID控制器的输出由这三部分的加权和组成。
其中,e就是当前误差,Kp、Ki和Kd分别是比例、积分和微分的调节系数。
大白话理解就是如下:
让我们结合一个简单的温度控制的案例来理解一下现实工程应用中如何实现PID控制。假设你有一个电热器,你想让它保持在40摄氏度。你可以用PID算法来调整它的加热功率。
让我们看一下如何用C语言实现PID控制。我们用C语言代码实现上面的让水温保持在40摄氏度的控制算法代码如下:
我们来解释一下代码,main函数中setpoint就是温度目标值,我们目标水温是40摄氏度,所以我们这里是40。current_value就是温度实际当前值。prev_error是记录上一次的温度误差。integral记录所有累积误差值。kp,ki和kd分别是三个控制项的权重比例系数,我们就是通过调节这三个参数来到较好的控制效果。dt是控制周期为1s。for循环次数变量i就是是控制周期次数,在这里我们只是简单给个10次。每一次循环我们都调用compute_pid函数来计算误差输出。compute_pid函数就是核心代码,实现了PID算法,下面我们来看看如何计算的,需要结合上面的数学公式理解:
第4行,doubleerror=setpoint-current_value;这是将目标值减去当前温度值得到的error是当前时刻的温度误差。
第9行,就是总输出计算,三个误差控制项分别乘以自己的权重比例系数,最终将三个误差控制项叠加输出。
第30行就是将本次周期的误差控制输出叠加到实际当前温度值,起到调节当前温度的目的。
到此我们就完全学会了通过C代码简单实现PID控制。
通过上面你可以知道,PID算法公式固定,其实代码实现工程中应用中也基本上是通用固定的,所以实现不难,难就难在如何调参?如何通过调整kp,ki,kd三个误差控制项的权重系统值,让你的控制效果达到最佳状态。
调整PID的三个参数就像是调整你做菜的火候一样,需要一些经验。这里有一些宝贵的通用调参思路:
下面我们结合曲线图来展示一下调参的大概过程。
1.这是上面C代码的默认参数,Kp=0.05,Ki=0.01,Kd=0.5,当前实际温度输出曲线如下:
图中红色水平线是目标值40,蓝色线是温度实际输出值,下面所有曲线图都一样。
我们可以看到Kp比例系数过小导致温度10个控制周期结束也未达到40摄氏度。
下面要加大kp。
2.将Kp=0.5,其他不变,Ki=0.01,Kd=0.5,曲线如下:
可以看到结果过冲了,第一个温度值直接大于40度了,后面一直震荡,这样肯定不行。
3.将Kp=0.3,其他不变,Ki=0.01,Kd=0.5,曲线如下:
可以看到这个比例调节响应就比较合适,而且快速稳步最终温度接近40。
4.Kp=0.3差不多,我们调整一下ki,Ki=调整为0.1,Kd=0.5,曲线如下:
可以看到明显积分项过于调整,其实上一次默认ki=0.01的时候,我们看到累积误差最后非常小,0.01这个值本身已经比较合适了,现在放大10倍积分项,一下子就过调了,让大家了解一下过调是什么样子的,这里我们将ki改回到0.01,ki就不做调整了。
5.Kp=0.3,Ki=0.01,下面我们看一下温度值在靠近40度的过程中,温度值的震荡非常大,这个应该是微分项权重过大,导致变化率影响过于敏感,我们减小点kd系数,调整为Kd=0.2;曲线如下:
可以看到Kd调小之后,效果好很多,整个响应曲线光滑很多,震荡非常小了。
当然到此,调参工作其实还是没结束,因为通过调节还能达到更好的效果,这里我就不继续下去了,以此几步调参基本给大家展示一下调参大概过程,相信通过以上过程大家对调参有个更加直观深刻的体会了。
控制领域有句话,控制算法工程就是调参大师,这句话虽然有点嘲讽但是是大实话,不过记住一点,调参能调到一个比较好的效果前提是你要深刻理解算法思想。