Микроконтроллеры STM32: управление шаговым двигателем
Шаговые двигатели находят применение в проектах, где нужно управлять какой-то механикой. Из подобного я делал гусеничного робота, квадрокоптер и робо-руку, но во всех случаях обходился без ШД. Предлагаю заполнить данный пробел и научиться управлять ШД при помощи микроконтроллера.
Воспользуемся следующими компонентами:
Плату Blue Pill, конечно же, вы узнали (справа внизу). Какая-нибудь другая плата с микроконтроллером STM32 тоже сгодится. Шаговик возьмем типаразмера NEMA 17, модель 17HS4401 (справа вверху). Это двухфазный шаговый двигатель с 200 шагами на оборот. Подобные стоят во всех 3D-принтерах.
Шаговому двигателю нужны токи порядка ампера. Управлять им напрямую при помощи МК не представляется возможным. Существуют специализированные микросхемы, драйверы шаговых двигателей. Я воспользовался модулем на базе микросхемы TMC2209 (по центру внизу). Данные модули применены во Flying Bear S1, поэтому я храню их как запчасти.
Модули такого формата называются StepStick. Они совместимы по распиновке и протоколу, даже когда в них запаяны разные драйверы. Таким образом, использовать именно TMC2209 не обязательно. Помимо стандартного для всех драйверов интерфейса STEP / DIR также в TMC2209 предусмотрен UART. Последний дает доступ к расширенным возможностям микросхемы и описан в даташите [PDF]. В рамках статьи мы обойдемся без UART.
Переходная плата (по центру вверху), строго говоря, не является обязательной, но она добавляет удобства. Найти ее можно по запросу «адаптер для драйвера шагового двигателя». И наконец, потребуется кабель (слева). Искать его следует по запросу «кабель для шагового двигателя». Разъем с четырьмя пинами называется XH2.54, а с шестью пинами – PH2.0. Первый должен подходить к переходной плате, а второй – к шаговому двигателю.
Модуль драйвера вставляем в переходную плату. Следим, чтобы выводы 2B, 2A, 1A и 1B были повернуты к белому разъему для кабеля, а STEP и DIR – к разноцветным пинам 2.54 мм. Потенциометр на модуле пока что ставим в среднее положение. Приклеиваем комплектный радиатор. Переключатели MS1, MS2 и MS3 ставим в положение «0». Смысл переключателей зависит от драйвера, поэтому следует свериться с даташитом. TMC2209 при данном положении MS1 и MS2 работает в режиме 1/8 шага, а на MS3 он вообще не смотрит.
Берем мультиметр и прозваниваем выводы шагового двигателя. Наша задача – найти выводы двух обмоток. Из шести выводов обычно используются лишь четыре. Однако в некоторых ШД могут быть выведены средние точки обмоток. В таком случае ищем пары выводов, сопротивление между которыми наибольшее. Зарисовываем распиновку.
Внимательно изучаем распиновку шагового двигателя, кабель шагового двигателя, а также шелкографию у белого разъема на переходной плате. На шелкографии 1A и 1B – это контакты для одной обмотки, а 2A и 2B – для другой обмотки. Кабель должен соответствовать. Если не соответствует, то берем острый пинцет и переставляем провода в кабеле. Затем с его помощью подключаем ШД к плате.
Переходим к разноцветным пинам 2.54 мм. Три черных пина с подписью «G» – это все земля. Три красных пина с подписью «V» – это все высокий логический уровень, 3.3 В или 5 В, в зависимости от МК. При выборе драйвера обращайте внимание на то, с какими напряжениями он совместим. Наконец, три желтых пина с надписью «S» – это сигнальные пины EN, STEP и DIR.
Любой из пинов «G» соединяем с выводом «G» на плате Blue Pill, а любой из пинов «V» – c выводом 3.3 В. EN позволяет включать и выключать драйвер. Когда драйвер включен, положение вала ШД зафиксировано, иначе он вращается свободно. Чтобы драйвер постоянно был включен, просто притягиваем EN к земле. В общем случае логика может быть противоположной, так что сверяйтесь с даташитом. DIR определяет направление вращения, а подача импульса на STEP говорит драйверу совершить один шаг. Их соединяем с выводами микроконтроллера A0 и A1 соответственно.
МК может взаимодействовать с драйвером при помощи таймеров, прерываний и ШИМ. Однако мне это видится сложным и неудобным. Даже если одновременно с управлением ШД микроконтроллер реагирует на какие-то события, куда проще обрабатывать асинхронно эти события, а с ШД работать синхронно в цикле. Ведь события могут менять скорость и направление вращения ШД. В силу названных обстоятельств применяем простой GPIO.
Соответствующий код:
#define STEPS_PER_REV (200*8)
#define STEPS_NUMBER (STEPS_PER_REV / 2)
#define STEP_PULSE_MS 5
#define STEP_DELAY_MS 5
static GPIO_PinState dir;
static uint32_t steps_left;
/* ... */
dir = GPIO_PIN_RESET;
steps_left = STEPS_NUMBER;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, dir);
while(1) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
HAL_Delay(STEP_PULSE_MS);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_Delay(STEP_DELAY_MS);
steps_left--;
if(steps_left == 0) {
steps_left = STEPS_NUMBER;
dir = (dir == GPIO_PIN_RESET) ? GPIO_PIN_SET : GPIO_PIN_RESET;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, dir);
}
}
Архив с полной версией исходного кода и скомпилированной прошивкой можно скачать здесь.
К клеммнику на переходной плате подключаем источник питания 24 В. Питание для Blue Pill я взял с этого же клеммника, понизив напряжение при помощи LM2596. Если все сделано верно, то шаговый двигатель будет совершать половину оборота в одну сторону, а затем половину оборота в противоположную. Скорость вращения и количество оборотов можно поменять в коде.
Вспоминаем, что потенциометр на плате драйвера был выставлен на глаз. Он задает опорное напряжение Vref, которое в свою очередь задает ток, идущий через ШД. Для TMC2209 формула простая. Значение Vref в вольтах соответствует пиковому току в амперах. Для многих задач должно хватить где-то от 0.6 до 0.8 В. Сначала выкручиваем потенциометр по часовой стрелке до предела, а затем медленно крутим против, периодически проверяя напряжение на нем мультиметром.
Данный проект представляет собой законченный стенд для тестирования шаговых двигателей и их драйверов. Также с его помощью можно проверить механику разрабатываемого устройства еще до написания полноценной прошивки.