PID控制算法



目录

  • 前言
  • 原理
    • 公式推导
    • 位置式PID
    • 增量式PID
  • PID性能指标
    • 超调量
    • 调节时间
    • 震荡频率
    • 上升时间
  • PID算法改进
    • 上下限设定法
    • 死区设定法
    • 积分部分改进
    • 微分部分改进
    • 不完全微分法
    • 微分先行法


前言

PID即:Proportional(比例)、Integral(积分)、Differential(微分)的缩写。PID控制算法是结合比例、积分和微分三种环节于一体的控制算法。PID是闭环控制算法中最简单的一种,常应用于温度、电机控制等等。


原理



公式推导

PID公式:
u ( t ) = K p [ e ( t ) + 1 T i ∫ 0 t e ( t )   d t + T d d e ( t ) d t ] (1) u(t) = K_p[e(t) + \frac{1}{T_i}\int_0^t {e(t)}\,{\rm d}t + T_d \frac{{\rm d}e(t)}{{\rm d}t}] \tag{1} u(t)=Kp[e(t)+Ti10te(t)dt+Tddtde(t)](1)

其中 K p K_p Kp为比例系数, T i T_i Ti为积分时间, T d T_d Td为微分时间。

看公式就可以看出这是比例部分、积分部分和微分部分的加和,因此称为PID(proportion, integration, differential)。

在实际应用中,我们需要将该连续公式转化为离散公式,因此我们需要进行一下替换:

连续时间t ⟶ \longrightarrow 采样时间kT

积分 ⟶ \longrightarrow 求和: ∫ 0 t e ( t )   d t \int_0^t {e(t)}\,{\rm d}t 0te(t)dt ⟶ \longrightarrow T ∑ j = 0 k e ( j T ) T\sum_{j=0}^k e(jT) Tj=0ke(jT)

微分 ⟶ \longrightarrow 单位差值 d e ( t ) d t \frac{{\rm d}e(t)}{{\rm d}t} dtde(t) ⟶ \longrightarrow e k − e k − 1 T \frac{e_k - e_{k-1}}{T} Tekek1


因为我们得到离散化的公式:
u ( k ) = K p e ( k T ) + K i ∑ j = 0 k e ( j T ) + K d ( e ( k T ) − e ( ( k − 1 ) T ) ) (2) u(k) = K_pe(kT) + K_i\sum_{j=0}^ke(jT) + K_d(e(kT) - e((k-1)T)) \tag{2} u(k)=Kpe(kT)+Kij=0ke(jT)+Kd(e(kT)e((k1)T))(2)

其中 K i = K p T T i K_i = \frac{K_pT}{T_i} Ki=TiKpT K d = K p T d T Kd = \frac{K_pT_d}{T} Kd=TKpTd


位置式PID

上面得到的公式,计算的值就是位置式PID,是当前负载应该输出的值。

比例项是对输出量起决定性作用的,当前值与目标值差值越大,则比例项越大。

需要注意的是,公式中包含积分成分,因此仅适用于不包含积分效果的负载,即实时响应的,比如发热块。

并且在使用时,需要设置积分最大值,因为当误差一直为正时,积分项一直在累加,会导致积分项很大,当误差为负时,此时积分项不能及时减去,导致超调。

微分项的作用是抑制变化,误差为正时,微分项为负,误差为负时,微分项为正。微分具有预测的功能,它体现的是检测值的变化趋势,适当的值有利于稳定目标值。

注:在调整PID参数时,应该先调P,再调I,最后调整D。


增量式PID

顾名思义增量式就是当前输出量相比上一刻的输出量应该增加的值。

