Документация Engee
Notebook

Управление двигателем постоянного тока

В этом примере рассмотрим создание объекта управления - двигателя постоянного тока (ДПТ), и методы управления им: прямой и с обратной связью. Сравним эти методы с точки зрения чувствительности к возмущениям от нагрузки.

Постановка задачи

В ДПТ с якорным управлением входное напряжение $V_a$ управляет угловой скоростью вала двигателя.

xxdcdemofigures_01.png

Параметр крутящего момента $T_d$ моделирует возмущения нагрузки. Необходимо свести к минимуму колебания скорости, вызванные таким возмущениям.

Описание системы

Ниже представлена упрощенная модель системы.

xxdcdemofigures_02.png

Подключим необходимые пакеты для работы и зададим параметры всех блоков.

In [ ]:
using ControlSystems            # Пакет для анализа и синтеза САУ
using RobustAndOptimalControl   # Пакет для анализа и проектирования надежных и оптимальных линейных систем управления
using LinearAlgebra             # Пакет для использования функций линейной алгебры
In [ ]:
R = 2.0 ;   # Ом
L = 0.5;    # Гн
Km = 0.1;   # Константа по току
Kb = 0.1;   # Коэффициент усиления в цепи обратной связи
Kf = 0.2;   # Nms
J = 0.02;   # Момент инерции, кг*м^2/с^2

Формирование математического описания блоков системы

Построим модель ДПТ с двумя входами ($V_a$,$T_d$) и одним выходом ($w$):

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)

# Указываем сигналы которые поступают и выходят из суммирующих блоков
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)
Out[0]:
NamedStateSpace{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
D = 
 0.0  0.0

Continuous-time state-space model
With state  names: xH2##feedback#557 xH1##feedback#557
     input  names: Va Td
     output names: yH2

Реакция на единичное воздействие

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

Прямое управление двигателем постоянного тока

Первый вариант управления - прямое управление. На вход системе подадим желаемое значение угловой скорости ($w_{ref}$), а также смоделируем воздействие внешнего момента ($Td$) на систему.

xxdcdemofigures_03.png

Описание системы с прямым управлением

Коэффициент усиления прямой связи $K_{ff}$ должен быть установлен на величину, обратную коэффициенту усиления по постоянному току от $Va$ до $w$.

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

Чтобы оценить эффективность конструкции с прямой связью в условиях возмущений нагрузки, смоделируйте реакцию на пошаговую команду $w_ref=1$ с возмущением $Td = -0,1 Нм$ между $t=5 и t=10$ секундами:

In [ ]:
t = 0:0.01:15
Td = -0.1 * (5 .< t .< 10)          # Установим значение Td 
u = hcat(ones(length(t)), Td)       # Установим уравляющее воздействие

cl_ff = dcm * Diagonal([Kff, 1])

# Построим график реакции системы
h = lsim(cl_ff, u, t)
plot(h, label = "h(t)")
plot!(t, Td, label = "Td")
Out[0]:

Система с обратной связью

Рассмотрим второй вариант управления и опишем структуру управления с обратной связью, показанную ниже.

xxdcdemofigures_04.png

Описание системы с обратной связью

Чтобы обеспечить нулевую установившуюся ошибку, используем контроллер $C(s)$ в виде интегратора с коэффициентом усиления.

Чтобы определить коэффициент усиления K, можно использовать метод корневого годографа, применяемый к передаче с разомкнутым контуром (1/s * (Va -> w)):

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

Наведите на кривые, чтобы ознакомиться со значениями коэффициента усиления и соответствующей информацией. Разумным выбором здесь является K = 5.

In [ ]:
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)
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#615 xH2##feedback#557##feedback#615 xH1##feedback#557##feedback#615
     input  names: w_ref Td
     output names: yH2

Построим график

In [ ]:
h_1 = lsim(cl_rloc,u,t)
h_2 = lsim(cl_ff,u,t)
plot(h_1, label = "h_1(t)")
plot!(h_2, label = "h_2(t)")
plot!(t, Td, label = "Td")
Out[0]:

Вывод

В данном примере было рассмотрено создание модели объекта управления - двигателя постоянного тока. И рассмотрено управления ДПТ в двух вариантах. В результате анализа полученных переходных процессов системы, способ управления с обратной связью показал себя лучше, нежели прямое управление.