引言

PID控制器(比例-积分-微分控制器),由比例单元(Proportional)、积分单元(Integral)和微分单元(Derivative)组成。可以透过调整这三个单元的增益KpK_{p}KiK_{i}KdK_{d} 来调定其特性。

理论

PID是以它的三种纠正算法而命名。受控变数是三种算法(比例、积分、微分)相加后的结果,即为其输出,其输入为误差值(设定值减去测量值后的结果)或是由误差值衍生的信号。
其作用在一反馈系统中:
PID框架

对于一个自动反馈控制系统来说,共有以下几个基本指标:

  • 稳定性(P和I降低系统稳定性,D提高系统稳定性):在平衡状态下,系统受到某个干扰后,经过一段时间其被控量可以达到某一稳定状态。
  • 准确性(P和I提高稳态精度,D无作用):系统处于稳态时,其稳态误差。
  • 快速性(P和D提高响应速度,I降低响应速度):系统对动态响应的要求。一般由过渡时间的长短来衡量。

若定义U(t){U(t)} 为控制输出,PID算法可以用下式表示:

U(t)=MV(t)=Kpe(t)+Ki0te(τ)dτ+Kdddte(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)}

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

接下来,可以通过一个例子来说明PID所使用的三种算法。

引例

我们假设有一个水缸,目前水缸中水的高度是h{h},我们设置一个标准高度H(h<H){H(h<H)}。我们要不断地向其中加水,使其维持在h=H{h=H} 的高度保持不变。

比例控制

比例控制考虑当前误差,误差值和一个正值的常数Kp(表示比例)相乘。Kp只是在控制器的输出和系统的误差成比例的时候成立。

理想状态

这是不是特别简单,我们要做的便是不断向其中加水,当水的高度h{h} 趋近于目标高度H{H} 时,减缓加水的速度,直至h=H{h=H}
那么,我们就可以得到这样的关系:

dhdt=k(Hh),k>0,h[0,H](1){\dfrac{\mathrm{d}h}{\mathrm{d}t}=k(H-h),k>0,h\in[0,H]\tag{1}}

观察(1)(1) 式,不难发现其是一个微分方程。

dhdt=k(Hh)dhHh=kdtdhHh=kdt+Cln(Hh)=kt+Ch(t)=HCekt\begin{aligned} \dfrac{\mathrm{d}h}{\mathrm{d}t}&=k(H-h)\\ \dfrac{\mathrm{d}h}{H-h}&=k\mathrm{d}t\\ \int\dfrac{\mathrm{d}h}{H-h}&=\int k\mathrm{d}t+C\\ -\ln(H-h)&=kt+C\\ h(t)&=H-Ce^{-kt} \end{aligned}

因此,在理想状态下,h{h} 会趋近于目标高度H{H}

稳态误差

稳态误差是系统从一个稳态过渡到新的稳态,或系统受扰动作用又重新平衡后,系统出现的偏差。

但是,单单的比例控制存在着一些不足,其中一点便是稳态误差
还是刚才的例子,我们假设水缸破了一个洞,水会以恒定不变的速度从洞口流出。假设voutv_{\text{out}} 是单位时间里流失的水柱高度,我们仍使用比例控制算法:

dhdt=k(Hh)vout(2)\dfrac{\mathrm{d}h}{\mathrm{d}t}=k(H-h)-v_{\text{out}}\tag{2}

尝试求解(2)(2) 式:

dhdt=k(Hh)voutdhk(Hh)vout=dtdh(Hvoutk)h=kdth(t)=HvoutkCekt\begin{aligned} \dfrac{\mathrm{d}h}{\mathrm{d}t}&=k(H-h)-v_{\text{out}}\\ \dfrac{\mathrm{d}h}{k(H-h)-v_{\text{out}}}&=\mathrm{dt}\\ \int\dfrac{\mathrm{d}h}{(H-\frac{v_{\text{out}}}{k})-h}&=\int k\mathrm{d}t\\ h(t)&=H-\dfrac{v_{\text{out}}}{k}-Ce^{-kt} \end{aligned}

我们会发现,水的高度并不会趋近于目标高度H{H},只会收敛于HvoutkH-\dfrac{v_{out}}{k}
但是,你可能也会反驳道“水缸漏水,我把洞堵着不就行了嘛”,亦或者是“这是一件概率极低的事件”。那么,如果我们的控制目的是是小车在不同的地面上行驶,仍保持恒定不变的速度呢?摩擦阻力便是“水缸的洞”。

积分控制

当系统中引入一误差后,如若仍仅使用比例控制算法,那么系统便达不到稳定控制的需求。这时,我们便可以引入积分控制。

积分控制考虑过去误差,将误差值过去一段时间和(误差和)乘以一个正值的常数Ki{K_{i}}Ki{K_{i}} 从过去的平均误差值来找到系统的输出结果和预定值的平均误差