由公式2可以得出上一刻的公式:
u ( k − 1 ) = K p e ( ( k − 1 ) T ) + K i ∑ j = 0 k − 1 e ( j T ) + K d ( e ( ( k − 1 ) T ) − e ( ( k − 2 ) T ) ) (3) u(k-1) = K_pe((k-1)T) + K_i\sum_{j=0}^{k-1}e(jT) + K_d(e((k-1)T) - e((k-2)T)) \tag{3} u(k1)=Kpe((k1)T)+Kij=0k1e(jT)+Kd(e((k1)T)e((k2)T))(3)
公式2和公式3相减得到:
△ u ( k ) = K p ( e ( k T ) − e ( ( k − 1 ) T ) ) + k i e k + K d ( e ( k ) − 2 e ( ( k − 1 ) T ) + e ( ( k − 2 ) T ) ) (4) \bigtriangleup u(k) = K_p(e(kT) - e((k-1)T)) + k_ie_k + K_d(e(k) - 2e((k-1)T) + e((k-2)T)) \tag{4} u(k)=Kp(e(kT)e((k1)T))+kiek+Kd(e(k)2e((k1)T)+e((k2)T))(4)

可以看出输出结果只与k, k-1, k-2时刻的反馈值有关,无积分作用。并且是作用于上一刻的控制量上的增加量。

增量式PID可以应用于带有积分结构的负载。


PID性能指标

在使用PID控制时,我们需要估算此时使用的PID参数实际应用的性能如何,能否达到要求,一般从以下3点观察。



超调量

顾名思义,超调量就是实际的反馈值超过设定值的量,它所占整个调整量的百分比。

PID控制算法_第1张图片
从图中可以看出,最大动态偏差(第一个波峰超过设定值的幅度)差不多是0.16,那么超调量为0.16/1 = 16%。


调节时间

调节时间是指从调整开始到稳态误差在要求范围内,所需要的时间,调节时间越短越好。

上图的调节时间大约在50左右。


震荡频率

震荡频率表现的是系统调整的速度,一般来说震荡频率越快越好,最后趋于平稳。


上升时间

上升时间是指实际值第一次达到设定值的时间,即快速上升阶段的时间,时间越短越好。


PID算法改进

实际使用过程中,PID会有较大的局限性,导致调参过程中,根本无法达到要求,因此我们需要根据实际情况,进行改进。下面介绍几种常用的改进方法。



上下限设定法

有些场景下,并不希望全开或者全关,因此我们需要设置最大输出值和最小输出值, u m i n ≤ u ( t ) ≤ u m a x u_{min} \leq u(t) \leq u_{max} uminu(t)umax


死区设定法

有时候,因为PID不断地调节,使得输出曲线不断震荡,当我们需要一个平稳的曲线时,我们可以在一段区间内,使负载不受PID控制,由固定功率运行,在区间外则重新受PID控制。


积分部分改进

我们知道积分部分是历史误差的和,既可以提高系统的响应速度,又可以帮助系统消除稳态误差。

当前值小于设定值时,积分项一直在累加,此时帮助输出值能够更快得达到设定值;但是当前值等于设定值时,比例项为0,积分项达到最大值,仍然会有输出,它会增大系统的超调量。

在当前值大于设定值时,积分项开始减小,帮助系统回到设定值。在只有比例项时,系统的振动幅度往往很大,加入积分项后,可以使系统更加稳定。

为了减小积分部分对超调量的影响,我们可以做出以下改进:

设置积分项上限:在第一个上升阶段,有较长的时间处于低于设定值的状态,积分项增加的很快,当当前值大于设定值时,又不能及时地减去积分项,因此我们可以设定一个积分项的最大值,使得积分项不至于累加过大。

设置积分有效区间:上面这种情况,我们也可以设置积分的有效区间,当当前值与设定值差值过大时,积分不进行累加,只有差值在一定的范围内时,积分开始累加,这样积分项不会累加的过大。也可以将在差值过大时的积分系数减小,达到相同的效果。


微分部分改进

微分部分是抑制系统输出值变化的,使系统更加稳定。它的趋势预测能力也可以帮助控制一些反馈滞后的系统,比如温度控制系统。但是微分部分往往是直接加上的,并且只持续一个时间周期,使得系统并不能稳定,且抗干扰能力减弱。

因此我们需要对微分部分进行一些改进措施:

不完全微分法

我们可以加入低通滤波器的方法,将微分项变得平缓一点。
PID控制算法_第2张图片

传递函数为:
H ( j w ) = V o u t V i n = 1 j w C R + 1 j w C = 1 1 + j w R C (5) H(jw) = \frac{V_{out}}{V_{in}} = \frac{\frac{1}{jwC}}{R + \frac{1}{jwC}} = \frac{1}{1 + jwRC} \tag{5} H(jw)=VinVout=R+jwC1jwC1=1+jwRC1(5)

