pid好文转载

来源:互联网 发布:java api 1.6英文版 编辑:程序博客网 时间:2024/05/21 19:04

好文转载

http://www.blog.vookre.com/pid%E6%8E%A7%E5%88%B6%E5%99%A8%EF%BC%88%E5%9B%9B%E8%BD%B4%E5%AD%A6%E4%B9%A0%E8%A6%81%E7%94%A8%EF%BC%81%E6%89%80%E4%BB%A5-%EF%BC%89/


PID控制器(四轴学习要用!所以……)

先引一下维基百科!

PID控制器(比例-积分-微分控制器),由比例单元(P)、积分单元(I)和微分单元(D)组成[1]。透过Kp,Ki和Kd三个参数的设定。PID控制器主要适用于基本上线性,且动态特性不随时间变化的系统。

PID控制器的方块图

PID控制器是一个在工业控制应用中常见的反馈回路部件。这个控制器把收集到的数据和一个参考值进行比较,然后把这个差别用于计算新的输入值,这个新的输入值的目的是可以让系统的数据达到或者保持在参考值。PID控制器可以根据历史数据和差别的出现率来调整输入值,使系统更加准确而稳定。

PID控制器的比例单元(P)、积分单元(I)和微分单元(D)分别对应目前误差、过去累计误差及未来误差。若是不知道受控系统的特性,一般认为PID控制器是最适用的控制器[2]。借由调整PID控制器的三个参数,可以调整控制系统,设法满足设计需求。控制器的响应可以用控制器对误差的反应快慢、控制器过冲的程度及系统震荡的程度来表示。不过使用PID控制器不一定保证可达到系统的最佳控制,也不保证系统稳定性。

有些应用只需要PID控制器的部分单元,可以将不需要单元的参数设为零即可。因此PID控制器可以变成PI控制器、PD控制器、P控制器或I控制器。其中又以PI控制器比较常用,因为D控制器对回授噪声十分敏感,而若没有I控制器的话,系统不会回到参考值,会存在一个误差量。

反馈回路基础[编辑]

PID回路是要自动实现一个操作人员用量具和控制旋钮进行的工作,这个操作人员会用量具测系统输出的结果,然后用控制旋钮来调整这个系统的输入,直到系统的输出在量具上显示稳定的需求的结果,在旧的控制文档里,这个过程叫做“复位”行为,量具被称为“测量”,需要的结果被称为“设定值”而设定值和测量之间的差别被称为“误差”。

一个控制回路包括三个部分:

  1. 系统的传感器得到的测量结果
  2. 控制器作出决定
  3. 通过一个输出设备来作出反应

控制器从传感器得到测量结果,然后用需求结果减去测量结果来得到误差。然后用误差来计算出一个对系统的纠正值来作为输入结果,这样系统就可以从它的输出结果中消除误差。

在一个PID回路中,这个纠正值有三种算法,消除目前的误差,平均过去的误差,和透过误差的改变来预测将来的误差。

比如说,假如利用水箱在为植物提供水,水箱的水需要保持在一定的高度。可以用传感器来检查水箱里水的高度,这样就得到了测量结果。控制器会有一个固定的用户输入值来表示水箱需要的水面高度,假设这个值是保持65%的水量。控制器的输出设备会连在由马达控制的水阀门上。打开阀门就会给水箱注水,关上阀门就会让水箱里的水量下降。这个阀门的控制信号就是控制变量。

PID控制器可以用来控制任何可被测量及可被控制变量。比如,它可以用来控制温度、压强、流量、化学成分、速度等等。汽车上的巡航定速功能就是一个例子。

一些控制系统把数个PID控制器串联起来,或是连成网络。这样的话,一个主控制器可能会为其他控制输出结果。一个常见的例子是马达的控制。控制系统会需要马达有一个受控的速度,最后停在一个确定的位置。可由一个子控制器用来管理速度,但是这个子控制器的速度是由控制马达位置的主控制器来管理的。

连合和串联控制在化学过程控制系统中相当常见。

历史及应用[编辑]

PID控制理论是由观察舵手的动作而来

PID控制器可以追溯到1890年代的调速器设计[2][3]。PID控制器是在船舶自动操作系统中渐渐发展。1911年Elmer Sperry开发的控制器是最早期PID型控制器的其中之一[4],而第一个发表PID控制器理论分析论文的是俄裔美国工程师尼古拉斯·米诺尔斯基(Minorsky 1922)。米诺尔斯基当时在设计美国海军的自动操作系统,他的设计是基于对舵手的观察,控制船舶不只是依目前的误差,也考虑过去的误差以及误差的变化趋势[5],后来米诺尔斯基也用数学的方式加以推导[6]。他的目的是在于稳定性,而不是泛用的控制,因此大幅的简化了问题。比例控制可以在小的扰动下有稳定性,但无法消除稳态误差,因此加入了积分项,后来也加入了微分项。

当时在新墨西哥号战舰上进行测试,利用控制器控制舵的角速度,利用PI控制器可以角度误差维持在±2°以内,若加上D控制,角度误差维持在±1/6°,比最好的舵手还要好[7]

不过因为海军人员的抗拒,海军那时候未使用这套系统,在1930年代也有其他人作出类似的研究。

在自动控制发展的早期,用机械设备来实现PID控制,是由杠杆、弹簧、阻尼及质量组成,多半会用压缩气体驱动。气动控制器还一度是工业上的标准。

电子的类比控制器可以用晶体管、真空管、电容器及电阻器组成。许多复杂的电子系统中常会包括PID控制,例如磁盘的读写头定位、电源供应器的电源条件、甚至是现代地震仪的运动侦测线路。现代电子控制器已大幅的被这些利用单芯片或FPGA来实现的数位控制器所取代。

