文章目录
Matlab 仿真——直流电机速度控制(5)通过频域分析进行控制器设计
1. 受控对象与设计要求
受控对象
%motor parameter
J = 0.01;
b = 0.1;
K = 0.01;
R = 1;
L = 0.5;
%motor tf function
s = tf('s');
P_motor = K/((J*s+b)*(L*s+R)+K^2)
设计需求(阶跃响应):
- 稳定时间<2s
- 超调<5%
- 稳态误差<1%
2. 画出原始波特图
基于频域分析的控制器设计主要思想是用开环转换方程的波特图来估计闭环响应,通过增加控制器改变开环波特图的方式,以达到改变闭环响应的效果。我们先看一下没有控制器的电机系统的开环波特图
bode(P_motor)
grid
title('Bode Plot of the Original Plant')
3. 增加P增益
从上述波特图我们发现,该系统有无穷大的幅值裕度与相位裕度,表明了系统稳定且有最小的超调。但是由于幅值图像对于任何频率都在0 dB下面,那么就带来了问题,那就是该系统难以跟踪没太大误差的参考信号[^1],因此我们需要在保持一定相位裕度的同时增大系统的增益。
一般来说60度的相位裕度对于稳定裕度是足够的。由上述波特图我们看得到,要满足60°的相位裕度,穿越频率大概为 10rad/sec。所以新加的增益要能够使幅值穿越频率发生在10 rad/sec处,也就是现在-40 dB的地方。我们运行以下代码查看该处的相位和幅度
[mag,phase,w] = bode(P_motor,10)
因此,幅值穿越频率发生在10 rad/sec处时相位裕度为 180-123.7=56.3 度,此时的幅度为 20log0.0139=-37.1dB。因此为了让幅值穿越频率发生在此,我们需要给系统一个1/0.0139 = 72的增益。
C = 72;
margin(C*P_motor);
4. 闭环时域响应
给原系统增加了一个增益之后,我们看一下时域性能
sys_cl = feedback(C*P_motor,1);
t = 0:0.01:10;
step(sys_cl,t), grid
title('Step Response with Proportional Gain = 72')
stepinfo(sys_cl)
稳态误差和超调都很大,我们可以减小系统增益来减小超调,但是这会导致稳态误差也更大。一个Lag 补偿器在这里能够很好地帮助我们解决这个问题。
5. 添加一个Lag补偿器
我们考虑添加如下的 Lag 补偿器
C
(
s
)
=
(
s
+
1
)
(
s
+
0.01
)
C(s) = \frac {(s + 1)} { (s + 0.01) }
C(s)=(s+0.01)(s+1)
该补偿器有个1/0.01=100的直流增益,意味着它把系统的位置误差常数提升了100倍,因此可以相应地减少稳态误差。实际上它也允许了我们适当减少上面得到的72这个增益,这里我们用45。此外,由于极点和零点的转折频率比当前的增益穿越频率10 rad / sec低十倍或十倍以上,因此补偿器产生的相位滞后不会对性能产生很大的不利影响。于是我们画出该补偿器的波特图
C = 45*(s + 1)/(s + 0.01);
bode(C)
grid
title('Bode Plot of the Lag Compensator')
然后我们看看添加了补偿器之后的系统的时域响应
sys_cl = feedback(C*P_motor,1);
t = 0:0.01:10;
step(sys_cl,t), grid
title('Step Response with Lag Compensator')
stepinfo(sys_cl)
满足了我们的设计要求
6. 几个问题
- 怎么理解幅值图像都在0 dB下面的系统难以跟踪大误差信号?
- 60°的相位裕度比较适合的依据?
7. 参考
https://ctms.engin.umich.edu/CTMS/index.php?example=MotorSpeed§ion=ControlFrequency