抗积分饱和 PID代码实现,matlab仿真实现

633 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

抗饱和PID

前几天开始我就计划把c电机仿真的PI控制器代码优化一下的时候,群里刚好讨论了Microchip的AN1078文档中的PI框图:
在这里插入图片描述 在这里插入图片描述

  找了点视频和文章,大家感兴趣可以去看看,相信你会收获更多。

好了,我大概总结一下。 

1. 积分器的分离

  • 比如误差小于某个值,关闭积分器,大于某个值开启积分器。
  • 这种方法是有效的,但存在问题,比如电流会间断。比如要处理很多不同扭矩变化的情况。
  • 用的并不多。

2. 静态钳位

在这里插入图片描述

  • 比较常见的pid处理积分的方式,积分限幅,输出限制。记得大学,智能车比赛用的就是这种。
  • 限制积分无上限的累计嘛。

3. 动态钳位

在这里插入图片描述

  • 根据P的信号做限制。
  • 背后的思想大概:当系统存在很大的误差,P的控制已经达到系统的饱和状态了,显然不需要I的。
  • 动态的钳位:当在系统饱和的情况下,当比例和积分器的输出大于系统输出的时候,就积分部分就减掉多出的这部分。显然P的输出越大,积分器的钳位值就越小。
  • 比例的输出占系统的输出的前导。要满足:
    • 比例+积分<=系统输出
    • 如果超出,不好意思,超出部分,积分器来减去。 

4. 增量PID

在这里插入图片描述

  • 记得大学做比赛的时候,就有讨论“电机用增量pid比较好,啥啥的”。虽然我当时内环用的是这个,不过当时也感觉都差不多,还觉得没位置式好调。
  • 这个增量pid在陈博的视频中,是和动态钳位效果差不多。
  • 我使用matlab测试,发现它跟系统有关。在同样的参数下,并不能得到更好的控制效果,可能还会出现更坏的效果。 

5. back-calculation

在这里插入图片描述

  • 你会发现和动态钳位模型差不多的,只不过对于上面的动态,加了个调节系数,而系数为1的时候,就和动态钳位模型一样。
  • 这个系数不能太大,也不能太小。太大,可能退出边界了。太小,没有效果了。 

matlab 仿真

我用matlab仿真了一个波形(故意加大了积分器)
在这里插入图片描述

  • 黄色:是没有积分处理,输出也没做限幅
  • 橙色:静态钳位
  • 绿色和蓝色:那两跟差不多重合的线,是动态钳位和增量pi。它两能差不多重合,是因为我调过传递函数。
  • 紫色:是back-cal的方法,不过系数比较大。  看的出来,积分器的不同处理方法,对系统的控制带来的效果是不同的。 

c电机仿真

我用c语言的电机控制仿真,控制直流电机的转速,也做了波形的测试,效果和matlab的差不多。 感兴趣可以去试试: github.com/chongweiwan… 

额外思考的问题

主要是针对动态钳位。

  • 我们对于钳位的深度是没有限制的,那么当err很大,比例的输出远远大于系统限幅,而系统输出限制比较小,积分系数又比较小的时候。这时候出现了这个输出减去系统的限制输出,这一项会去一直限制积分器。比例输出越大,积分器随着时间会越退越多。
  • 或者也说back-cal这里面的kc值调试大的情况。
  • 这时候会出现问题,积分器退的太多了。甚至超过了反方向的限制。  这个情况,对积分器做限制。或者又说,我们可以对进入控制器的err做一次限幅。 

 几种pid的c语言的实现代码:
github.com/chongweiwan…   simulink的模型,我丢qq群了:528884293

或者关注我的微信公众号“王崇卫” ,输入“simulink”获取。 在这里插入图片描述