Сообщество Engee

Физическая модель шагового двигателя и датчиков Холла

Автор
avatar-nkapyrinnkapyrin
Notebook

Измерение угла шагового двигателя с помощью энкодера на эффекте Холла

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

Блок "Энкодер" моделирует датчик углового положения при помощи четырёх датчиков Холла, равномерно расположенных под поворачивающимся магнитом. Каждый датчик Холла выдаёт выходное напряжение, пропорциональное напряжённости магнитного поля. Датчики расположены вдоль полюсов поворачивающегося магнита и имеют максимальную плотность магнитного потока при разных положениях магнита, ортогональных к основным осям измерения. Таким образом, датчики генерируют четыре синусоидальных сигнала, сдвинутых на 90° друг относительно друга. Эти четыре сигнала однозначно кодируют поворот вала датчика на всём диапазоне в 360°.

В этом примере показаны две модели. В одеих шаговый двигатель поворачивается сперва вверх от 0° до 360°, а затем вниз от 360° до 0°:

  • В модели HallEffectRotaryEncoderVoltage энкодера сконфигурирован так, что его выходные порты выдают электрические сигналы. Они выводят напряжение на выходе каждого датчика Холла.

  • В HallEffectRotaryEncoderAngle блок энкодера сконфигурирован чтобы выдавать сразу измеренный угол.

Обзор модели

Откроем первую модель.

In [ ]:
cd(@__DIR__) # Переход в папку с примером
engee.open("HallEffectRotaryEncoderVoltage.engee");
image.png

Запустим модель и изучим результаты:

In [ ]:
data = engee.run("HallEffectRotaryEncoderVoltage")
plot( 
    plot( data["v_x"].time, [data["v_y"].value data["v_x"].value], lw=2, title="Напряжение на выходе датчиков и измеренный угол", titlefont=font(11), guidesfont=font(8), ylabel="Напряжение(В)", label=["V_y" "V_x"] ),
    plot( data["Angle"].time, 180/pi*data["Angle"].value, lw=2, xlabel="Время (с)", ylabel="Угол (градусы)", label=false, guidesfont=font(8)),
    layout=(2,1), size=(900,500)
)
Out[0]:

При вращении двигателя в разных направлениях мы видим как напряжения на датчиках осей X и Y изменяется по синусоиде. Когда полюса магнита совпадают с осями датчиков, мы видим максимальные значения этого сигнала. В начале моделирования магнитные полюса совпадают с датчиками xnи xp. Такое совпадение создаёт максимальное выходное напряжение на портах xn и xp (Vx) и нулевое напряжение на портах yn и yp (Vy). Когда вал начинает вращаться, Vx уменьшается, а Vy увеличивается по мере того, как северный полюс движется к yp, а южный — к yn.

Упрощенная модель

Откроем модель HallEffectRotaryEncoderAngle.

In [ ]:
engee.open("HallEffectRotaryEncoderAngle.engee");
image.png

Запустим модель и обсудим результаты:

In [ ]:
data = engee.run("HallEffectRotaryEncoderAngle")
plot( data["Angle"].time, 180/pi*data["Angle"].value,
lw=2, xlabel="Время (с)", ylabel="Угол (градусы)", label=false, guidesfont=font(8), size=(900,400) )
Out[0]:

Результаты моделей вполне сопоставимы.

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

Заключение

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