直流电机控制
本示例比较了三种直流电机控制方法:
- 直接控制
- 反馈控制
- LQR 控制。
让我们比较一下这些方法对负载干扰的敏感性。
问题陈述
在锚控制 DCT 中,输入电压 控制电机轴的角速度。

本例展示了两种控制 DPT 的方法,以降低 对负载变化(电机负载产生的扭矩变化)的敏感性。

简化的直流电机模型如上图所示。转矩参数 模拟负载干扰。应尽量减少此类干扰引起的速度波动。
让我们来设置电机参数。在本例中,物理常数为
Pkg.add(["LinearAlgebra", "RobustAndOptimalControl", "ControlSystems", "ControlSystemsBase"])
import Pkg;
Pkg.add("ControlSystemsBase")
Pkg.add("RobustAndOptimalControl")
Pkg.add("LinearAlgebra")
using ControlSystems, ControlSystemsBase, RobustAndOptimalControl, LinearAlgebra
R = 2.0 ;
L = 0.5;
Km = 0.1;
Kb = 0.1;
Kf = 0.2;
J = 0.02;
让我们建立一个具有两个输入 (,) 和一个输出 () 的 DPT 模型。首先,让我们以传递函数的形式来定义上述结构图中各块的描述。
h1 = tf([Km], [L, R])
h2 = tf([1], [J, Kf])
建立模块之间的联系。分配输入和输出信号的名称,定义汇总模块,并使用函数connect()
建立模块之间的联系。
为输入和输出信号指定名称。
H1 = named_ss(h1, x = :xH1, u = :uH1, y = :yH1)
H2 = named_ss(h2, x = :xH2, u = :uH2, y = :yH2)
Kb = named_ss(ss(Kb), x = :xKb, u = :uKb, y = :yKb)
指定汇总单元的输入和输出信号。
Sum1 = sumblock("uH1 = Va - yKb")
Sum2 = sumblock("uH2 = yH1 + Td")
在模块的输出和输入之间建立对应关系。
connections = [
:uH1 => :uH1;
:yH1 => :yH1;
:uH2 => :uH2;
:yH2 => :uKb;
:yKb => :yKb;
]
设置外部输入信号和输出信号。
w1 = [:Va, :Td]
z1 = [:yH2]
将参数传递给函数connect()
,以获得系统模型。
dcm = connect([H2, H1, Kb, Sum1, Sum2], connections; z1, w1, verbose = true)
现在我们来看看单步冲击的响应。
V_a = dcm[1,1];
plot(stepinfo(step(V_a,2.5)))
当输入( )受到单步冲击时,输出信号的稳态值为 0.244。
直流电机的直接控制
第一种控制方式是直接控制。系统将输入所需的角速度值 () 并模拟外部转矩 () 。

直接耦合增益 必须设置为直流增益的倒数,从 到 。
Kff = 1/dcgain(V_a)[1]
为评估直接耦合设计在负载扰动下的有效性,请模拟对阶跃指令 的响应,在 秒之间的扰动为 :
t = 0:0.01:15
Td = -0.1 * (5 .< t .< 10)
u = hcat( ones( length(t) ), Td )
cl_ff = dcm * Diagonal( [Kff, 1] )
h_1 = lsim( cl_ff, u, t )
plot( h_1, label = "Прямое управление, h_1(t)" )
plot!( t, Td, label = "Внешний возмущающий момент, Td" )
反馈系统
让我们考虑控制的第二种变体,并描述反馈控制结构。

为确保稳态误差为零,我们将控制器 用作增益积分器。
要确定增益 K,我们可以使用应用于开环传输的均方根霍德图方法 () :
rlocusplot( ss( tf( 1, [1, 0] ) ) * V_a )
将鼠标悬停在曲线上,熟悉增益值和相应的极点。可以看到,两个根的轨迹与虚轴相交。在这些点上, 。为了使系统保持稳定,我们需要选择 。让我们选择 。
K = 5;
说出输入和输出信号的名称。
C = named_ss( tf( K,[1, 0] ), x=:xC, u=:e, y=:Va )
指定汇总单元的输入和输出信号。
sum = sumblock( "e = w_ref - yH2" )
在模块的输出和输入之间建立对应关系。
connections1 = [
:e => :e;
:Va => :Va;
:yH2 => :yH2
]
设置外部输入信号和输出信号
w1 = [ :w_ref, :Td ]
z1 = [ :yH2 ]
将参数传递给函数connect()
,以获得系统模型。
cl_rloc = connect( [sum, C, dcm], connections1; w1, z1 )
让我们绘制直接控制和反馈控制的输出信号。
h_2 = lsim( cl_rloc, u, t )
plot( h_1, label = "Прямое управление, h_1(t)" )
plot!( h_2, label = "Управление с обратной связью, h_2(t)" )
plot!( t, Td, label = "Внешний возмущающий момент, Td" )
反馈控制的结果比直接控制方法好得多。不过,在动作开始和结束时都会出现峰值 。
用懒惰二次方控制器控制直流电机
为了进一步提高性能,我们尝试为下图所示的反馈结构设计一个线性二次调节器(LQR)。

除了积分之外,LQR 电路还利用状态矢量 来合成控制电压 。所得电压为
其中 为电枢电流
为了更好地抑制扰动,我们使用了 "惩罚 "大积分误差的成本函数。例如
其中
我们计算出该成本函数的最佳 LQR 增益。
将输出w/s
添加到模型dcm
中。
dc_aug = [ 1 ; ss( tf( 1,[1, 0] ) ) ] * V_a
设置权重矩阵 Q 和 R,并使用函数lqr
合成控制器。
Q = [ 20 0 0; 0 1 0; 0 0 1 ]
R = 0.01
K_lqr = lqr( dc_aug, Q, R )
这样就得到了一个闭环系统。
让我们使用add_output()
添加输出x
。但为此我们需要变量 dcm 具有 StateSpace 数据类型,这是函数add_output()
所要求的。因此,我们使用ss()
进行转换。
dcm_new = add_output(ss(dcm), I(2))
让我们添加一个积分器。
C = K_lqr * append( tf(1, [1, 0]), tf(1), tf(1) )
描述带有 LQR 的开环控制系统。
OL = dcm_new * append( C, ss(1) )
描述使用 LQR 的闭环控制系统。
CL = feedback( OL, I(3), U1=1:3, Y1=1:3 )
传递函数 (w_ref,Td)$\to$ w
cl_lqr = CL[ 1, 1:3:4 ]
最后,让我们通过绘制输出图来比较三种 DCT 控制方案。
h_3 = lsim( cl_lqr, u, t )
plot( [h_1, h_2, h_3], label=["Прямое управление, h_1(t)" "Управление с обратной связью, h_2(t)" "Регулирование LQR, h_3(t)"] )
plot!( t, Td, label = "Внешний возмущающий моомент, Td" )
通过分析曲线图可以看出,与前一种控制方法相比,输出信号的峰值变小了。
结论
本示例考虑了控制对象(直流电机)模型的创建。对三种控制 DCT 的方法进行了比较。通过对所获得的系统响应进行分析,结果表明采用 LQR 的控制方法最为有效,能够最好地抵御外部干扰转矩的影响。