• 不要只成为PID调参工程师


    949791fd051633da56526311e6c41a36.gif

    正文


    大家好,我是bug菌~

    最近跟一个同事聊了聊天,他说一直用的位置式PID,从来没在具体项目中用过增量式PID,感觉两者没啥区别呀?

    于是跟他讨论了一番,不由得让人深思~

    1

    “万能”的PID

    PID是一种非常经典的控制类算法,凭着它的简单易用在工程上得到了广泛的应用,并且影响力也是极高,那为什么说其简单易用呢?

    可以说只要你对PID的主要的参数对系统的影响理解得足够好,完全可以通过手动试凑的方式来获得一套合适的PID参考,所以对一些非控制类的工程师应用起来也是非常友好的。

    当然还有一个非常重要的原因,PID算法对大部分系统稳定性、鲁棒性以及可靠性都非常的高,有调试PID控制算法经验的朋友应该都有类似的感觉,即便根据经验随便给系统一套参数都可以到达一个不错的控制效果。

    所以在很多人眼里这算法就是"万能的",适应的场景也非常的广泛,然而自古有一种规律"熊掌和鱼不可以兼得",PID算法虽然适应性非常广泛,对于处理一些特定的应用场景,或许其并不会最优的解决办法。

    基于大家在实际应用中各种各样的需求,曾经一个发展涌现了非常的PID的变种,也就是对PID算法在特定的应用场景进行优化、或者与其他一些控制方法进行结合,以便达到相应控制场景下的不错控制效果,比如微分先行PID、PID与智能控制的算法的结合等等。

    当然如果PID算法实在无法满足需求了,那也不能勉强,就只能考虑寻找另外更为匹配的控制策略,比如现在非常流行的自抗扰控制技术等等。

    2

    PID的理解

    PID算法主要就是三项,比例(P)-积分(I)-微分(D),在连续的时间域内的表达式如下:

    ba6f9fce397316d1b99a244bd1715a2d.png

    从上面的公式可以看出PID算法是一个非常纯粹的数学表达式,既然是数学表达式那必然可以通过数学的方式进行分析,拉式变换一下,获得传递函数,然后采用控制理论分析方法,结合被控对象分析其对动态系统的稳定性、准确性以及快速性进行分析,从而达到性能上的最优解,这个控制系统的设计过程不是本文重点,暂时就不进行展开了。

    还记得最开始了解这个算法的时候,有一句话非常相信的彰显其魅力所在:P-I-D分别代表着当前、过去和未来。P对当前误差的抑制作用;I对历史误差的累积控制,以便消除静态误差;D根据误差的变化率进行补偿,从表达式也非常容易从根本上理解这几句话。

    3

    数字PID

    在前面跟大家简单描述了连续域内的PID算法表达式,而连续域中该算法需要通过相应的模拟电路来进行实现,特别是一些没有数字芯片的嵌入式系统是经常可见的。

    但随着数字系统的应用,特别是单片机系统,数字PID更加得到广泛的应用,被大部分人所熟知的两种数字PID,分别是位置式PID和增量式PID

    大部分的教材都会描述着两种形式的数字PID,然而这些教材一上来就介绍位置式PID与历史状态相关,过去会对现在的控制输出产生影响,而增量式PID仅仅只与最近的几次误差数据相关。

    如下是位置式PID表达式:

    beebf803774314e8ba88a65c3aaf912c.png

    而增量式PID的形式则可以通过位置式进行如下表达式处理得到:

    7088a5df15b539fb92adc30a4707f051.png

    如下便可以得到增量式的表达式:

    51df6c23eee647d07bb5b6257c431d56.png

    这样看来增量式PID只与最近的两次误差有关系,不会存在累积误差的问题,说来增量式PID必然是更好的,那为何还要介绍位置式PID呢?

    也有伙计在自己的程序中使用增量式PID的表达式,毕竟增量式PID其输出仅仅只是控制量的增量,最后还是需要把输出量进行累积,这与位置式根本没啥区别。

    于是很多初学者,甚至一些用PID多年的工程师对此都抱有一丝疑问。

    其实这两种数字PID的应用场景是有区别的,增量式PID控制输出的仅仅只是控制量的增量,其主要是应用在执行机构带有积分部件的被控对象,而位置式PID其输出的是实际的控制量,则用于不带积分环节的执行机构。

    当然如果在一些不带积分环节的执行结构系统中你执意要使用增量PID的形式也无伤大雅,只是最后用数字积分进行处理后输出,其与位置式PID式没有差异,增量式PID的优势并没有展现,因为真正单独使用增量式PID的执行机构的积分环节是连续的,这是数字离散的方式无法比拟的。

    最后

          好了,今天就跟大家分享这么多了,技术贵在积累和发现,如果你觉得有所收获,赞、分享、收藏。

    最后一个bug,bug菌唯一创作平台

    30fa00fe74f2a27c44ccedc96df3bbd4.jpeg

    推荐专辑  点击蓝色字体即可跳转

    ☞  MCU进阶专辑 2262650bb05bb32f4799090e0b57ccaf.gif

    ☞  嵌入式C语言进阶专辑 5590b9b268f912cb66653d2d245a299c.gif

    ☞  “bug说”专辑 77a60be0864fdc9057366d5b918fdcdf.gif

    ☞ 专辑|Linux应用程序编程大全

    ☞ 专辑|学点网络知识

    ☞ 专辑|手撕C语言

    ☞ 专辑|手撕C++语言

    ☞ 专辑|经验分享

    ☞ 专辑|电能控制技术

    ☞ 专辑 | 从单片机到Linux95e618f51a0c072d2ddc07ac8a1cba4e.gif

  • 相关阅读:
    倾听世界之声 嘉康利冉永夫:数智化直销的齿轮在全球飞转
    golang学习笔记——missing go.sum entry for go.mod file
    linux shell脚本学习指南
    2.TCP/IP协议系统
    Python 的列表
    E. Till I Collapse
    javascript算法之从会用到理解 - 数组反转
    基于Java+Vue+uniapp微信小程序实现餐厅校园订餐平台
    NetSuite Saved Search-当前库存快照查询报表
    redis集群的多key原子性操作如何实现?
  • 原文地址:https://blog.csdn.net/qq_33471732/article/details/126595520