s = j w s = jw s=jw,则
H ( s ) = 1 1 + s R C (6) H(s) = \frac{1}{1 + sRC} \tag{6} H(s)=1+sRC1(6)

对s进行Z变化,这里采用一阶向后差分的方法:
s = 1 − z − 1 T (7) s = \frac{1 - z^{-1}}{T} \tag{7} s=T1z1(7)


推导过程如下:

U ( s ) E ( s ) = 1 s \frac{U(s)}{E(s)} = \frac{1}{s} E(s)U(s)=s1,对其进行微分可以得到
d u ( t ) d t = u ( k T ) − u [ ( k − 1 ) T ] T = e ( t ) (8) \frac{{\rm d}u(t)}{{\rm d}t} = \frac{u(kT) - u[(k-1)T]}{T} = e(t) \tag{8} dtdu(t)=Tu(kT)u[(k1)T]=e(t)(8)

那么
u ( k T ) = u [ ( k − 1 ) T ] + T e ( k T ) (9) u(kT) = u[(k-1)T] + Te(kT) \tag{9} u(kT)=u[(k1)T]+Te(kT)(9)

Z变换:
U ( z ) = z − 1 U ( z ) + T E ( z ) (10) U(z) = z^{-1}U(z) + TE(z) \tag{10} U(z)=z1U(z)+TE(z)(10)


s = E ( s ) U ( s ) = E ( z ) U ( z ) = 1 − z − 1 T (11) s = \frac{E(s)}{U(s)} = \frac{E(z)}{U(z)} = \frac{1-z^{-1}}{T} \tag{11} s=U(s)E(s)=U(z)E(z)=T1z1(11)


带入公式(6)可以得到
H ( s ) = 1 1 + 1 − z − 1 T R C = T T + ( 1 − z − 1 ) R C (12) H(s) = \frac{1}{1 + \frac{1-z^{-1}}{T}RC} = \frac{T}{T + (1-z^{-1})RC} \tag{12} H(s)=1+T1z1RC1=T+(1z1)RCT(12)

Z逆变换后
( T + R C ) V o u t ( n ) − R C V o u t ( n − 1 ) = T V i n ( n ) (13) (T + RC)V_{out}(n) - RCV_{out}(n-1) = TV_{in}(n) \tag{13} (T+RC)Vout(n)RCVout(n1)=TVin(n)(13)

⇒ V o u t ( n ) = T V i n ( n ) + R C V o u t ( n − 1 ) T + R C = V o u t ( n − 1 ) + T T + R C ( V i n ( n ) − V o u t ( n − 1 ) ) (14) \begin{aligned} \Rightarrow V_{out}(n) = \frac{TV_{in}(n) + RCV_{out}(n-1)}{T + RC} \\ = V_{out}(n-1) + \frac{T}{T + RC}(V_{in}(n) - V_{out}(n-1)) \tag{14} \end{aligned} Vout(n)=T+RCTVin(n)+RCVout(n1)=Vout(n1)+T+RCT(Vin(n)Vout(n1))(14)

α = T T + R C \alpha = \frac{T}{T + RC} α=T+RCT,则
V o u t ( n ) = α V i n ( n ) + ( 1 − α ) V o u t ( n − 1 ) (15) V_{out}(n) = \alpha V_{in}(n) + (1 - \alpha)V_{out}(n-1) \tag{15} Vout(n)=αVin(n)+(1α)Vout(n1)(15)

将这个公式转换到PID微分项可以得到
U d ( k ) = α K d [ e ( k ) − e ( k − 1 ) ] + ( 1 − α ) U d ( k − 1 ) (16) U_d(k) = \alpha K_d [e(k) - e(k-1)] + (1 - \alpha)U_d(k-1) \tag{16} Ud(k)=αKd[e(k)e(k1)]+(1α)Ud(k1)(16)

α \alpha α的取值为0~1,越小,滤波效果越大,当 α = 0 \alpha = 0 α=0时,没有微分效果,当 α = 1 \alpha = 1 α=1时,是没有滤波的微分,即完全微分。