现代工业使用的PID控制器多半会用PLC或有安装面板的数位控制器来实现。软件实现的好处是相对低廉,配合PID实现方式调整的灵敏度很大。在工业锅炉、塑胶射出机械、烫金机及包装行业中都会用到PID控制。

变化的电压输出可以用PWM来实现,也就是固定周期,依要输出的量去调整周期中输出高电势的时间。对于数位系统,其时间比例有可能是离散的,例如周期是二秒,高电势时间设定单位为0.1秒,表示可以分为20格,精度5%,因此存在一量化误差,但只要时间分辨率够高,就会有不错的效果。

理论[编辑]

PID是以它的三种纠正算法而命名。受控变数是三种算法(比例、积分、微分)相加后的结果,即为其输出,其输入为误差值(设定值减去测量值后的结果)或是由误差值衍生的信号。若定义{\displaystyle u(t)}u(t)为控制输出,PID算法可以用下式表示:

{\displaystyle \mathrm {u} (t)=\mathrm {MV} (t)=K_{p}{e(t)}+K_{i}\int _{0}^{t}{e(\tau )}\,{d\tau }+K_{d}{\frac {d}{dt}}e(t)}{\mathrm {u}}(t)={\mathrm {MV}}(t)=K_{p}{e(t)}+K_{{i}}\int _{{0}}^{{t}}{e(\tau )}\,{d\tau }+K_{{d}}{\frac {d}{dt}}e(t)

其中

{\displaystyle K_{p}}K_{p}:比例增益,是调适参数
{\displaystyle K_{i}}K_{i}:积分增益,也是调适参数
{\displaystyle K_{d}}K_{d}:微分增益,也是调适参数
{\displaystyle e}e:误差=设定值(SP)- 回授值(PV)
{\displaystyle t}t:目前时间
{\displaystyle \tau }\tau :积分变数,数值从0到目前时间{\displaystyle t}t

用更专业的话来讲,PID控制器可以视为是频域系统的滤波器。在计算控制器最终是否会达到稳定结果时,此性质很有用。如果数值挑选不当,控制系统的输入值会反复振荡,这导致系统可能永远无法达到预设值。

PID控制器的一般转移函数是:

{\displaystyle H(s)={\frac {K_{d}s^{2}+K_{p}s+K_{i}}{s+C}}}H(s)={\frac {K_{d}s^{2}+K_{p}s+K_{i}}{s+C}},

其中C是一个取决于系统带宽的常数。

比例控件[编辑]

不同比例增益Kp下,受控变数对时间的变化(Ki和Kd维持定值)

比例控制考虑当前误差,误差值和一个正值的常数Kp(表示比例)相乘。Kp只是在控制器的输出和系统的误差成比例的时候成立。比如说,一个电热器的控制器的比例尺范围是10°C,它的预定值是20°C。那么它在10°C的时候会输出100%,在15°C的时候会输出50%,在19°C的时候输出10%,注意在误差是0的时候,控制器的输出也是0。

比例控制的输出如下:

{\displaystyle P_{\mathrm {out} }=K_{p}\,{e(t)}}P_{{{\mathrm {out}}}}=K_{p}\,{e(t)}

若比例增益大,在相同误差量下,会有较大的输出,但若比例增益太大,会使系统不稳定。相反的,若比例增益小,若在相同误差量下,其输出较小,因此控制器会较不敏感的。若比例增益太小,当有干扰出现时,其控制信号可能不够大,无法修正干扰的影响。

稳态误差[编辑]

比例控制在误差为0时,其输出也会为0。若要让受控输出为非零的数值,就需要有一个稳态误差或偏移量[a]。稳态误差和比例增益的成反比。若加入一偏置,或是加入积分控制,可以消除稳态误差。

积分控件[编辑]

不同积分增益Ki下,受控变数对时间的变化(Kp和Kd维持定值)

积分控制考虑过去误差,将误差值过去一段时间和(误差和)乘以一个正值的常数Ki。Ki从过去的平均误差值来找到系统的输出结果和预定值的平均误差。一个简单的比例系统会震荡,会在预定值的附近来回变化,因为系统无法消除多余的纠正。通过加上负的平均误差值,平均系统误差值就会渐渐减少。所以,最终这个PID回路系统会在设定值稳定下来。

积分控制〔的输出如下:

{\displaystyle I_{\mathrm {out} }=K_{i}\int _{0}^{t}{e(\tau )}\,{d\tau }}I_{{{\mathrm {out}}}}=K_{{i}}\int _{{0}}^{{t}}{e(\tau )}\,{d\tau }

积分控制会加速系统趋近设定值的过程,并且消除纯比例控制器会出现的稳态误差。积分增益越大,趋近设定值的速度越快,不过因为积分控制会累计过去所有的误差,可能会使回授值出现过冲的情形。

微分控件[编辑]

不同微分增益Kd下,受控变数对时间的变化(Kp和Ki维持定值)

微分控制考虑将来误差,计算误差的一阶导,并和一个正值的常数Kd相乘。这个导数的控制会对系统的改变作出反应。导数的结果越大,那么控制系统就对输出结果作出更快速的反应。这个Kd参数也是PID被称为可预测的控制器的原因。Kd参数对减少控制器短期的改变很有帮助。一些实际中的速度缓慢的系统可以不需要Kd参数。

微分控制的输出如下:

{\displaystyle D_{\mathrm {out} }=K_{d}{\frac {d}{dt}}e(t)}D_{{{\mathrm {out}}}}=K_{d}{\frac {d}{dt}}e(t)

