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

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

Упрощенная модель двигателя постоянного тока показана выше. Параметр крутящего момента моделирует возмущения нагрузки. Необходимо свести к минимуму колебания скорости, вызванные такими возмущениями.
Зададим параметры двигателя. В этом примере физическими константами являются:
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;
Построим модель ДПТ с двумя входами (,) и одним выходом (). Для начала зададим описание блоков структурной схемы, представленной выше, в виде передаточных функций.
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 )
Затем получим замкнутую систему.
Добавим выход 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 ]
Наконец, сравним три схемы управления ДПТ, построив графики выходных сигналов.
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" )
Анализируя график можно заметить, что пики выходного сигнала стали меньше по сравнению с предыдущим способом управления.
Вывод
В данном примере было рассмотрено создание модели объекта управления - двигателя постоянного тока. Проведено сравнение трех методов управления ДПТ. В результате анализа полученных откликов системы, способ управления с LQR оказался наиболее эффективным и лучше всего боролся с воздействием внешнего возмущающего момента.