前面教程已经得出了定速巡航系统的传递函数模型:
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%
下面是典型的反馈控制系统框图:
性能设计目标
- 上升时间 < 5s
- 超调 < 10%
- 稳态误差 < 2%
比例控制
回顾控制教程 —— 介绍篇:4.根轨迹控制器设计,根轨迹图显示了单个增益从零变化到无穷大时所有可能的闭环极点的位置。因此,仅考虑比例控制器 K p K_p Kp 来解决该问题,闭环传递函数为:
Y ( s ) R ( s ) = K p m s + ( b + K p ) \frac{Y(s)}{R(s)}=\frac{K_p}{m s+(b+K_p)} \ R(s)Y(s)=ms+(b+Kp)Kp
另外,从控制教程 —— 介绍篇:4.根轨迹控制器设计我们知道MATLAB的命令sgrid
可以用于显示根轨迹图的范围。要使用sgrid
,首先需要确定阻尼比
ζ
\zeta
ζ,和自然频率
ω
n
\omega_n
ωn ,以下两个方程式将用于确定阻尼比和自然频率:
ω
n
≥
1.8
T
r
\omega_n \geq \frac{1.8}{Tr} \
ωn≥Tr1.8
ζ
≥
ln
2
(
M
p
)
π
2
+
ln
2
(
M
p
)
\zeta \geq \sqrt{\frac{\ln^2{(Mp)}}{\pi^2+\ln^2{(Mp)}}} \
ζ≥π2+ln2(Mp)ln2(Mp)
其中:
- ω n \omega_n ωn = 自然频率 [rad/s]
- ζ \zeta ζ = 阻尼比
- T r Tr Tr = 上升时间 [s]
- M p Mp Mp = 最大超调
我们的设计标准之一是上升时间小于5s,从第一个方程式中,我们可以得到自然频率必须大于 0.36。同样适用第二个方程式,我们可以得到阻尼比必须大于 0.6 ,因为最大过冲必须小于 10%。
现在,我们准备生产一个根轨迹图,并使用sgrid
在根轨迹上找到一个可接受的区域。
m = 1000;
b = 50;
r = 10;
s = tf('s');
P_cruise = 1/(m*s+b);
rlocus(P_cruise)
axis([-0.6 0 -0.6 0.6]);
sgrid(0.6, 0.36)
角度部分的两条虚线表示恒定阻尼比的位置(
ζ
=
0.6
\zeta=0.6
ζ=0.6);虚线之间的阻尼比大于 0.6 ,而虚线之外的阻尼比小于 0.6.半椭圆表示恒定自然频率(
ω
n
=
0.36
\omega_n =0.36
ωn=0.36)的位置,半椭圆外部的自然频率大于 0.36,内部小于 0.36。
接下来,我们可以使用 rlocfind
命令找到将闭环极点放置在所需区域中的增益。将代码[kp, poles] = rlocfind(P_cruise)
输入到MATLAB命令窗口中,运行后,您将看到提示,要求您在根轨迹图上选择一个点。由于要在虚线(
ζ
>
0.6
\zeta>0.6
ζ>0.6)和半椭圆(
ω
n
>
0.36
\omega_n>0.36
ωn>0.36)之间选择一个点,如图,约在 -0.4 的位置,如下图中的十字标记。
请注意,从MATLAB命令窗口返回的值可能并不完全相同,但至少具有相同的数量级。该返回值可以用作补偿器的增益,闭环阶跃响应可以按一下方式获得:
Kp = 350.2567;
sys_cl = feedback(Kp*P_cruise,1);
t = 0:0.1:20;
step(r*sys_cl,t)
使用您刚刚选择的增益
K
p
Kp
Kp,就可以满足上升时间和超调的条件。但是,稳态误差仍然超过 10%。
滞后控制器
为了减少稳态误差,将向系统添加一个滞后控制器,滞后控制器的传递函数为:
C
(
s
)
=
s
+
z
0
s
+
p
0
C(s) = \frac{s+z_0}{s+p_0} \
C(s)=s+p0s+z0 闭环传递函数(不包括
K
p
K_p
Kp)现在变为:
Y
(
s
)
R
(
s
)
=
s
+
z
0
m
s
2
+
(
b
+
m
p
0
)
s
+
b
p
0
\frac{Y(s)}{R(s)} = \frac{s+z_0}{m s^2 + (b+m p_0)s + b p_0} \
R(s)Y(s)=ms2+(b+mp0)s+bp0s+z0
最后,包括环路增益
K
p
K_p
Kp,闭环传递函数为:
Y
(
s
)
U
(
s
)
=
K
p
s
+
K
p
z
0
m
s
2
+
(
b
+
m
p
0
+
K
p
)
s
+
(
b
p
0
+
K
p
z
0
)
\frac{Y(s)}{U(s)} = \frac{K_p s + K_p z_0}{m s^2 + (b+m p_0+K_p)s + (b p_0+K_p z_0)} \
U(s)Y(s)=ms2+(b+mp0+Kp)s+(bp0+Kpz0)Kps+Kpz0
如果您在拓展部分(后续补充)部分查阅了关于使用根轨迹设计滞后或相位滞后补偿器部分,则滞后控制器的极点和零点必须放置在一起。而且,它将稳态误差减少
z
0
/
p
0
z_0/p_0
z0/p0。因此,假设
z
0
=
0.3
z_0=0.3
z0=0.3,
p
0
=
0.03
p_0=0.03
p0=0.03。
zo = 0.3;
po = 0.03;
s = tf('s');
C_lag = (s+zo)/(s+po);
rlocus(C_lag*P_cruise);
axis([-0.6 0 -0.4 0.4])
sgrid(0.6,0.36);
再次使用rlocfind
命令,我们可以选择一个新的环路增益
K
p
K_p
Kp。这里还是选择 -0.4 附近实轴上的点,如下图示:
[Kp,poles]=rlocfind(C_lag*P_cruise)
完成此操作后,可以从MATLAB命令窗口中看到以下输出内容。
然后,我们可以生成新的闭环阶跃响应。
Kp = 1293.6;
sys_cl = feedback(Kp*C_lag*P_cruise,1);
t = 0:0.1:20;
step(r*sys_cl,t)
axis([0 20 0 12])
如您所见,稳态误差已减小到接近零。超调是之后控制器中添加零点的结果,目前,所有设计标准都已满足,不需要进一步的迭代。但是,您可以尝试使用不同的
z
0
z_0
z0 和
p
0
p_0
p0 ,来查看它们对闭环系统响应的影响。