微分控制可以提升整定时间及系统稳定性[8][9]。不过因为纯微分器不是因果系统,因此在PID系统实现时,一般会为微分控制加上一个低通滤波器以限制高频增益及噪声[10]。实务上较少用到微分控制,估计PID控制器中只有约20%有用到微分控制[10]

参数调试[编辑]

PID的参数调试是指透过调整控制参数(比例增益、积分增益/时间、微分增益/时间)让系统达到最佳的控制效果。稳定性(不会有发散性的震荡)是首要条件,此外,不同系统有不同的行为,不同的应用其需求也不同,而且这些需求还可能会互相冲突。

PID只有三个参数,在原理上容易说明,但PID参数调试是一个困难的工作,因为要符合一些特别的判据,而且PID控制有其限制存在。历史上有许多不同的PID参数调试方式,包括齐格勒-尼科尔斯方法等,其中也有一些已申请专利。

PID控制器的设计及调试在概念上很直觉,但若有多个(且互相冲突)的目标(例如高稳定性及快速的暂态时间)都要达到的话,在实际上很难完成。PID控制器的参数若仔细的调试,会有很好的效果,相反的,若调适不当,效果会很差。一般初始设计常需要不断的电脑模拟,并且修改参数,一直达到理想的性能或是可接受的妥协为止。

有些系统有非线性的特性,若在无载下调试的参数可能无法在满载下动作,可以利用增益规划的方式进行修正(在不同的条件下选用不同的数值)。

稳定性[编辑]

若PID控制器的参数未挑选妥当,其控制器输出可能是不稳定的,也就是其输出发散,过程中可能有震荡,也可能没有震荡,且其输出只受饱和或是机械损坏等原因所限制。不稳定一般是因为过大增益造成,特别是针对延迟时间很长的系统。

一般而言,PID控制器会要求响应的稳定,不论程序条件及设定值如何组合,都不能出现大幅振荡的情形,不过有时可以接受临界稳定的情形[来源请求]

最佳性能[编辑]

PID控制器的最佳性能可能和针对过程变化或是设定值变化有关,也会随应用而不同。

两个基本的需求是调整能力(regulation,干扰拒绝,使系统维持在设定值)及命令追随 (设定值变化下,控制器输出追随设定值的反应速度)。有关命令追随的一些判据包括有上升时间及整定时间。有些应用可能因为安全考量,不允许输出超过设定值,也有些应用要求在到达设定值过程中的能量可以最小化。

各方法的简介[编辑]

有许多种调试PID控制器参数的方法,最有效的方式多半是建立某种程序,再依不同参数下的动态特性来调试参数。相对而言人工调试其效率较差,若是系统的响应时间到数分钟以上,更可以看出人工调试效率的不佳[来源请求]

调试方法的选择和是否可以暂时将控制回路“离线”有关,也和系统的响应时间有关。离线是指一个和实际使用有些不同的条件(例如不加负载),而且控制器的输出只需考虑适适,不需考虑实际应用。在线调试是在实际应用的条件,控制器的输出需考虑实际的系统 。若控制回路可以离线,最好的调试方法是对系统给一个步阶输入,量测其输出对时间的关系,再用其响应来决定参数[来源请求]

选择调试方式方法优点缺点人工调试不需要数学,可以在线调试需要有经验的工程师[来源请求]齐格勒-尼科尔斯方法被证实有效的方法,可以在线调试会影响制程,需要试误,得到的参数可能使响应太快[来源请求]软件工具调适的一致性,可以在线调试或离线调试,可以配合计算机自动设计,包括阀及感测器的分析,可以在下载前进行模拟,可以支援非稳态(NSS)的调试需要成本或是训练[11]COHEN–COON好的程序模型需要一些数学,需离线调试,只对一阶系统有良好效果[来源请求]

人工调整[编辑]

若需在系统仍有负载的情形进行调试(线上调试),有一种作法是先将{\displaystyle K_{i}}K_{i}{\displaystyle K_{d}}K_{d}设为零,增加{\displaystyle K_{p}}K_{p}一直到回路输出震荡为止,之后再将{\displaystyle K_{p}}K_{p}设定为“1/4振幅衰减”(使系统第二次过冲量是第一次的1/4)增益的一半,然后增加{\displaystyle K_{i}}K_{i}直到一定时间后的稳态误差可被修正为止。不过若{\displaystyle K_{i}}K_{i}可能会造成不稳定,最后若有需要,可以增加{\displaystyle K_{d}}K_{d},并确认在负载变动后回路可以够快的回到其设定值,不过若{\displaystyle K_{d}}K_{d}太大会造成响应太快及过冲。一般而言快速反应的PID应该会有轻微的过冲,只是有些系统不允许过冲。因此需要将回授系统调整为过阻尼系统,而{\displaystyle K_{p}}K_{p}比造成震荡{\displaystyle K_{p}}K_{p}的一半还要小很多。

调整PID参数对其步阶响应的影响

调整PID参数对系统的影响如下

调整方式(ON) 上升时间超调量安定时间稳态误差稳定性[10]↑ Kp减少 ↓增加 ↑小幅增加 ↗减少 ↓变差 ↓↑ Ki小幅减少 ↘增加↑增加 ↑大幅减少↓↓变差↓↑ Kd小幅减少 ↘减少↓减少↓变动不大→变好 ↑

齐格勒-尼科尔斯方法[编辑]

