【研发日记】Matlab/Simulink技能解锁(十)——PID调参技巧

文章目录

前言

项目背景

参数P调节

参数I调节

参数D调节

整体优化

分析和应用

总结

参考资料


前言

见《【研发日记】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

版权声明,原创文章,转载和引用请注明出处和链接,侵权必究!

相关推荐
charlie1145141913 天前
嵌入式Linux入门具备:C语言基础与基本驱动学习(2):Linux GIibc IO基础
c语言·学习·c·io·嵌入式软件
小孟boy3 天前
HFSS 3D Layout中Design setting各个选项的解释
信号完整性·pcb工艺·仿真·ansys·传输线
木头人的学习生活之旅6 天前
02-二自由度机械臂—运动学分析
matlab·机器人·仿真·solidworks·运动学·simscape
通信仿真实验室9 天前
(51)MATLAB迫零均衡器系统建模与性能仿真
matlab·信号处理·仿真·通信系统·均衡·通信算法
猫猫的小茶馆10 天前
【Linux系统】Ubuntu的简单操作
linux·ubuntu·嵌入式软件
即安莉16 天前
Quartus Ⅱ仿真 2.三人表决电路
仿真
即安莉18 天前
Quartus Ⅱ仿真 1.半加器
仿真·quartus
OSnotes18 天前
嵌入式软件名企笔试真题文章汇总帖
嵌入式软件·笔试真题
网易独家音乐人Mike Zhou20 天前
【Linux驱动开发】通过ioremap虚拟内存映射的寄存器操作驱动、C应用函数库开发 devmem命令测试(正点原子STM32MP135文档BUG)
linux·c语言·驱动开发·stm32·mcu·嵌入式·嵌入式软件
edadoc201320 天前
把根留住,PCB的字符设计为什么比失恋更痛苦
云计算·智能路由器·仿真·电路板