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

Автор
avatar-andrewraysandrewrays
Notebook

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

Введение

В данном примере мы рассмотрим полношаговое управление биполярным шаговым двигателем для последующей реализации алгоритма на цифровом вычислителе.

Описание модели

Модель включает алгоритм полношагового управления (подсистема Contol System), алгоритм управления ключевыми элементами инвертора (подсистема Gate Driver), инвертор (подсистема Inverter), источник питания (подсистема Supply), датчики фазных токов и напряжений (подсистема Sensors) и шаговый двигатель с датчиком скорости и положения.

В модели также предусмотрен функционал включения/выключения двигателя с помощью кнопки, который моделируется посредством блока Buttom. Двигатель включается в момент времени 0.1 сек и выключается в момент времени 0.9 сек.

В качестве объекта управления выступает биполярный шаговый двигатель 17HS1352-P4130.

sm_fullstep_control_model.png

Алгоритм управления

Алгоритм управления состоит из нескольких подсистем:

  • button_click,
  • mode_handler,
  • counter,
  • phase_control.

Входом алгоритма является сигнал от кнопки включения button. Выходы алгоритма следующие:

  • pulses — управляющие сигналы инвертора,
  • enable — сигнал режима работы системы управления и сигнал управления состоянием инвертора,
  • led — сигнал, подаваемый на светодиод, для индикации режима работы (включен ли двигатель).

sm_fullstep_control_1733994326568.png

Подсистема button_click служит для обработки нажатия кнопки путем определения заднего фронта сигнала button.

sm_fullstep_control_1733995014676.png

В подсистеме mode_handler осуществляется управление режимами работы системы управления. При первом нажатии кнопки двигатель включается, сигнал enable равен логической единице. При следующем нажатии — двигатель выключается, сигнал enable равен логическому нулю, при следующем нажатии двигатель — снова включается.

Также выходной сигнал enable управляет состоянием ключевых элементов инвертора: если он равен логическому нулю, то инвертор выключен.

sm_fullstep_control_1733995031357.png

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

Период счетчика $T_{сч}$ определяется по формуле:

$$T_{сч} = \frac{4 n}{6 \omega_{треб}},$$

где $\theta$ — угол поворота вала за один шаг, град; $\omega_{треб}$ — требуемая скорость вращения, об/мин; в формуле также присутствуют численные коэффициенты: 4 — количество фаз двигателя, 6 — коэффициент перевода из об/мин в град/с.

При $\omega_{треб}$ = 300 об/мин $T_{сч}$ = 4 мс, что означает, частота переключения фаз равна 1 кГц.

sm_fullstep_control_1733995068725.png

В подсистеме phase_control реализована следующая последовательность переключения фаз:

Фаза A+ A- B+ B-
1 1 0 0 0
2 0 0 1 0
3 0 1 0 0
4 0 0 0 1

risunok2.png

Управление инвертором

Подсистема Gate Driver предназначена для преобразования сигналов управления фазами двигателя в сигналы управления ключевыми элементами инвертора.

sm_fullstep_control_1733999696227.png

Инвертор

Для управления шаговым двигателем используются два двухстоечных инвертора. В качестве ключевых элементов выступают полевые МОП-транзисторы (MOSFET).

sm_fullstep_control_1734000082731.png

Запуск модели и результаты моделирования

Загрузка нужных библиотек:

In [ ]:
using Plots
using DataFrames
plotlyjs();

Запуск модели:

In [ ]:
modelName = "sm_fullstep_control";
if modelName  getfield.(engee.get_all_models(), :name)
    engee.load( "$(@__DIR__)/$(modelName).engee");
end

model = engee.run(modelName);

Чтение данных о мгновенных значения напряжений и токов, а также скорости вращения и положения вала:

In [ ]:
t = model["Speed"].time;
Ia = model["Ia"].value;
Ib = model["Ib"].value;
Va = model["Va"].value;
Vb = model["Vb"].value;
Speed = model["Speed"].value;
Position = model["Position"].value;

Построение эпюры положения вала:

In [ ]:
plot(t, Position, layout = (2,1), ylabel = "Положение, град", legend = :none)
plot!(t, Speed, subplot = 2, ylabel = "Скорость вращения, рад/с", xlabel = "Время, c", legend = :none)
Out[0]:

Построение эпюр фазных токов и напряжений:

In [ ]:
plot(t, [Va Vb], label = ["Va" "Vb"], ylabel = "Фазные напряжения, В", color = [:red :blue], layout = (2,1), subplot = 1)
plot!(t, [Ia Ib], label = ["Ia" "Ib"], ylabel = "Фазные токи, А", xlabel = "Время, c", color = [:green :black], subplot = 2)
Out[0]:

Заключение

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

На следующем этапе мы сгенерируем код для микроконтроллера STM32 и проверим алгоритм управления с реальным двигателем.