齐格勒-尼科尔斯方法是另一种启发式的调试方式,由John G. Ziegler和Nathaniel B. Nichols在1940年代导入,一开始也是将{\displaystyle K_{i}}K_{i}{\displaystyle K_{d}}K_{d}设定为零,增加比例增益直到系统开始振荡为止,当时的增益称为{\displaystyle K_{u}}K_{u},而振荡周期为{\displaystyle P_{u}}P_{u},即可用以下的方式计算增益:

齐格勒-尼科尔斯方法控制器种类{\DISPLAYSTYLE K_{P}}K_{p}{\DISPLAYSTYLE K_{I}}K_{i}{\DISPLAYSTYLE K_{D}}K_{d}P{\displaystyle 0.50{K_{u}}}0.50{K_{u}}––PI{\displaystyle 0.45{K_{u}}}0.45{K_{u}}{\displaystyle 1.2{K_{p}}/P_{u}}1.2{K_{p}}/P_{u}PID{\displaystyle 0.60{K_{u}}}0.60{K_{u}}{\displaystyle 2{K_{p}}/P_{u}}2{K_{p}}/P_{u}{\displaystyle {K_{p}}{P_{u}}/8}{K_{p}}{P_{u}}/8

PID调试软件[编辑]

大部分现代的工业设备不再用上述人工计算的方式调试,而是用PID调试及最佳化软件来达到一致的效果。软件会收集资料,建立模型,并提供最佳的调试结果,有些软件甚至可以用参考命令的变化来进行调试。

数学的PID调试会将脉冲加入系统,再用受控系统的频率响应来设计PID的参数。若是响应时间要数分钟的系统,建议用数学PID调试,因为用试误法可能要花上几天才能找到可让系统稳定的参数。最佳解不太容易找到,有些数位的回路控制器有自我调试的程序,利用微小的参考命令来计算最佳的调试值。

也有其他调试的公式,是依不同的性能判据所产生。许多有专利的公式已嵌入在PID调试软件及硬件模组中[12]

一些先进的PID调试软件也可以有算法可以在动态的情形下调整PID回路,这类软件会先将程序建模,给摄动量,再根据响应计算参数。

PID控制的限制[编辑]

PID控制可以应用在许多控制问题,多半在大略调整参数后就有不错的效果,不过有些应用下可能反而会有差的效果,而且一般无法提供最佳控制。PID控制的主要问题是在于其为回授控制,系数为定值,不知道受控系统的信息,因此其整理性能常常是妥协下的结果。在没有受控系统模型的条件下,PID控制最佳的控制器[2],但若配合系统模型,可以有进一步的提升。

当PID控制器单独使用时,若因应用需求,需调整PID回路增益使控制系统不会过冲,其效果有可能很差。PID控制器的缺点还包括无法处理受控系统的非线性、需在反应时间及调整率之间妥协、无法针对参数的变动而反应(例如系统在暖机后特性会改变)、以及大扰动下的波形落后。

PID控制器最显著的提升是配合前馈控制,加入有关系统的信息,只用PID控制器来控制误差。另外,PID控制器也有一些小幅的改善方式,例如调整参数(增益规划或是依性能进行适应性的调整)、提升性能(提高取样率、精度及准度,若有需要加入低波滤波器),或是用多个串接的PID控制器。

线性[编辑]

PID控制器常见的问题是在于其线性且对称的特性,若应用在一些非线性的系统,其效果可能会有变化。以暖通空调中常见的温度控制,可能是采用主动加热(用加热器加热),但冷却是使用被动冷却(不加热,自然冷却),其冷却速度比加热速度慢很多,输出若有过冲,下降速度很慢,因此PID控制需调整为不会过冲的过阻尼,以减少或避免过冲,但这也延长了整定时间,使性能变差。

噪声对微分器的影响[编辑]

微分器的问题在于对量测或程序产生的高频噪声会有放大效果,因此会对输出造成大幅的变动。因此真实的控制器不会有理想的微分器,只有一个有限带宽的微分器或高通滤波器。一般为了移除高频的噪声,会在量测时加入低通滤波器,若低通滤波器和微分器对消,滤波效果也就受限了,因此低噪声的量测设备相当重要。实务上可以使用中值滤波器,调昇滤波效率及实际上的性能[13]。有时可以将微分器关闭,对控制性能的影响不大,此时称为PI控制器。

PID算法的修改[编辑]

基本的PID算法在一些控制应用的条件下有些不足,需进行小幅的修改。

积分饱和[编辑]

积分饱和是理想PID算法实现时常见的问题。若设定值有大的变动,其积分量会有大幅的变化,大到输出值被上下限限制而饱和,因此系统会有过冲,而且即使误差量符号改变,积分量变小,但输出值仍被上下限限制,维持在上限(或下限),因此输出看似没有变化,系统仍会持续的过冲,一直要到输出值落在上下限的范围内,系统的回授量才会开始下降。此问题可以用以下方式处理:

  • 在程序变数离开可控制范围时,暂停积分。
  • 让积分值限制在一个较小的上下范围内。
  • 重新计算积分项,使控制器输出维持上下限之间的范围内[14]

PI控制器[编辑]

PI控制器的方块图

PI控制器(比例-积分控制器)是不用微分单元的PID控制器。

控制器的输出为

{\displaystyle K_{P}\Delta +K_{I}\int \Delta \,dt}K_{P}\Delta +K_{I}\int \Delta \,dt

其中{\displaystyle \Delta }\Delta 为设定值SP和量测值PV的误差:

{\displaystyle \Delta =SP-PV}\Delta =SP-PV.

PI控制器可以用Simulink或Xcos之类的软件进行建模,方式是使用“flow chart”图框,其中用以下的拉氏运算子:

{\displaystyle C={\frac {G(1+\tau s)}{\tau s}}}C={\frac {G(1+\tau s)}{\tau s}}

