Engee 文档
Notebook

直流电机控制

本例对三种直流电机控制方法进行了比较.:
*直接控制
*反馈管理
*LQR监管。

让我们在对负载扰动的敏感性方面比较这些方法。

设置任务

在具有电枢控制的DPT中,输入电压为 控制电机轴的角速度。

xxdcdemofigures_01.png

此示例显示了两种控制DPT的方法,允许您降低灵敏度。 负载变化(发动机负载产生的扭矩的变化)。

xxdcdemofigures_02.png

上图为直流电机的简化模型。 扭矩参数 模拟负载扰动。 有必要使这种扰动引起的速度波动最小化。

让我们设置引擎参数。 在这个例子中,物理常数是:

In [ ]:
Pkg.add(["LinearAlgebra", "RobustAndOptimalControl", "ControlSystems", "ControlSystemsBase"])
In [ ]:
import Pkg; 
Pkg.add("ControlSystemsBase")
Pkg.add("RobustAndOptimalControl")
Pkg.add("LinearAlgebra")
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`
   Resolving package versions...
    Updating `~/.project/Project.toml`
  [37e2e46d] + LinearAlgebra
  No Changes to `~/.project/Manifest.toml`
In [ ]:
using ControlSystems, ControlSystemsBase, RobustAndOptimalControl, LinearAlgebra

R = 2.0 ;   
L = 0.5;     
Km = 0.1;   
Kb = 0.1;    
Kf = 0.2;    
J = 0.02;    

让我们用两个输入建立一个DPT模型(,)和一个出口(首先,我们将以传递函数的形式定义上述框图的块的描述。

In [ ]:
h1 = tf([Km], [L, R])
h2 = tf([1], [J, Kf]) 
Out[0]:
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Float64}}
    1.0
-----------
0.02s + 0.2

Continuous-time transfer function model

让我们建立块之间的连接。 我们将分配输入和输出信号的名称,定义求和块,并使用函数建立块之间的关系 connect().

我们命名输入和输出信号。

In [ ]:
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)

我们指示进出求和块的信号。

In [ ]:
Sum1 = sumblock("uH1 = Va - yKb")
Sum2 = sumblock("uH2 = yH1 + Td")

我们在块的输出和输入之间建立对应关系。

In [ ]:
connections = [
    :uH1 => :uH1;
    :yH1 => :yH1;
    :uH2 => :uH2;
    :yH2 => :uKb;
    :yKb => :yKb;   
]

我们设置外部输入信号和输出信号。

In [ ]:
w1 = [:Va, :Td]
z1 = [:yH2]

将参数传递给函数 connect() 得到系统的模型。

In [ ]:
dcm = connect([H2, H1, Kb, Sum1, Sum2], connections; z1, w1, verbose = true)

现在让我们来看看对单个分步效果的反应。

In [ ]:
V_a = dcm[1,1];
plot(stepinfo(step(V_a,2.5)))
Out[0]:

对输入应用单步操作时()输出信号的稳态值为0.244。

直接控制直流电机

第一个控制选项是直接控制。 我们将所需的角速度值提供给输入系统(),并且还模拟外部力矩的影响()的系统上。

xxdcdemofigures_03.png

直接通信增益因子 必须设置为从直流增益的倒数 以前 .

In [ ]:
Kff = 1/dcgain(V_a)[1]
Out[0]:
4.099999999999999

要评估前馈结构在负载扰动下的有效性,请模拟对分步命令的响应 义愤填膺 之间 秒数:

In [ ]:
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" )
Out[0]:

反馈系统

让我们考虑第二个控制选项并描述反馈控制结构。

xxdcdemofigures_04.png

为了确保零稳态误差,我们使用控制器 增益因子的积分器的形式。

为了确定增益K,可以使用应用于开环传输的根hodograph方法():

In [ ]:
rlocusplot( ss( tf( 1, [1, 0] ) ) * V_a )
Out[0]:

将鼠标悬停在曲线上以查看增益和相应极点的值。 可以看到两根的轨迹与假想轴相交。 在这些点 . 为了使我们的系统保持稳定,有必要选择 . 选择 .

In [ ]:
K = 5;

我们命名输入和输出信号。

In [ ]:
C = named_ss( tf( K,[1, 0] ), x=:xC, u=:e, y=:Va )
Out[0]:
NamedStateSpace{Continuous, Float64}
A = 
 0.0
B = 
 2.0
C = 
 2.5
D = 
 0.0

Continuous-time state-space model
With state  names: xC
     input  names: e
     output names: Va

我们指示进出求和块的信号。

In [ ]:
sum = sumblock( "e = w_ref - yH2" )
Out[0]:
sumblock: NamedStateSpace{Continuous, Float64}
D = 
 1.0  -1.0

Continuous-time state-space model
With state  names: 
     input  names: w_ref yH2
     output names: e

我们在块的输出和输入之间建立对应关系。

In [ ]:
connections1 = [
    :e => :e;
    :Va => :Va;
    :yH2 => :yH2
]
Out[0]:
3-element Vector{Pair{Symbol, Symbol}}:
   :e => :e
  :Va => :Va
 :yH2 => :yH2

设置外部输入信号和输出信号

In [ ]:
w1 = [ :w_ref, :Td ]
z1 = [ :yH2 ]
Out[0]:
1-element Vector{Symbol}:
 :yH2

将参数传递给函数 connect() 以得到系统的模型。

In [ ]:
cl_rloc = connect( [sum, C, dcm], connections1; w1, z1 )
Out[0]:
NamedStateSpace{Continuous, Float64}
A = 
 0.0   -12.5      0.0
 0.0   -10.0      3.2
 1.25   -0.3125  -4.0
B = 
 2.0  0.0
 0.0  8.0
 0.0  0.0
C = 
 0.0  6.25  0.0
D = 
 0.0  0.0

Continuous-time state-space model
With state  names: xC##feedback#237 xH2##feedback#227##feedback#237 xH1##feedback#227##feedback#237
     input  names: w_ref Td
     output names: yH2

让我们绘制直接控制和反馈控制的输出信号。

In [ ]:
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" )
Out[0]:

反馈控制的结果明显优于直接控制方法。 然而,在行动的开始和结束时都有峰值 .

使用线性二次调节器控制直流电机

为了进一步提高性能,让我们尝试为如下所示的反馈结构设计一个线性二次调节器(LQR)。

xxdcdemofigures_05.png

除了积分之外,LQR电路还使用状态向量。 用于控制电压合成 . 产生的电压具有形式

哪里 -电枢电流

为了更好地抑制扰动,我们使用成本函数,它"惩罚"了一个大的积分误差。 例如,

哪里

让我们计算此成本函数的最佳LQR增益。

添加出口 w/s 到模型 dcm.

In [ ]:
dc_aug = [ 1 ; ss( tf( 1,[1, 0] ) ) ] * V_a 
Out[0]:
NamedStateSpace{Continuous, Float64}
A = 
 0.0    6.25     0.0
 0.0  -10.0      3.2
 0.0   -0.3125  -4.0
B = 
 0.0
 0.0
 0.5
C = 
 0.0  6.25  0.0
 1.0  0.0   0.0
D = 
 0.0
 0.0

Continuous-time state-space model
With state  names: ##x#239 xH2##feedback#227 xH1##feedback#227
     input  names: Va
     output names: ##y#2411 ##y#2412

我们设置权重矩阵Q和R,并使用函数合成控制器 lqr.

In [ ]:
Q = [ 20 0 0; 0 1 0; 0 0 1 ]
R = 0.01
K_lqr = lqr( dc_aug, Q, R )
Out[0]:
1×3 Matrix{Float64}:
 44.7214  25.5262  14.1526

然后我们得到一个封闭的系统。

添加出口 x 使用 add_output(). 但为此,我们需要dcm变量具有StateSpace数据类型,如函数所要求的那样。 add_output(). 因此,我们使用 ss().

In [ ]:
dcm_new = add_output(ss(dcm), I(2))
Out[0]:
StateSpace{Continuous, Float64}
A = 
 -10.0      3.2
  -0.3125  -4.0
B = 
 0.0  8.0
 0.5  0.0
C = 
 6.25  0.0
 1.0   0.0
 0.0   1.0
D = 
 0.0  0.0
 0.0  0.0
 0.0  0.0

Continuous-time state-space model

让我们添加一个集成链接。

In [ ]:
C = K_lqr * append( tf(1, [1, 0]), tf(1), tf(1) ) 
Out[0]:
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Float64}}
Input 1 to output 1
44.72135954999597
-----------------
      1.0s

Input 2 to output 1
25.526213567574707
------------------
       1.0

Input 3 to output 1
14.152551403054153
------------------
       1.0

Continuous-time transfer function model

描述具有LQR的开环控制系统。

In [ ]:
OL = dcm_new * append( C, ss(1) ) 
Out[0]:
StateSpace{Continuous, Float64}
A = 
 -10.0      3.2  0.0
  -0.3125  -4.0  2.795084971874748
   0.0      0.0  0.0
B = 
 0.0   0.0                0.0                8.0
 0.0  12.763106783787354  7.076275701527076  0.0
 8.0   0.0                0.0                0.0
C = 
 6.25  0.0  0.0
 1.0   0.0  0.0
 0.0   1.0  0.0
D = 
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0

Continuous-time state-space model

描述具有LQR的闭环控制系统。

In [ ]:
CL = feedback( OL, I(3), U1=1:3, Y1=1:3 )
Out[0]:
StateSpace{Continuous, Float64}
A = 
 -10.0                  3.2                0.0
 -13.075606783787354  -11.076275701527077  2.795084971874748
 -50.0                  0.0                0.0
B = 
 0.0   0.0                0.0                8.0
 0.0  12.763106783787354  7.076275701527076  0.0
 8.0   0.0                0.0                0.0
C = 
 6.25  0.0  0.0
 1.0   0.0  0.0
 0.0   1.0  0.0
D = 
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0

Continuous-time state-space model

传递函数 (w_ref,Td)$\to$ w

In [ ]:
cl_lqr = CL[ 1, 1:3:4 ]
Out[0]:
StateSpace{Continuous, Float64}
A = 
 -10.0                  3.2                0.0
 -13.075606783787354  -11.076275701527077  2.795084971874748
 -50.0                  0.0                0.0
B = 
 0.0  8.0
 0.0  0.0
 8.0  0.0
C = 
 6.25  0.0  0.0
D = 
 0.0  0.0

Continuous-time state-space model

最后,我们通过绘制输出信号来比较三个DPT控制电路。

In [ ]:
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" )
Out[0]:

分析该曲线图,可以看到,与以往的控制方法相比,输出信号的峰值变小了。

结论

在这个例子中,我们考虑了创建一个控制对象(直流电机)的模型。 比较了三种DPT管理方法。 通过对接收到的系统响应的分析,LQR控制方法被证明是最有效和最好的对抗外部干扰时刻的影响。