Изучаем шаговые двигатели. Часть 1

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


При разработке любого привода возникают вопросы — а какой движок мне нужно использовать в данном случае, как им управлять, как организовать обратную связь и нужна ли она?… Попробуем разобраться в этом относительно шаговых двигателей.

А этот движок разберем чуть позже.

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

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

Этот движок с постоянными магнитами.

А вот то, что уже будет влиять на управление — это то, что шаговики могут быть униполярными и биполярными; отдельно стоит сказать про движки с четырьмя обмотками (восемь выводов) — их можно использовать как униполярный или как биполярный. 

Перед тем, как я перейду к тому, чтобы боле конкретно рассказать про униполярные и биполярные движки и покажу, как их запустить (а еще напишу немного кода под stm32), остается рассмотреть несколько вопросов. Первый — какие способы управления существуют?

Самый очевидный способ — полношаговый режим. Он так же делится на полношаговый режим с включением одной фазы (последовательно по одной включаются обмотки) и с включением двух фаз (в одно и то же время включены две последующие фазы). В первом случае точка равновесие у ротора совпадает с точкой равновесия без подачи питания, во втором — они отличаются на пол-шага. Нужно помнить, что при включении/выключении обмоток ротор сместится.  А еще при режиме включения одной фазы не может быть достигнут максимальный момент, такие дела.

Но кроме такого очевидного варианта, есть еще режимы управления — полушаговый и микрошаговый.  Они позволяют увеличивать количество шагов за оборот (полушаговый в 2 раза, микрошаговый в N раз), за счет чего получаем увеличение разрешающей способности не покупая более дорогие движки.  Полушаговый режим работает так — на первой итерации включены две обмотки, на второй — одна, на третьей — опять две… Ниже приведу таблицу и будет понятнее. Есть только одна проблема — помните, при включении одной обмотки момент меньше, чем при включении двух? И тут мы получаем момент, меняющийся по синусоиде, что нужно фиксить — например, увеличивать ток при включении одной фазы.

Окей, мы держим в руках двигатель и какой-то контроллер, но как их соединить вместе, чтобы оно работало? Для этого необходимо использовать драйверы (их продается н очень большое количество, так что особых знаний где и какие искать думаю не понадобится, а на все что здесь использую, попытаюсь найти ссылки на Aliexpress).

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

А теперь перейдем к более практической части и первым рассмотрим униполярный двигатель:

Униполярный двигатель  имеет одну обмотку в каждой фазе  и от них сделан отвод — он позволяет изменить направление магнитного поля и, соответственно, направление вращения вала двигателя.

А теперь будем писать код. Из железа нам понадобится контроллердля управления (у меня это STM32 NUCLEO-F411RE): 

Драйвер (у меня uln2003apg):

И сам движок (к сожалению, разобрать до конца я его не смогла, но думаю у вас уже должно быть представление, как оно там внутри):

На гитлабе я выложила проект, который вы можете запустить,если у вас есть аналогичная плата или модифицировать для себя. Итак, будем пользоваться CubeMX для генерации кода инициализации портов, таймеров и т.д. IDE я использую TrueSTUDIO, но в принципе Cube позволяет генерировать проекты и для других IDE. Подробно рассказывать как настроить проект в CubeMX я не буду, но здесь можно посмотреть какие параметры настроены. Теперь посмотрим, как были реализованы разные виды управления для униполярных двигателей (код весь приводить смысла нет, все есть в проекте, так что будут только маленькие примеры). Для начала скажу, что таймер выставлен так, что прерывание от него срабатывает 1000 раз в секунду, и в зависимости от того, сколько насчитал счетчик в прерывании, движок переключается. Переменная time_delay показывает, какая задержка между переключениями обмоток, с помощью нее можно регулировать скорость движка. 

Полношаговый режим с вкючением одной фазы

Скорость я специально ставила очень маленькую, чтобы было видно переключение диодов. Для того, чтобы было понятнее, какие обмотки когда включаются, составим таблицу:

ПорядокABCD
10100
20010
30001
41000

Теперь посмотрим, как реализуется первые две строчки таблицы, остальные по такому же принципу:

if (counter == time_delay){
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
}
if (counter == 2*time_delay){
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
}

Полношаговый режим с вкючением двух фаз

Посмотрим таблицу:

ПорядокАВСD
11100
20110
30011
41001

И теперь посмотрим код:

if (counter == time_delay){
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
}
if (counter == 2*time_delay){
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
}

Полушаговый режим

(с последним диодом какие-то проблемы, попозже поправлю)

Таблица переключения для такого режима будет побольше:

ПорядокABCD
11000
21100
30100
40110
50010
60011
70001
81001

И теперь код:

if (counter == time_delay){
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
}
if (counter == 2*time_delay){
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);
}

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

И немного дополнительной инфы:

Достаточно много статей про шговики

Большая иподробная статья

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *