当前位置:网站首页>抗积分饱和 PID代码实现,matlab仿真实现

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

2022-08-09 11:11:00 王崇卫

抗饱和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的差不多。
感兴趣可以去试试:
https://github.com/chongweiwang/MCS_V1/blob/main/app/sim_module_test/test_pid/test_pid.c

额外思考的问题

主要是针对动态钳位。

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

几种pid的c语言的实现代码:
https://github.com/chongweiwang/MCS_V1/tree/main/components/controller/pid 

simulink的模型,我丢qq群了:528884293

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

原网站

版权声明
本文为[王崇卫]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_38190041/article/details/121513102