我们将考虑以下统一反馈系统:
PID 控制器的输出(等于设备的控制输入)在时域中根据反馈误差计算如下:
u ( t ) = K p e ( t ) + K i ∫ e ( t ) d t + K p d e d t − − − − − − − − − − − − ( 1 ) u(t) = K_p e(t) + K_i \int e(t)dt + K_p \frac{de}{dt} ------------(1) u(t)=Kpe(t)+Ki∫e(t)dt+Kpdtde−−−−−−−−−−−−(1)
首先,让我们使用上图所示的原理图来看看 PID 控制器如何在闭环系统中工作。变量 ( e e e) 表示跟踪误差,即期望输出 ( r r r) 与实际输出 ( y y y)之间的差异。该误差信号 ( e e e) 被馈送到 PID 控制器,控制器计算该误差信号相对于时间的导数和积分。设备的控制信号 ( u u u) 等于比例增益 ( K p K_p Kp) 乘以误差幅度加上积分增益 ( K i K_i Ki) 乘以误差积分加上微分增益 ( K d K_d Kd) 乘以误差导数。
该控制信号 ( u u u) 被馈送到工厂并获得新的输出 ( y y y)。 y y y然后反馈新的输出 ( ) 并与参考进行比较以找到新的错误信号 ( e e e)。控制器采用这个新的错误信号并计算控制输入的更新。当控制器有效时,此过程将继续。
PID 控制器的传递函数是通过对等式 (1) 进行拉普拉斯变换来找到的。
K p + K i s + K d s = K d s 2 + K p s + K i s − − − − − − − − − − − − ( 2 ) K_p + \frac {K_i} {s} + K_d s = \frac{K_d s^2 + K_p s + K_i} {s} ------------(2) Kp+sKi+Kds=sKds2+Kps+Ki−−−−−−−−−−−−(2)
其中 K p K_p Kp= 比例增益, K i K_i Ki= 积分增益,和 K d K_d Kd= 微分增益。
我们可以直接使用传递函数模型在 MATLAB 中定义 PID 控制器,例如:
Kp = 1;
Ki = 1;
Kd = 1;
s = tf('s');
C = Kp + Ki/s + Kd*s
或者,我们可以使用 MATLAB 的pid 对象来生成等效的连续时间控制器,如下所示:
C = pid(Kp,Ki,Kd)
让我们将 pid 对象转换为传递函数以验证它是否产生与上述相同的结果:
tf(C)
增加比例增益 ( K p K_p Kp) 具有在相同误差水平下按比例增加控制信号的效果。对于给定的误差水平,控制器将更用力地“推动”这一事实往往会导致闭环系统反应更快,但也会导致更多的过冲。增加的另一个效果 K p K_p Kp是它趋于减少,但不会消除稳态误差。
将微分项添加到控制器 ( K d K_d Kd) 增加了控制器“预测”错误的能力。对于简单的比例控制,如果 K p K_p Kp是固定的,那么控制增加的唯一方法就是误差增加。对于微分控制,如果误差开始向上倾斜,即使误差幅度仍然相对较小,控制信号也会变大。这种预期往往会增加系统的阻尼,从而减少过冲。然而,添加微分项对稳态误差没有影响。
将积分项添加到控制器 ( K i K_i Ki) 有助于减少稳态误差。如果存在持续、稳定的误差,积分器会不断累积,从而增加控制信号并降低误差。然而,积分项的一个缺点是它会使系统更加缓慢(和振荡),因为当误差信号改变符号时,积分器可能需要一段时间才能“展开”。
下表总结了每个控制器参数 ( K p K_p Kp, K d K_d Kd, K i K_i Ki) 对闭环系统的一般影响。请注意,这些准则适用于许多情况,但不是全部。如果您真的想知道调整单个增益的效果,则必须进行更多分析,或者必须对实际系统进行测试。
假设我们有一个简单的质量弹簧阻尼器系统。
该系统的控制方程为
m x ¨ + b x ˙ + k x = F − − − − − − − − − − − − − − − − − − − ( 3 ) m\ddot{x} + b\dot{x} + kx = F-------------------(3) mx¨+bx˙+kx=F−−−−−−−−−−−−−−−−−−−(3)
对控制方程进行拉普拉斯变换,我们得到
m s 2 X ( s ) + b s X ( s ) + k X ( s ) = F ( s ) − − − − − − − − − − − − ( 4 ) ms^{2}X(s) + bsX(s) + kX(s) = F(s) ------------(4) ms2X(s)+bsX(s)+kX(s)=F(s)−−−−−−−−−−−−(4)
输入力 F ( s ) F(s) F(s)和输出位移之间的传递函数 X ( s ) X(s) X(s)变为
X ( s ) F ( s ) = 1 m s 2 + b s + k − − − − − − − − − − − − − − − − − − ( 5 ) \frac{X(s)}{F(s)} = \frac{1}{ms^2 + bs + k} ------------------(5) F(s)X(s)=ms2+bs+k1−−−−−−−−−−−−−−−−−−(5)
让
m = 1 kg
b = 10 N s/m
k = 20 N/m
F = 1 N
这些值代入上述传递函数
X ( s ) F ( s ) = 1 s 2 + 10 s + 20 − − − − − − − − − − − − − − − − − − ( 6 ) \frac{X(s)}{F(s)} = \frac{1}{s^2 + 10s + 20} ------------------(6) F(s)X(s)=s2+10s+201−−−−−−−−−−−−−−−−−−(6)
这个问题的目标是展示每个项$K_p$, $K_i$, 和$K_d$, 如何有助于获得以下共同目标:
快速上升时间
最小的过冲
零稳态误差
先来看看开环阶跃响应。创建一个新的m 文件并运行以下代码:
s = tf('s');
P = 1/(s^2 + 10*s + 20);
step(P)
对象传递函数的直流增益为 1/20,因此 0.05 是单位阶跃输入的输出最终值。这对应于 0.95 的稳态误差,这是相当大的。此外,上升时间约为 1 秒,稳定时间约为 1.5 秒。让我们设计一个控制器来减少上升时间、减少稳定时间并消除稳态误差。
从上表中,我们看到比例控制器( K p K_p Kp)减少了上升时间,增加了超调量,减少了稳态误差。
我们带有比例控制器的单位反馈系统的闭环传递函数如下,其中 X ( s ) X(s) X(s)是我们的输出(等于 Y ( s ) Y(s) Y(s)),我们的参考 R ( s ) R(s) R(s)是输入:
T ( s ) = X ( s ) R ( s ) = K p s 2 + 10 s + ( 20 + K p ) − − − − − − − − − − − − ( 7 ) T(s) = \frac{X(s)}{R(s)} = \frac{K_p}{s^2 + 10s + (20 + K_p)} ------------(7) T(s)=R(s)X(s)=s2+10s+(20+Kp)Kp−−−−−−−−−−−−(7)
让比例增益 ( K p K_p Kp) 等于 300 并将 m 文件更改为以下内容:
Kp = 300;
C = pid(Kp)
T = feedback(C*P,1)
t = 0:0.01:2;
step(T,t)
上图显示比例控制器减少了上升时间和稳态误差,增加了超调,并少量减少了稳定时间。
来看看 PD 控制。从上表中,我们看到添加微分控制 ( K d K_d Kd) 趋于减少超调和稳定时间。具有 PD 控制器的给定系统的闭环传递函数为:
T ( s ) = X ( s ) R ( s ) = K d s + K p s 2 + ( 10 + K d ) s + ( 20 + K p ) − − − − − − − − − − − − − ( 8 ) T(s) = \frac{X(s)}{R(s)} = \frac{K_d s + K_p}{s^2 + (10 + K_d) s + (20 + K_p)} -------------(8) T(s)=R(s)X(s)=s2+(10+Kd)s+(20+Kp)Kds+Kp−−−−−−−−−−−−−(8)
让 K p K_p Kp等于 300 和以前一样 K d K_d Kd等于 10。将以下命令输入到 m 文件中,并在 MATLAB 命令窗口中运行它。
Kp = 300;
Kd = 10;
C = pid(Kp,0,Kd)
T = feedback(C*P,1)
t = 0:0.01:2;
step(T,t)
该图表明,微分项的添加减少了过冲和稳定时间,对上升时间和稳态误差的影响可以忽略不计。
在进行 PID 控制之前,让我们研究一下 PI 控制。从表中,我们看到,除了积分控制(的 K i K_i Ki)趋于减小的上升时间,同时增加过冲和稳定时间,并降低了稳态误差。对于给定系统,带有 PI 控制器的闭环传递函数为:
T ( s ) = X ( s ) R ( s ) = K p s + K i s 3 + 10 s 2 + ( 20 + K p ) s + K i − − − − − − − − − − − − − ( 9 ) T(s) = \frac{X(s)}{R(s)} = \frac{K_p s + K_i}{s^3 + 10 s^2 + (20 + K_p )s + K_i} -------------(9) T(s)=R(s)X(s)=s3+10s2+(20+Kp)s+KiKps+Ki−−−−−−−−−−−−−(9)
让我们减少 K p K_p Kp到 30,让 K i K_i Ki等于 70。创建一个新的 m 文件并输入以下命令。
Kp = 30;
Ki = 70;
C = pid(Kp,Ki)
T = feedback(C*P,1)
t = 0:0.01:2;
step(T,t)
在 MATLAB 命令窗口中运行这个 m 文件,你应该生成上面的图。我们降低了比例增益 ( K p K_p Kp),因为积分控制器也像比例控制器一样减少了上升时间并增加了过冲(双重效应)。上述响应表明积分控制器消除了这种情况下的稳态误差。
现在,让我们检查 PID 控制。具有 PID 控制器的给定系统的闭环传递函数为:
T ( s ) = X ( s ) R ( s ) = K d s 2 + K p s + K i s 3 + ( 10 + K d ) s 2 + ( 20 + K p ) s + K i − − − − − − − − − − − − ( 10 ) T(s) = \frac{X(s)}{R(s)} = \frac{K_d s^2 + K_p s + K_i}{s^3 + (10 + K_d)s^2 + ( 20 + K_p)s + K_i } ------------(10) T(s)=R(s)X(s)=s3+(10+Kd)s2+(20+Kp)s+KiKds2+Kps+Ki−−−−−−−−−−−−(10)
经过多次迭代调整后,增益 K p K_p Kp= 350、 K i K_i Ki= 300 和 K d K_d Kd= 50 提供了所需的响应。要确认,请在 m 文件中输入以下命令并在命令窗口中运行它。您应该获得以下阶跃响应。
Kp = 350;
Ki = 300;
Kd = 50;
C = pid(Kp,Ki,Kd)
T = feedback(C*P,1);
t = 0:0.01:2;
step(T,t)
现在,我们设计了一个无过冲、快速上升时间和无稳态误差的闭环系统。
当您为给定系统设计 PID 控制器时,请按照下面显示的步骤获得所需的响应。
最后,请记住,如果没有必要,您不需要将所有三个控制器(比例、微分和积分)都实现到一个系统中。例如,如果 PI 控制器满足给定要求(如上面的示例),那么您不需要在系统上实现派生控制器。使控制器尽可能简单。
MATLAB 提供了用于自动选择最佳 PID 增益的工具,这使得上述试错过程变得不必要。则可以直接使用访问调谐算法pidtune或通过使用一个漂亮的图形用户界面(GUI)pidTuner。
MATLAB 自动调整算法选择 PID 增益来平衡性能(响应时间、带宽)和稳健性(稳定性裕度)。默认情况下,算法设计为 60 度相位裕度。
让我们首先通过输入如下所示的命令为质量弹簧阻尼器系统生成比例控制器来探索这些自动化工具。在所示语法中,P是先前生成的对象模型,“p”指定调谐器采用比例控制器。
pidTuner(P,'p')
所述pidTuner GUI窗口,像如下所示,应该出现。
请注意,显示的阶跃响应比我们手工设计的比例控制器慢。现在单击右上角的“显示参数”按钮。正如预期的那样,比例增益 K p K_p Kp小于我们采用的比例增益 K p K_p Kp= 94.86 < 300。
我们现在可以交互式地调整控制器参数,并立即在 GUI 窗口中看到结果响应。尝试将响应时间滑块向右拖动到 0.14 秒,如下图所示。这导致响应确实加快了,我们 K p K_p Kp现在可以看到 更接近于手动选择的值。我们还可以看到系统的其他性能和稳健性参数。请注意,在我们调整滑块之前,目标相位裕度为 60 度。这是 pidTuner 的默认设置,通常在健壮性和性能之间提供良好的平衡。
现在让我们尝试为我们的系统设计一个 PID 控制器。通过指定先前设计的或(基线)控制器 C 作为第二个参数,pidTuner 将设计另一个 PID 控制器(而不是 P 或 PI),并将系统与自动控制器的响应与基线的响应进行比较。
pidTuner(P,C)
我们在输出窗口中看到,自动控制器的响应速度较慢,并且比基线表现出更多的过冲。现在从工具条中选择域:频率选项,它显示频域调谐参数。
现在,在输入32弧度/秒为带宽和90度为相位裕量,以产生在性能与基线类似的控制器。请记住,更高的闭环带宽会导致更快的上升时间,更大的相位裕度会减少过冲并提高系统稳定性。
最后,我们注意到我们可以使用命令行工具pidtune而不是pidTuner GUI 使用以下语法生成相同的控制器。
opts = pidtuneOptions( 'CrossoverFrequency' ,32, 'PhaseMargin' ,90);
[C, info] = pidtune(P, 'pid' , opts)
MATLAB 和 Simulink (CTMS) 控制教程