根据实际情况,选择合适的 α \alpha α值。


公式(16)是位置式PID的微分算法,下面计算一下差值,即可得到增量式PID微分算法
△ U d ( k ) = α K d [ e ( k ) − e ( k − 1 ) ] − α U d ( k − 1 ) (17) \bigtriangleup U_d(k) = \alpha K_d [e(k) - e(k-1)] - \alpha U_d(k-1) \tag{17} Ud(k)=αKd[e(k)e(k1)]αUd(k1)(17)


微分先行法

前面的改善方法都是在设定值不变的情况,但是如果需要不断改变设定值的情况,使得被控量以一定规律波动。

以前面的方法,是对被控量与设定值的差值进行微分,设定值频繁改变时,微分项会产生较大的突变,影响系统稳定。

因此我们这里只对被控量进行微分,对设定值不进行微分。

PID控制算法_第3张图片
我们令微分部分的传递函数为
U d ( s ) Y ( s ) = T d s + 1 γ T d s + 1 0 < γ < 1 (18) \frac{U_d(s)}{Y(s)} = \frac{T_ds + 1}{\gamma T_ds + 1} \qquad 0 < \gamma < 1 \tag{18} Y(s)Ud(s)=γTds+1Tds+10<γ<1(18)


γ T d d u ( t ) d t + u ( t ) = T d d y ( t ) d t + y ( t ) (19) \gamma T_d \frac{{\rm d}u(t)}{{\rm d}t} + u(t) = T_d \frac{{\rm d}y(t)}{{\rm d}t} + y(t) \tag{19} γTddtdu(t)+u(t)=Tddtdy(t)+y(t)(19)

将微分部分一阶滞后差分:
d u ( t ) d t = u ( k ) − u ( k − 1 ) T (20) \frac{{\rm d}u(t)}{{\rm d}t} = \frac{u(k) - u(k-1)}{T} \tag{20} dtdu(t)=Tu(k)u(k1)(20)

d y ( t ) d t = y ( k ) − y ( k − 1 ) T (21) \frac{{\rm d}y(t)}{{\rm d}t} = \frac{y(k) - y(k-1)}{T} \tag{21} dtdy(t)=Ty(k)y(k1)(21)

带入到公式(19)中得到:
u d ( k ) = γ T d γ T d + T u d ( k − 1 ) + T d + T γ T d + T y ( k ) − T d γ T d + T y ( k − 1 ) (22) u_d(k) = \frac{\gamma T_d}{\gamma T_d + T} u_d(k-1) + \frac{T_d + T}{\gamma T_d + T} y(k) - \frac{T_d}{\gamma Td + T} y(k-1) \tag{22} ud(k)=γTd+TγTdud(k1)+γTd+TTd+Ty(k)γTd+TTdy(k1)(22)

K d = K p T d T K_d = \frac{K_pT_d}{T} Kd=TKpTd带入到上式中得到:

u d ( k ) = γ K d γ K d + K p u d ( k − 1 ) + K d + K p γ K d + K p y ( k ) − K d γ K d + K p y ( k − 1 ) (23) u_d(k) = \frac{\gamma K_d}{\gamma K_d + K_p} u_d(k-1) + \frac{K_d + K_p}{\gamma K_d + K_p} y(k) - \frac{K_d}{\gamma K_d + K_p} y(k-1) \tag{23} ud(k)=γKd+KpγKdud(k1)+γKd+KpKd+Kpy(k)γKd+KpKdy(k1)(23)

上式为位置式PID的微分项,增量式PID的微分项如下:
△ u d ( k ) = − K p γ K d + K p u d ( k − 1 ) + K d + K p γ K d + K p y ( k ) − K d γ K d + K p y ( k − 1 ) (24) \bigtriangleup u_d(k) = -\frac{K_p}{\gamma K_d + K_p} u_d(k-1) + \frac{K_d + K_p}{\gamma K_d + K_p} y(k) - \frac{K_d}{\gamma K_d + K_p} y(k-1) \tag{24} ud(k)=γKd+KpKpud(k1)+γKd+KpKd+Kpy(k)γKd+KpKdy(k1)(24)


你可能感兴趣的:(PID,算法)