文章目录
前言
见《【研发日记】Matlab/Simulink技能解锁(五)------七个Simulink布线技巧》
见《【研发日记】Matlab/Simulink技能解锁(六)------六种Simulink模型架构》
见《【研发日记】Matlab/Simulink技能解锁(七)------两种复数移相算法》
见《【研发日记】Matlab/Simulink技能解锁(八)------分布式仿真》
见《【研发日记】Matlab/Simulink技能解锁(九)------基于嵌入式处理器仿真》
项目背景
近期在一个嵌入式项目中用到了PID控制,利用周末时间对PID调参的一些基本规律和技巧总结一下。该项目的整体框架如下示例:
参数P调节
为了更好地说明参数P,先把参数I和参数D设置为0,即不引入积分项和微分项,示例如下:
参数P为1的初始状态,控制效果如下所示:
从上图中可以看出,DCDC的输出电压U在目标值100V的上下剧烈的震荡,而且PID的控制输出也变化幅度非常大(理论值应该在30左右才是合理的),判断原因是参数P为1太大了,所以下面开始调整参数P值。
第一次直接把参数P调小到1/10,即0.1,控制效果如下所示:
从上图中可以看出,DCDC的输出电压U和PID的控制输出,震荡幅度相比初始状态已经减小了很多,而且能逐渐收敛到恒定值,说明前面参数P的调整是有效的。但是目前的震荡幅度还是不合格,所以要继续调整参数P。
第二次再把参数P调小到1/10,即0.01,控制效果如下所示:
从上图中可以看出,DCDC的输出电压U和PID的控制输出,震荡幅度相比前一次又大幅减小了,目前的震荡幅度暂时可以接受了,待后续微调优化。
参数I调节
前面参数P暂定下来之后,就可以调整参数I了。下面基于P=0.01、D=0继续调试,参数I也从初始值1开始调试,初始控制效果如下所示:
从上图中可以看出,DCDC的输出电压U,长时间与目标值100V之间保持较大的差距,差值的积分面积已经很大了,但是PID的控制输出仍然停留在较小值,判断原因是参数I为1太小了,所以下面开始调整参数I。
第一次直接把参数I调大到10倍,即10,控制效果如下所示:
从上图中可以看出,DCDC的输出电压U,与目标值100V之间的差距缩小的时间大幅减少了,说明前面对参数I的调整是有效的。但是目前的差距缩小速度还是不合格,所以要继续调整参数I。
第二次再把参数P调大到10倍,即100,控制效果如下所示:
从上图中可以看出,DCDC的输出电压U,与目标值100V之间的差距缩小的时间,相比前一次又大幅减小了,目前的逼近速度暂时可以接受了,待后续微调优化。
参数D调节
前面参数P和参数I暂定下来之后,就可以调整参数D了。下面基于P=0.01、I=100继续调试,参数D也从初始值1开始调试,初始控制效果如下所示:
从上图中可以看出,第一个周期的目标值100V刚建立起来时,产生的差值微分量就让PID的控制输出达到了饱和值100。后面的DCDC的输出电压U不管变化幅度大或小都会让PID的控制输出为0和100的饱和值。判断原因是参数D为1太大了,所以下面开始调整参数D。
第一次直接把参数I调小到1/10,即0.1,控制效果如下所示:
从上图中可以看出,第一次调整参数D的效果与初始效果基本一样,判断原因是PID的控制输出仍未进入饱和范围0和100之间,所以继续调整参数D。
第二次再把参数I调小1/10,即0.01,控制效果如下所示:
从上图中可以看出,PID的控制输出已经开始进入饱和范围0和100之间,而且DCDC的输出电压U的振幅已经有所收窄,说明前面对参数D的调整是有效的。但是目前的振幅还是不合格的,所以继续调整参数D。
第三次和第四次分别再把参数I调小1/10,即0.001和0.0001,控制效果如下所示:
从上图中可以看出,第三次的参数D已经相较之前明显优化,第四次的参数D则进一步逼近可以接受的范围,所以参数D暂时不再继续调整,待后续微调优化。
整体优化
至此参数P、参数I和参数D的基本值已经确定,下面基于P=0.01、I=100、D=0.0001进一步微调优化。
第一步,对比参数D在PID控制器中发挥的作用,示例如下:
从上图中可以看出,目标值100V刚建立起来后的早期阶段,微分项(参数D)能使PID的控制输出有较大的振幅,但是同时也是这种更激进的作用导致了同一时间段的DCDC的输出电压U的振幅扩大,两方面对比后决定把微分项拿到,即参数D=0。
下面基于P=0.01、I=100、D=0,进一步微调优化DCDC的输出电压U向目标值100V逼近的速度,示例如下:
从上图中可以看出,当积分项I=100时DCDC的输出电压U逼近目标值的速度较慢,需要将近20ms。当积分项I=500时,电压U逼近目标值的速度大幅提高,只需大约4ms,但是带来了电压U的震荡。当积分项I=300时,电压U逼近目标值的速度也提高挺多,只需大约6ms,同时电压U也不震荡了。速度和震荡两方面对比后,决定把积分项I设定为300。
下面基于P=0.01、I=300、D=0,进一步微调优化DCDC的输出电压U达到目标值100V后的震荡问题,示例如下:
从上图中可以看出,P=0.002和P=0.01相比,电压U的振幅并没有明显变化,而且PID的控制输出也没有明显变化(可能这个参数最小只能是0.01),说明该震荡不是由参数P引起的。分析推测可能的原因是,差值在上图的由正转负过程中会过零点,由于Controller是离散系统,对DCDC的连续系统识别不足,并且Duty转换为PWM时也会有连续和离散的转换过程,再加之DCDC电路中固有的电容电感特性,最终导致了上述震荡现象。因为目前的震荡幅值只有0.04V,相比100V的基准是非常小的,所以暂时不再继续优化,比例项参数P仍保留为0.01。
分析和应用
1、参数P是对当前时刻的差值进行放大或衰减,降低系统的惰性,加快响应速度。与他的优点相对的是,参数P过大时可能会引起系统振荡使稳定性变差。单独使用参数P时,调整的是系统的比例系数,即目标值与最终稳定输出结果之间的比例关系,无法逼近目标值,除非设定一个精确计算的参数P,并且系统的特性从始至终不变。
2、参数I是对累积差值进行放大或者衰减,并通过系统的负反馈作用减小偏差。只要参数I不是0,那么经过足够的时间后,积分项都能消除稳态偏差。参数I越大就能越加速这个过程。缺点是当有临时的外界扰动进入系统时,不能及时地克服扰动的影响。
3、参数D是差值变化率进行放大和衰减,当被控对象快速接逼近目标值时,微分项会对抗这个趋势使得逼近速度减缓。差值变化越快,控制量就越大,负反馈校正量就越大。当差值变化很慢或者不变时,微分项的作用就为0。所以具有超前控制作用,有助于减小超调,克服振荡。
总结
以上就是本人在研发中使用PID控制时,一些个人理解和分析的总结,主要介绍了PID参数调整的基本规律和技巧,展示了仿真运行的效果,并分析了三个PID的特点和适用场景。
后续还会分享另外几个最近解锁的Matlab/Simulink新技能,欢迎评论区留言、点赞、收藏和关注,这些鼓励和支持都将成文本人持续分享的动力。
另外,上述例程使用的Demo工程,可以到笔者的主页查找和下载。
参考资料
cpp
Mathworks Help -> PID Controller
版权声明,原创文章,转载和引用请注明出处和链接,侵权必究!