其中

{\displaystyle G=K_{P}}G=K_{P} = 比例增益
{\displaystyle G/\tau =K_{I}}G/\tau =K_{I} = 积分增益

{\displaystyle G}G值的选择需在减少过冲以及增加安定时间之间取舍。

微分单元对输入中的高频信号格外敏感,PI控制器因为没有微分单元,在讯号噪声大时,在稳态时会更加稳定。但对状态快速变化的反应较慢,因此相较于调适到最佳值的PID控制器,PI控制器会较慢到达设定值,受干扰后也比较慢恢复到正常值。

PDF控制(pseudo-derivative feedback control)可以视为是PI控制器的变体,比例控制器的输入由误差值改为回授值[15]

不动作区[编辑]

许多PID回路是控制机械元件(例如阀)。机械保养是一笔可观的费用,磨损会使得机械在有输入信号时出现静摩擦或是不动作区,都会导致控制性能的下降。机械损耗的速度主要和设备多常改变其状态有关。若磨损是主要考量的话,PID回路可以有输出的不动作区以减少输出状态的改变。若变化小,仍在不动作区内,让控制器的输出维持上一次的值。变化要大到超过不动作区,实际的状态才会随之变化。

设定值的步阶变化[编辑]

若系统的设定值有步阶变化,比例单元和微分单元也会有对应的变化,特别是微分单元对于步阶变化的输出特别的大,因此有些PID算法会配合以下的修改来处理设定值的变化。

设定值斜坡变化
此修改方式下,设定值会用线性或是一阶滤波的方式,由原始值变到新的值,避免因为步阶变化产生的不连续。
只对程序变数(回授量)微分
此修改下,PID控制器只针对量测的程序变数(PV)微分,不对误差微分。程序变数是实际的物理量,较不易有瞬间的变化,而误差可能因为设定值的步阶变化而有瞬间变化。这也是一种简单的设定值加权法。
设定值加权
设定值加权分别调整在比例单元及微分单元中的误差量,误差量的设定值乘以一个0到1之间的加权,积分单元的误差量需使用真实的设定值,以避免稳态误差。这两个参数不影响对负载变化及量测噪声的响应,可以提升对设定点变化的响应。

前馈控制[编辑]

PID控制器若再配合前馈控制(开回路控制),可以再提升其控制性能。在前馈控制中考虑系统的已知信息(例如理想加速度或是惯量),再将输出加到PID控制器的控制输出,以提升整体的系统性能。前馈量可能是控制输出主要的部分,而PID控制器只用来补偿目标值和开回路控制器输出之间的误差。因为前馈输出不会受到回授的影响,因此也不会造成系统的振荡,可以在不影响稳定性的条件下提升系统的响应。前馈可以依目标值及其他量测到的干扰量来产生,目标值加权是一种简单的前馈控制方式。

例如,在大部分的运动控制系统中,为了要使机械负载加速,致动器要产生更大的力。若用速度环的PID控制器来控制负载速度,比较理想的方式是先得到理想的瞬间加速度值,适量调整加权后再加到PID的输出中。因此控制器输出中有一部分是不随机械速度而改变的输出,再用PID根据实际输出和目标的差异去增加或是减少输出。这类有前馈控制的PID控制器可以加快控制系统的反应速度。

无冲击运转[编辑]

有时PID控制器会规划为无冲击(bumpless)的特性,在参数变化时重新计算适当的积分累计值,使输出不会因参数变化有不连续的改变[16]

串级PID控制器[编辑]

二个PID控制器可以组合在一起,得到较佳的效果,这称为串级PID控制。以两个PID控制器组成的串级PID控制为例,其中一个PID控制器在外回路,控制像液面高度或是速度等主要的物理量,另一个PID控制器是内回路,以外回路PID控制器的输出做为其目标值,一般是控制较快速变化的参数,例如流量或加速度等。若利用串级PID控制,可以增加控制器的工作频率,并降低其时间常数。

例如一个温控的循环水浴设备有二个串级的PID控制器,分别有各自的热电偶温度感测器。外回路的控制器控制水温,其感测器距加热器很远,直接量测整体水温,其误差量是理想水温及整体水温的差值。外回路PID控制器的输出即为内回路控制器的目标值,内回路控制器控制加热器,其感测器是在加热器上,其误差量是加热器的理想温度及量测到温度的差值,其输出会使加热器维持在设定值附近。

内外回路控制器的参数可能会差很多,外回路的PID控制器有较长的时间常数,对应所有的水加热或是冷却需要的时间。内回路的PID控制器反应会比较快。每个控制器可以调整到符合其真正控制的系统,例如水槽中所有的水,或是加热器本身。

其他PID的形式及其表示法[编辑]

理想的PID及标准形PID[编辑]

工业上常看到PID控制器,而许多工业相关资料中看到的都是“标准形”的PID,其中比例增益{\displaystyle K_{p}}K_{p}也作用在{\displaystyle I_{\mathrm {out} }}I_{{{\mathrm {out}}}}{\displaystyle D_{\mathrm {out} }}D_{{{\mathrm {out}}}}两项,和上述“理论”段落看到的形式不同。“标准形”的PID为:

{\displaystyle \mathrm {MV(t)} =K_{p}\left(\,{e(t)}+{\frac {1}{T_{i}}}\int _{0}^{t}{e(\tau )}\,{d\tau }+T_{d}{\frac {d}{dt}}e(t)\right)}{\mathrm {MV(t)}}=K_{p}\left(\,{e(t)}+{\frac {1}{T_{i}}}\int _{{0}}^{{t}}{e(\tau )}\,{d\tau }+T_{d}{\frac {d}{dt}}e(t)\right)

