直流电机控制
本例对三种直流电机控制方法进行了比较.:
*直接控制
*反馈管理
*LQR监管。
让我们在对负载扰动的敏感性方面比较这些方法。
设置任务
在具有电枢控制的DPT中,输入电压为 控制电机轴的角速度。
此示例显示了两种控制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,可以使用应用于开环传输的根hodograph方法():
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 )
然后我们得到一个封闭的系统。
添加出口 x 使用 add_output(). 但为此,我们需要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 ]
最后,我们通过绘制输出信号来比较三个DPT控制电路。
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" )
分析该曲线图,可以看到,与以往的控制方法相比,输出信号的峰值变小了。
结论
在这个例子中,我们考虑了创建一个控制对象(直流电机)的模型。 比较了三种DPT管理方法。 通过对接收到的系统响应的分析,LQR控制方法被证明是最有效和最好的对抗外部干扰时刻的影响。