Сообщество Engee

Управление шаговым двигателем

Автор
avatar-nkapyrinnkapyrin
Notebook

Управление шаговым двигателем

Эта модель демонстрирует, как совместное использование блоков Драйвер для шагового двигателя (Stepper motor driver) и Шаговый двигатель (Stepper motor) позволяет изучить процесс процесса управления шаговым двигателем на постоянных магнитах по положению и по скорости.

Угол шага изучаемого шагового двигателя равен 1.8 градусам. В режиме управления по положению вход Ref задает желаемое количество шагов. В режиме управления по скорости скорости вход Ref определяет желаемое количество шагов в секунду.

image.png

Эта модель системного уровня хорошо подходит для изучения динамики шагового двигателя, а также для проверки, будет ли происходить пропуск шагов при работе с заданной нагрузкой. Ее можно использовать для отладки контроллера двигателя с целью улучшения точности отработки шагов. Контроллер (в одном случае частично, в другом полностью) реализован в виде готового модуля управления шаговым двигателем, код которого можно загрузить на микроконтроллер.

Результаты моделирования

Изучим, как меняется угол поворота вала двигателя при изменении управляющего сигнала. Алгоритм управление по положению вала принимает команду в виде количества шагов и преобразует ее в последовательность импульсов, управляющих драйвером шагового двигателя. Скачки на графике угловой скорости возникают при фиксации вала в заданном положении.

In [ ]:
model = engee.open("stepper-motor-with-position-control.engee")
data_p = engee.run(model)

degPerStep = 1.8;
angle_measured = data_p["Угол вала"]
angle_command = data_p["Управление"]
shaft_speed = data_p["Stepper Motor.rod_flange.w"]

p1 = plot(angle_measured.time, (rad2deg.(angle_measured.value) .+ 0.5*degPerStep)./degPerStep,
          label="Измеренный", lw=2, ls=:solid, titlefont=font(10), guidefont=font(8))
plot!( p1, angle_command.time, angle_command.value, ls=:dash, label="Заданный", lc=:red)
plot!(p1, title="Угол поворота вала (кол-во шагов)", ylabel="№ шага")

plot(
    p1,
    plot(shaft_speed.time, shaft_speed.value, label=false, lw=2,
         xlabel="Время (с)", ylabel="Скорость (градусы/сек)", title="Угловая скорость вала"),
    titlefont=font(10), guidefont=font(8), layout=(2,1)
)
Out[0]:

Теперь изучим, как меняется угол поворота вала при управлении по скорости. Алгоритм управления по скорости принимает команду в виде количества шагов в секунду и преобразует ее в последовательность импульсов, управляющих драйвером шагового двигателя. Скачки на графике угловой скорости возникают при переходе на следующий шаг.

In [ ]:
Pkg.add("NumericalIntegration")
In [ ]:
using NumericalIntegration
In [ ]:
model = engee.open("stepper-motor-with-speed-control.engee")
data = engee.run(model)

degPerStep = 1.8;
angle_measured = data["Угол вала"]
angle_command = data["Управление"]
shaft_speed = data["Stepper Motor.rod_flange.w"]

p2 = plot(angle_measured.time, (rad2deg.(angle_measured.value) .+ 0.5*degPerStep)./degPerStep, lw=2, ls=:solid, label="Измеренный")
plot!( p2, angle_command.time, cumul_integrate(angle_command.time,angle_command.value), ls=:dash, label="Заданный", lc=:red)
plot!(p2, title="Угол поворота вала (кол-во шагов)", ylabel="№ шага")

plot(
    p2,
    plot(shaft_speed.time, shaft_speed.value, label=false, lw=2,
         xlabel="Время (с)", ylabel="Скорость (градусы/сек)", title="Угловая скорость вала"),
    titlefont=font(10), guidefont=font(8), layout=(2,1)
)
Out[0]:

На следующем графике показано, как связано состояние выводов драйвера шагового двигателя с перемещением вала. Драйвер инициирует шаг каждый раз, когда сигнал ENA превышает пороговое напряжение включения (Enable threshold voltage).

In [ ]:
t = data_p["Stepper Motor Driver.p_a.v"].time;
pA = data_p["Stepper Motor Driver.p_a.v"].value;
nA = data_p["Stepper Motor Driver.n_a.v"].value;
pB = data_p["Stepper Motor Driver.p_b.v"].value;
nB = data_p["Stepper Motor Driver.n_b.v"].value;
ENA = data_p["Stepper Motor Driver.enable_port.v"].value;
REV = data_p["Stepper Motor Driver.reverse_port.v"].value;

p3 = plot(t, pA, label="Pin A+", lw=2, yticks=([-5,0,5],["-5V", "0V", "+5V"]))
plot!(p3, t, nA, label="Pin A-", lw=2)
plot!(p3, t, pB, label="Pin B+", lw=2, ls=:dash)
plot!(p3, t, nB, label="Pin B-", lw=2, ls=:dash)
plot!(p3, t, ENA.-12, label="Pin ENA", lw=2)
plot!(p3, t, REV.-12, label="Pin REV", lw=2)
plot!(p3, xlabel="Время (с)", title="Напряжение на выводах драйвера шагового двигателя",
      guidefont=font(8), titlefont=font(11))
Out[0]:
In [ ]:
plot(p1) # Повтор графика для сопоставления
Out[0]:

Заключение

Чтобы сосредоточиться на разработке алгоритма управления мы использовали высокоуровневые модели драйвера и шагового двигателя без нагрузки. Построенные графики позволяют оценить скорость реакции и корректность управления, а модифицировав модель мы могли бы изучить склонность системы пропускать шаги.