其中

{\displaystyle T_{i}}T_i为积分时间
{\displaystyle T_{d}}T_{d}为微分时间

在标准形中,每一个参数有其明确的物理意义,输出是根据现在误差、过去误差及未来误差而决定,加上微分项可以预测若控制系统不改变的话,{\displaystyle T_{d}}T_{d}时间后的误差,而积分项是用过去所有误差的和来调整输出,希望在{\displaystyle T_{i}}T_i时间后可以完全消除误差,而输出的值会再乘以单一的增益{\displaystyle K_{p}}K_{p}

在理想的平行式PID中,其方程如下:

{\displaystyle \mathrm {MV(t)} =K_{p}{e(t)}+K_{i}\int _{0}^{t}{e(\tau )}\,{d\tau }+K_{d}{\frac {d}{dt}}e(t)}{\mathrm {MV(t)}}=K_{p}{e(t)}+K_{i}\int _{{0}}^{{t}}{e(\tau )}\,{d\tau }+K_{d}{\frac {d}{dt}}e(t)

其中的增益和标准形PID系数的关系是:{\displaystyle K_{i}={\frac {K_{p}}{T_{i}}}}K_{i}={\frac {K_{p}}{T_{i}}}{\displaystyle K_{d}=K_{p}T_{d}\,}K_{d}=K_{p}T_{d}\,。平行式PID中的参数都视为单纯的增益,最泛用,灵活性也最高,但较没有物理意义,因此只用在PID的理论处理中,标准形PID虽在数学上比较复杂,在工业中较常使用。

倒数增益[编辑]

许多情形下,PID控制器处理的变数是无量纲的量,是某个最大值的比例,介于0到100%之间,而转换为实际物理量(如泵浦速率或是水加热的功率)是在PID控制器外,而这些控制变数是有量纲的物理量(例如温度)。此时{\displaystyle K_{p}}K_{p}增益多半不会表示为“每变化一度的输出”,而会以温度的形式{\displaystyle 1/K_{p}}1/K_{p}表示,代表“100%输出下的温度(变化)”,代表输出由0变到1(0%变为100%)下的温度变化。

只针对过程变数进行微分控制[编辑]

在大部分的商业控制系统中,是用过程变数取代误差作为微分项的输入,其原因是当目标值有不连续变化时,微分控制会产生很大的突波,若目标值不变,改变过程变数的效果和改变误差相同,因此有些PID控制器会用过程变数作为微分项的输入,不会影响控制器控制过程变数,抗噪声的能力。

{\displaystyle \mathrm {MV(t)} =K_{p}\left(\,{e(t)}+{\frac {1}{T_{i}}}\int _{0}^{t}{e(\tau )}\,{d\tau }-T_{d}{\frac {d}{dt}}PV(t)\right)}{\mathrm {MV(t)}}=K_{p}\left(\,{e(t)}+{\frac {1}{T_{i}}}\int _{{0}}^{{t}}{e(\tau )}\,{d\tau }-T_{d}{\frac {d}{dt}}PV(t)\right)

只针对过程变数进行微分及比例控制[编辑]

大部分的商业控制系统也提供选择,让过程变数作为微分控制及比例控制的输入,因此误差只作为积分控制的输入,这也不会影响控制器控制过程变数,抗噪声的能力。

上述的修改可以避免目标值有不连续变化时,输出值有对应不连续的变化,若目标值有步阶变化,这项调整就相当重要。

{\displaystyle \mathrm {MV(t)} =K_{p}\left(\,{-PV(t)}+{\frac {1}{T_{i}}}\int _{0}^{t}{e(\tau )}\,{d\tau }-T_{d}{\frac {d}{dt}}PV(t)\right)}{\mathrm {MV(t)}}=K_{p}\left(\,{-PV(t)}+{\frac {1}{T_{i}}}\int _{{0}}^{{t}}{e(\tau )}\,{d\tau }-T_{d}{\frac {d}{dt}}PV(t)\right)

也有些双自由度(2-DoF)PID控制架构除了一般的PID控制外,再加上只针对过程变数进行的微分及比例控制,再分别用增益进行调整,目标是同时对目标步阶响应以及噪声抑制都有良好的性能[17]

PID控制器的拉氏转换[编辑]

有关会将PID控制器进行拉氏转换:

{\displaystyle G(s)=K_{p}+{\frac {K_{i}}{s}}+K_{d}{s}={\frac {K_{d}{s^{2}}+K_{p}{s}+K_{i}}{s}}}G(s)=K_{p}+{\frac {K_{i}}{s}}+K_{d}{s}={\frac {K_{d}{s^{2}}+K_{p}{s}+K_{i}}{s}}

PID控制器的拉氏转换也代表着控制器的传递函数,因此可以确认整体系统的传递函数。

PID的极零点对消[编辑]

PID控制器可以写成以下的形式

{\displaystyle G(s)=K_{d}{\frac {s^{2}+{\frac {K_{p}}{K_{d}}}s+{\frac {K_{i}}{K_{d}}}}{s}}}G(s)=K_{d}{\frac {s^{2}+{\frac {K_{p}}{K_{d}}}s+{\frac {K_{i}}{K_{d}}}}{s}}

若受控设备的传递函数如下:

{\displaystyle H(s)={\frac {1}{s^{2}+2\zeta \omega _{0}s+\omega _{0}^{2}}}}H(s)={\frac {1}{s^{2}+2\zeta \omega _{0}s+\omega _{0}^{2}}}

又令