仍以破洞的水缸为例,选择积分作为分量,加到灌水速度上:

dhdt=k1(Hh)+k20t(Hh)dtvout(3)\dfrac{\mathrm{d}h}{\mathrm{d}t}=k_1(H-h)+k_2\int_0^t(H-h)\mathrm{d}t-v_{\text{out}}\tag{3}

我们将这个微分积分混合式规范化为一个二阶线性微分方程:

d2hdt2+k1dhdt+k2hk2H=0(4)\dfrac{\mathrm{d}^2h}{\mathrm{d}t^2}+k_1\dfrac{\mathrm{d}h}{\mathrm{d}t}+k_2h-k_2H=0\tag{4}

由于冗余项k2Hk_2H 是一个常数,设hh^\star 是微分方程(5)(5) 的解,那么(5)(5) 的解便是H+hH+h^\star

d2hdt2+k1dhdt+k2h=0(5)\dfrac{\mathrm{d}^2h}{\mathrm{d}t^2}+k_1\dfrac{\mathrm{d}h}{\mathrm{d}t}+k_2h=0\tag{5}

此时,求解(5)(5) 式,其特征方程为:

λ2+k1λ+k2=0(6)\lambda^2+k_1\lambda+k_2=0\tag{6}

我们假设λ1\lambda_1λ1\lambda_1(6)(6) 式的两个实根,那么微分方程(5)(5) 式的解为:

h(t)=C1eλ1t+C2eλ2t(7)h^\star(t)=C_1e^{\lambda_1t}+C_2e^{\lambda_2t}\tag{7}

显而易见,(4)(4) 式的解为:

h(t)=H+h=H+C1eλ1t+C2eλ2t(8)h(t)=H+h^\star=H+C_1e^{\lambda_1t}+C_2e^{\lambda_2t}\tag{8}

(6)(6) 式我们可以得到λ1\lambda_1λ1\lambda_1 的两个关系:

λ1λ2=k2>0λ1+λ2=k1<0\begin{aligned} \lambda_1\lambda_2&=&k_2>0\\ \lambda_1+\lambda_2&=&-k_1<0\\ \end{aligned}

基于对现实问题的讨论,我们可以知道k1k_1k2k_2 分别是 比例控制参数 和 微分控制参数。只有当它们都为正数时,系统才有可能逐渐趋于稳定。所以λ1\lambda_1λ1\lambda_1 皆为负数,这里我们可以假设λ1<λ2<0\lambda_1<\lambda_2<0.

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

微分控制

换一个另外的例子,考虑刹车情况。平稳的驾驶车辆,当发现前面有红灯时,为了使得行车平稳,会提前踩刹车减速。而当发现前方路段有突发性事件时,则会猛地踩刹车。整个过程可以看做一个加入微分的控制策略。

微分控制考虑将来误差,计算误差的一阶导,并和一个正值的常数Kd{K_{d}}相乘。这个导数的控制会对系统的改变作出反应。导数的结果越大,那么控制系统就对输出结果作出更快速的反应。

依旧以水缸为例,当水位高度趋近于HH ,即Hh<εH-h<\varepsilon。为了使水位hh 不超过目标高度HH,我们加入微分(导数)分量去控制这个系统:

dhdt=k1(Hh)+k20t(Hh)dt+k3ddt(Hh)(9)\dfrac{\mathrm{d}h}{\mathrm{d}t}=k_1(H-h)+k_2\int_0^t(H-h)\mathrm{d}t+k_3\dfrac{\mathrm{d}}{\mathrm{d}t}(H-h)\tag{9}

我们仍可以将(9)(9) 式化简为二阶微分方程:

(1+k3)d2hdt2+k1dhdt+k2hk2H=0(10)(1+k_3)\dfrac{\mathrm{d}^2h}{\mathrm{d}t^2}+k_1\dfrac{\mathrm{d}h}{\mathrm{d}t}+k_2h-k_2H=0\tag{10}

在加水的过程中,目前水位高度hh 与目标高度HH 的误差是不断减小的,所以微分控制项一定是负数。我们的目标是使得dhdt\dfrac{\mathrm{d}h}{\mathrm{d}t} 变小,所以k3>0k_{3}>0

总结

PID主要分为标准形PID和理论性PID。

“标准形”的PID为:

U(t)=Kp(e(t)+1Tt0te(t)dt+TDde(t)dt)U(t)=K_p(e(t)+\dfrac{1}{T_t}\int_0^t e(t)\mathrm{d}t+T_D\dfrac{\mathrm{d}e(t)}{\mathrm{d}t})

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

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

U(t)=MV(t)=Kpe(t)+Ki0te(τ)dτ+Kdddte(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)}

平行式PID中的参数都视为单纯的增益,最泛用,灵活性也最高,但较没有物理意义,因此只用在PID的理论处理中,标准形PID虽在数学上比较复杂,在工业中较常使用。