分享

控制算法之PID实现中的一些细节

 反恐精英秃鹫 2019-11-04

这一节聊聊PID使用中的一些实际问题。为了限制篇幅,很多细节没有展开,以后有机会专门做一节细讲PID的编程。

PID算法主要的三种形式

下面三种PID算法的形式是目前比较主流的。其中形式1为并行式,也称独立式;形式2为标准式,也称理想式,是最常见的;形式3为串行式,比较少见。这三种形式在数学上是等价的。

第一种形式的PID三个参数是相互独立的,其好处是可以取消任意一项的作用。比如只想保留积分I的作用,则可以把Kp和Kd都设为0。

第二种形式的I和D是相互独立的,但是它们都与Kp有关系。调整Kp,会导致P、I和D项的改变。

而第三种形式PID三者相互有关系。第二和第三种非独立形式的好处是只要调整一个参数即可改变PID整体性能。

既然三种形式在数学上是等价的,选择哪一种完全取决于个人喜好和熟悉程度(除非你想取消P的作用,那就只能选择第一种形式了)。

不完全微分

上述三种形式虽然是标准的PID公式,但是在实际应用中,更多见的可能是下面的形式:

这个式子与前面的区别是在微分项加了一个一阶低通滤波器。这种形式也称为不完全微分,其主要目的是减少微分冲击。如果想取消滤波作用,可以把滤波时间tf设为0,则公式就变为标准形式了。关于滤波器和不完全微分,在之前的视频中都已有介绍,这里不再重复了。

以下公式摘自西门子S7-1500 PID手册,

其中y为输出,w为设定值,x为反馈值,a为微分项滤波时间,b为比例项设定值权重,c为微分项设定值权重(b和c的取值范围是0-1)。

可见其形式又有点不一样,从该式子可见:

  • 它采用的是标准形式。

  • 带不完全微分。

  • 在比例项和微分项里,对设定值赋予了权重,可以实现比例先行和微分先行。比例先行和微分先行主要目的是减弱由改变设定值所引起的输出突变。比如把权重设为0,则设定值的改变不会对输出有影响;只有当反馈值改变时,才会造成输出的变化。

西门子的PID实现是比较全面的,但只凭一个公式还不能展现PID的全部,还有诸如前馈、串级、操作模式、无扰切换、积分饱,输出信号类型和很多辅助功能等的考虑。

PID操作模式

PID控制器可能存在多种操作模式,下面介绍主要的几个:

  • 自动:PID的输出由程序根据公式计算得出。

  • 手动:PID的输出由用户指定。一般该手动设定值可通过HMI来设定。

  • 强制:在某些情况下,PID的自动计算需要被禁止,PID的输出由程序逻辑给定。比如在一个压力控制闭环里,如果压力变送器有故障,反馈信号变得不可信,此时需要把PID输出强制在一个安全可控的值下面。有些PID程序库没有该模式,如果需要自行编程,强制模式对于控制器来说就是手动模式。

  • 随动:该模式下,PID的输出跟随某个指定的量变化。比如在一个流量控制的闭环里,PID的输出作为水泵的速度给定。如果水泵被切换到手动模式,则PID应该被切换到随动模式,此时的PID输出跟随水泵的速度,其目的是当水泵切换为自动时,能达到无扰切换。有些PID程序库没有该模式,如果需要自行编程,随动模式对于控制器来说就是手动模式。

无扰切换

无扰切换是指PID在各种模式来回切换中,其输出不会突变。实现PID无扰切换的原则是使得切换后的PID输出是在切换前的输出的基础上作调整。

实现无扰切换有多种不同的方法,在不同的模式下所使用的方法也可能不同。其中“限制PID输出变化率”是比较常见的一种,其好处是它对所有模式都适用,而且在改变了PID参数的情况下,也能保证平缓输出。其实现原理是使得PID输出按照一定的变化率增加或者减少,比如5%/秒,如果要求PID输出从0%到100%,整个过程需要20秒才能完成。

另外一种从自动到手动的无扰切换是:当PID控制器在自动模式下,手动设定值应实时跟随PID的输出(即把PID输出持续写入到手动设定值)。这样在切换后,PID的输出就能保持在切换前一刻的输出值。

而从手动到自动的无扰切换,这里介绍两种方法:

  1. 设定值跟随:在手动模式下,PID的设定值跟随反馈信号的变化,这样就能保证误差为0。当切换回自动模式时,由于误差为0,所以PID输出不会突变。之后可以根据需要,慢慢再调整设定值。

  2. 实时更新积分分量:这种方法的原理是在手动模式下,根据当前的输出值和误差值,对积分分量进行折算,使得在切换回自动模式时的PID输出刚好等于切换前的值。对积分项进行调整的原因是比例和微分项都与当前误差有关,即使对它们进行了调整,在切换回自动时,算法会根据当前误差重新计算比例和微分项,仍然对输出造成突变。而积分项是一个累积项,对它进行调整,在切换回自动时,只会在原来值的基础上继续累积,而不会造成突变。

抗积分饱和

积分项是对误差的累积,只要误差不等于0,积分的结果会随着时间越来越大(误差大于0时)或者越来越小(误差小于0时),直到无穷。当然PID的输出不可能无穷,一般有效的输出范围是0%-100%或者-100%到+100%,也可以由用户自定义。当PID输出达到饱和状态时,此时就不能允许积分向超出饱和的方向继续进行下去了,这种措施叫做抗积分饱和。

抗积分饱和的方法也是有多种,最直接的一种是当输出饱和时,如果输出仍然有超出饱和方向的趋势(误差与控制信号同方向),则停止积分计算。

另外一种更常用的抗积分饱和的方法是当输出饱和时,重新折算积分项。与无扰切换的思路类似,这种方法是对积分项进行重新折算,使得输出不超出饱和值。这种方法能更快地退出饱和状态。

PID程序的调用

手册上推荐在循环中断里调用PID程序,即按照严格的等间隔时间调用,从而保证每次相等的采样时间。如果采样时间不等,而PID又以固定的采样时间计算,以积分为例,会导致每次采样的计算结果有偏差,并且偏差也是会被累加的,时间越长,偏差就会越大。

如果不在循环中断里调用PID程序,也可以每次计算采样时间,PID则以每次计算得到的采样时间来作运算。

关于这部分内容,详情可见之前的视频《积分数学基础》。

综上可见,PID的实现有很多细节需要注意,要自行编程实现一个比较完整的PID算法并不简单,即使使用现成的库程序,也要好好理解这些细节,才能用好。而且并不是所有PID库程序都提供所有细节的实现,有时候需要自行编程,所以理解这些思路也很重要。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多