{\displaystyle {\frac {K_{i}}{K_{d}}}=\omega _{0}^{2}}{\frac {K_{i}}{K_{d}}}=\omega _{0}^{2}
{\displaystyle {\frac {K_{p}}{K_{d}}}=2\zeta \omega _{0}}{\frac {K_{p}}{K_{d}}}=2\zeta \omega _{0}

{\displaystyle G(s)H(s)={\frac {K_{d}}{s}}}G(s)H(s)={\frac {K_{d}}{s}}

因此若受控设备有不稳定的极点,看似可以用此方式消除,不过实际上有些差异,由干扰到输出的闭回路传递函数中仍有不稳定的极点,因此仍可能会发散。

串级型或交互型[编辑]

另一种PID控制器的表示法为串级型(series)或称为交互型(interacting)

{\displaystyle G(s)=K_{c}{\frac {(\tau _{i}{s}+1)}{\tau _{i}{s}}}(\tau _{d}{s}+1)}G(s)=K_{c}{\frac {(\tau _{i}{s}+1)}{\tau _{i}{s}}}(\tau _{d}{s}+1)

其中参数和标准型的参数有以下的关系

{\displaystyle K_{p}=K_{c}\cdot \alpha }K_{p}=K_{c}\cdot \alpha {\displaystyle T_{i}=\tau _{i}\cdot \alpha }T_{i}=\tau _{i}\cdot \alpha
{\displaystyle T_{d}={\frac {\tau _{d}}{\alpha }}}T_{d}={\frac {\tau _{d}}{\alpha }}

{\displaystyle \alpha =1+{\frac {\tau _{d}}{\tau _{i}}}}\alpha =1+{\frac {\tau _{d}}{\tau _{i}}}.

上述作法可表示为二个串级的PD控制器及PI控制器,在早期类比电路的时代较容易实现,虽然控制器已经数字化,不过仍有些维持此形式。

离散化的控制器[编辑]

若要在微处理机(MCU)或是FPGA中实现PID控制或是分析其性能,就需要将控制器离散化[18]。一阶微分可以用后向有限差分表示,积分项也离散化,若取样时间为{\displaystyle \Delta t}\Delta t,积分项可以用下式近似

{\displaystyle \int _{0}^{t_{k}}{e(\tau )}\,{d\tau }=\sum _{i=1}^{k}e(t_{i})\Delta t}\int _{{0}}^{{t_{k}}}{e(\tau )}\,{d\tau }=\sum _{{i=1}}^{k}e(t_{i})\Delta t

微分项可近似为

{\displaystyle {\dfrac {de(t_{k})}{dt}}={\dfrac {e(t_{k})-e(t_{k-1})}{\Delta t}}}{\dfrac {de(t_{k})}{dt}}={\dfrac {e(t_{k})-e(t_{{k-1}})}{\Delta t}}

因此PID控制器的离散化可以将{\displaystyle u(t)}u(t)微分,再用一阶导数及二阶导数的定义求得{\displaystyle u(t_{k})}u(t_{k}),可以徥到

{\displaystyle u(t_{k})=u(t_{k-1})+K_{p}\left[\left(1+{\dfrac {\Delta t}{T_{i}}}+{\dfrac {T_{d}}{\Delta t}}\right)e(t_{k})+\left(-1-{\dfrac {2T_{d}}{\Delta t}}\right)e(t_{k-1})+{\dfrac {T_{d}}{\Delta t}}e(t_{k-2})\right]}u(t_{k})=u(t_{{k-1}})+K_{p}\left[\left(1+{\dfrac {\Delta t}{T_{i}}}+{\dfrac {T_{d}}{\Delta t}}\right)e(t_{k})+\left(-1-{\dfrac {2T_{d}}{\Delta t}}\right)e(t_{{k-1}})+{\dfrac {T_{d}}{\Delta t}}e(t_{{k-2}})\right]

其中{\displaystyle T_{i}=K_{p}/K_{i},T_{d}=K_{d}/K_{p}}T_{i}=K_{p}/K_{i},T_{d}=K_{d}/K_{p}

伪代码[编辑]

以下是一段实现PID算法的伪代码:[19]

previous_error = 0integral = 0 start:  error = setpoint - measured_value  integral = integral + error*dt  derivative = (error - previous_error)/dt  output = Kp*error + Ki*integral + Kd*derivative  previous_error = error  wait(dt)  goto start

此例中有两个变数在循环前需初始化为0,然后开始循环。目前的误差(error)是用目前目标值(setpoint)减去系统反馈值(measured_value)而得,然后再进行积分和微分运算,比例项、积分项及微分项乘以各自参数后得到输出(output)。在实际系统中,这会透过数位类比转换器转换为类比讯号,作为受控系统的控制量。目前的误差量及积分会储存,以便下次计算微分及积分时使用,程式会等待dt秒后开始,循环继续进行,透过类比数位转换器读取新的系统反馈值及目标值,再计算误差量及输出[19]

    (来点简单易懂的!)
啥是PID?   PID可以吃吗?
PID,就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种很常见的控制算法。算法是不可以吃的。
到LZ发帖的这一天,PID已经有105年的历史了

它并不是什么很神圣的东西,大家一定都见过PID的实际应用

——比如四轴飞行器,再比如平衡小车……还有汽车的定速巡航、3D打印机上的温度控制器….
再比如动物园里的海狮,将一根杆子直立着顶在头上(OOPS,这个也算..)

就是类似于这种:需要将某一个物理量“保持稳定”的场合(比如维持平衡,稳定温度、转速等),PID都会派上大用场。

那么问题来了:
  比如,我想控制一个“热得快”,让一锅水的温度保持在50℃
