系统模型及参数
前面教程已经得出了定速巡航系统的传递函数模型:
P
(
s
)
=
V
(
s
)
U
(
s
)
=
1
m
s
+
b
[
m
/
s
N
]
P(s) = \frac{V(s)}{U(s)} = \frac{1}{ms+b} \qquad [ \frac{m/s}{N} ]
P(s)=U(s)V(s)=ms+b1[Nm/s]本教程采用的系统参数如下:
m
车辆质量 1000 kg
b
阻尼系数 50 N.s/m
u
额定控制力 500 N
控制性能目标
- 上升时间 < 5s
- 超调 < 10%
- 稳态误差 < 2%
PID概述
典型的反馈系统的框图如下所示:
回顾控制教程 —— 介绍篇:3.PID控制器设计,PID控制器的传递函数为:
C
(
s
)
=
K
p
+
K
i
s
+
K
d
s
=
K
d
s
2
+
K
p
s
+
K
i
s
C(s) = K_p + \frac{K_i}{s} + K_d s = \frac{K_d s^2 +K_p s + K_i}{s}
C(s)=Kp+sKi+Kds=sKds2+Kps+Ki我们可以使用传递函数直接在MATLAB中定义PID控制器:
Kp = 1;
Ki = 1;
Kd = 1;
s = tf('s');
C = Kp + Ki/s + Kd*s
或者,我们可以使用MATLAB的pid
控制器对象生成等效的连续时间控制器,如下所示:
C = pid(Kp,Ki,Kd)
比例控制
解决定速巡航的首要事情是找到添加比例控制(
C
=
K
p
C=K_p
C=Kp)的闭环传递函数。
通过简化单位反馈框图,带有比例控制器的闭环传递函数为:
T
(
s
)
=
Y
(
s
)
R
(
s
)
=
P
(
s
)
C
(
s
)
1
+
P
(
s
)
C
(
s
)
=
K
p
m
s
+
b
+
K
p
T(s) = \frac{Y(s)}{R(s)} = \frac{P(s)C(s)}{1+P(s)C(s)} = \frac{K_p}{m s+b+K_p}
T(s)=R(s)Y(s)=1+P(s)C(s)P(s)C(s)=ms+b+KpKp
从控制教程 —— 介绍篇:3.PID控制器设计中可以得出,比例控制器
K
p
K_p
Kp 可以减少上升时间。
现在,使用
K
p
=
100
K_p = 100
Kp=100 并给定参考速度为
10
m
/
s
10m/s
10m/s。
m = 1000;
b = 50;
r = 10;
s = tf('s');
P_cruise = 1/(m*s + b);
Kp = 100;
C = pid(Kp);
T = feedback(C*P_cruise,1)
t = 0:0.1:20;
step(r*T,t)
axis([0 20 0 10])
注意,我们已使用MATLAB的feedback
命令简化闭环系统的框图,请亲自确认结果是否与上述推导的闭环传递函数T
一致。
从图中可以看出,稳态误差和上升时间均未达到我们的设计标准。
您可以增加比例增益
K
p
K_p
Kp 来减少上升时间和稳态误差。使
K
p
K_p
Kp 等于5000,重新运行可以得到:
Kp = 5000;
C = pid(Kp);
T = feedback(C*P_cruise,1);
step(r*T,t)
axis([0 20 0 10])
稳态误差现在基本上为0,并且上升时间已大大减少。然而,这种响应是不现实的,因为由于发动机和传动系统的功率限制,实际的巡航控制系统通常不能在不到0.5s 的时间内将车辆的速度从0改变到 10m/s。
在控制系统工程中,执行器限制在实践中经常遇到,因此,在提出新控制器时必须始终考虑所需的控制动作,我们将在后续教程中讨论该问题。
在这种情况下,该问题的解决方案是选择一个较低的比例增益
K
p
K_p
Kp ,该比例增益将给出合理的上升时间,并添加一个积分控制器来消除稳态误差。
PI 控制器
具有PI控制器(
C
=
K
p
+
K
i
/
s
C=K_p+K_i/s
C=Kp+Ki/s)的巡航控制系统的闭环传递函数为:
T
(
s
)
=
Y
(
s
)
R
(
s
)
=
P
(
s
)
C
(
s
)
1
+
P
(
s
)
C
(
s
)
=
K
p
s
+
K
i
m
s
2
+
(
b
+
K
p
)
s
+
K
i
T(s) = \frac{Y(s)}{R(s)} = \frac{P(s)C(s)}{1+P(s)C(s)} = \frac{K_p s + K_i}{m s^2+(b+K_p)s + K_i}
T(s)=R(s)Y(s)=1+P(s)C(s)P(s)C(s)=ms2+(b+Kp)s+KiKps+Ki从控制教程 —— 介绍篇:3.PID控制器设计中可以得出,系统中增加了一个积分控制器,从而消除了稳态误差。现在,让
K
p
K_p
Kp 等于 600 和
K
i
K_i
Ki 等于 1,看看响应发生了什么变化。
Kp = 600;
Ki = 1;
C = pid(Kp,Ki);
T = feedback(C*P_cruise,1);
step(r*T,t)
axis([0 20 0 10])
现在调整比例增益
K
p
K_p
Kp 和积分增益
K
i
K_i
Ki ,以获得所需的响应,调整积分增益
K
i
K_i
Ki 时,建议您从一个较小的值开始,因为较大的
K
i
K_i
Ki 可能会使响应不稳定。当
K
p
K_p
Kp 等于 800 而
K
i
K_i
Ki 等于 40 时,阶跃响应将如下所示。
Kp = 800;
Ki = 40;
C = pid(Kp,Ki);
T = feedback(C*P_cruise,1);
step(r*T,t)
axis([0 20 0 10])
PID 控制器
在本示例中,不需要额外的微分控制器即可实现理想的性能,但是,您可能想了解加入微分控制器后的表现。具有PID控制器(
C
=
K
p
+
K
i
/
s
+
K
d
s
C=K_p+K_i/s+K_ds
C=Kp+Ki/s+Kds)的巡航控制系统的闭环传递函数为:
T
(
s
)
=
Y
(
s
)
R
(
s
)
=
P
(
s
)
C
(
s
)
1
+
P
(
s
)
C
(
s
)
=
K
d
s
2
+
K
p
s
+
K
i
(
m
+
K
d
)
s
2
+
(
b
+
K
p
)
s
+
K
i
T(s) = \frac{Y(s)}{R(s)} = \frac{P(s)C(s)}{1+P(s)C(s)} = \frac{K_d s^2 + K_p s + K_i}{(m + K_d) s^2 +(b+K_p)s + K_i}
T(s)=R(s)Y(s)=1+P(s)C(s)P(s)C(s)=(m+Kd)s2+(b+Kp)s+KiKds2+Kps+Ki假设
K
p
=
1
K_p=1
Kp=1,
K
i
=
1
K_i=1
Ki=1,
K
d
=
1
K_d=1
Kd=1,如下:
Kp = 1;
Ki = 1;
Kd = 1;
C = pid(Kp,Ki,Kd);
T = feedback(C*P_cruise,1);
绘制阶跃响应并调整所有
K
p
,
K
i
,
K
d
K_p,K_i,K_d
Kp,Ki,Kd,直到获得满意的结果。
建议,通常为满足所需要的性能需要反复调整PID控制器各项增益,解决这一繁琐过程的最佳方法是每次仅调整一个变量(
K
p
,
K
i
K_p,K_i
Kp,Ki或
K
d
K_d
Kd),并观察这种改变下响应的变化。控制教程 —— 介绍篇:3.PID控制器设计中已经描述了各项的特性。