这么简单的任务,为啥要用到微积分的理论呢你一定在想:
这不是so easy嘛~  小于50度就让它加热,大于50度就断电,不就行了?几行代码用Arduino分分钟写出来

没错~在要求不高的情况下,确实可以这么干~  But!  如果LZ换一种说法,你就知道问题出在哪里了:

如果我的控制对象是一辆汽车呢?
要是希望汽车的车速保持在50km/h不动,你还敢这样干么

设想一下,假如汽车的定速巡航电脑在某一时间测到车速是45km/h。它立刻命令发动机:加速!
结果,发动机那边突然来了个100%全油门,嗡的一下,汽车急加速到了60km/h。这时电脑又发出命令:刹车!
结果,吱……………哇…………(乘客吐)

所以,在大多数场合中,用“开关量”来控制一个物理量,就显得比较简单粗暴了。有时候,是无法保持稳定的。因为单片机、传感器不是无限快的,采集、控制需要时间。
而且,控制对象具有惯性。比如你将一个加热器拔掉,它的“余热”(即热惯性)可能还会使水温继续升高一小会。

这时,就需要一种『算法』:

  • 它可以将需要控制的物理量带到目标附近
  • 它可以“预见”这个量的变化趋势
  • 它也可以消除因为散热、阻力等因素造成的静态误差
  • ….

于是,当时的数学家们发明了这一历久不衰的算法——这就是PID。

你应该已经知道了,P,I,D是三种不同的调节作用,既可以单独使用(P,I,D),也可以两个两个用(PI,PD),也可以三个一起用(PID)。
这三种作用有什么区别呢?客官别急,听我慢慢道来



我们先只说PID控制器的三个最基本的参数:kP,kI,kD。

kP
P就是比例的意思。它的作用最明显,原理也最简单。我们先说这个:

需要控制的量,比如水温,有它现在的『当前值』,也有我们期望的『目标值』。

  • 当两者差距不大时,就让加热器“轻轻地”加热一下。
  • 要是因为某些原因,温度降低了很多,就让加热器“稍稍用力”加热一下。
  • 要是当前温度比目标温度低得多,就让加热器“开足马力”加热,尽快让水温到达目标附近。

这就是P的作用,跟开关控制方法相比,是不是“温文尔雅”了很多

实际写程序时,就让偏差(目标减去当前)与调节装置的“调节力度”,建立一个一次函数的关系,就可以实现最基本的“比例”控制了~
kP越大,调节作用越激进,kP调小会让调节作用更保守。

要是你正在制作一个平衡车,有了P的作用,你会发现,平衡车在平衡角度附近来回“狂抖”,比较难稳住。
如果已经到了这一步——恭喜你!离成功只差一小步了~

kD
D的作用更好理解一些,所以先说说D,最后说I。

刚才我们有了P的作用。你不难发现,只有P好像不能让平衡车站起来,水温也控制得晃晃悠悠,好像整个系统不是特别稳定,总是在“抖动”。

你心里设想一个弹簧:现在在平衡位置上。拉它一下,然后松手。这时它会震荡起来。因为阻力很小,它可能会震荡很长时间,才会重新停在平衡位置。
请想象一下:要是把上图所示的系统浸没在水里,同样拉它一下 :这种情况下,重新停在平衡位置的时间就短得多。

我们需要一个控制作用,让被控制的物理量的“变化速度”趋于0,即类似于“阻尼”的作用。

因为当比较接近目标时,P的控制作用就比较小了。越接近目标,P的作用越温柔。有很多内在的或者外部的因素,使控制量发生小范围的摆动。D的作用就是让物理量的速度趋于0,
只要什么时候,这个量具有了速度,D就向相反的方向用力,尽力刹住这个变化。

kD参数越大,向速度相反方向刹车的力道就越强。

如果是平衡小车,加上P和D两种控制作用,如果参数调节合适,它应该可以站起来了~欢呼吧

等等,PID三兄弟好想还有一位。看起来PD就可以让物理量保持稳定,那还要I干嘛?
因为我们忽视了一种重要的情况:

kI
还是以热水为例。假如有个人把我们的加热装置带到了非常冷的地方,开始烧水了。需要烧到50℃。

在P的作用下,水温慢慢升高。直到升高到45℃时,他发现了一个不好的事情:天气太冷,水散热的速度,和P控制的加热的速度相等了。
这可怎么办?

  • P兄这样想:我和目标已经很近了,只需要轻轻加热就可以了。
  • D兄这样想:加热和散热相等,温度没有波动,我好像不用调整什么。

于是,水温永远地停留在45℃,永远到不了50℃。

作为一个人,根据常识,我们知道,应该进一步增加加热的功率。可是增加多少该如何计算呢?
前辈科学家们想到的方法是真的巧妙。

设置一个积分量。只要偏差存在,就不断地对偏差进行积分(累加),并反应在调节力度上。

这样一来,即使45℃和50℃相差不太大,但是随着时间的推移,只要没达到目标温度,这个积分量就不断增加。系统就会慢慢意识到:还没有到达目标温度,该增加功率啦!
到了目标温度后,假设温度没有波动,积分值就不会再变动。这时,加热功率仍然等于散热功率。但是,温度是稳稳的50℃。
kI的值越大,积分时乘的系数就越大,积分效果越明显。

所以,I的作用就是,减小静态情况下的误差,让受控物理量尽可能接近目标值。

I在使用时还有个问题:需要设定积分限制。防止在刚开始加热时,就把积分量积得太大,难以控制。

这篇就写到这里。要想直观地体验PID的控制作用,需要一个具体的东西来调试。
LZ以后完成倒立摆项目后,会用一些视频来演示PID参数的整定方法。

原创粉丝点击