Шаговый двигатель представляет собой бесщеточный двигатель постоянного тока (brushless DC motor), который может вращаться на маленькие углы, называемые шагами. Большинству шаговых двигателей требуется 200 шагов для совершения полного оборота на 360 градусов, что означает поворот двигателя на 1.8 градуса при каждом шаге. Шаговые двигатели используются во многих устройствах, где необходимо точное позиционирование (вращение) какого либо исполнительного механизма – в роботах, системах управления антеннами, жестких дисках (винчестерах).
Шаговые двигатели бывают двух типов: униполярные и биполярные. Униполярные проще в работе и управлении, также их легче купить. В данной статье мы рассмотрим подключение шагового двигателя 28BYJ-48 к плате STM32F103C8, также известной под названием STM32 Blue Pill ("синяя таблетка").
Ранее на нашем сайте мы рассматривали подключение шагового двигателя к следующим микроконтроллерам (платам):
- к микроконтроллеру AVR;
- к плате Arduino;
- к плате Raspberry Pi;
- управление шаговым двигателем с помощью MATLAB и Arduino.
Необходимые компоненты
- Плата разработки STM32F103C8 (STM32 Blue Pill) (купить на AliExpress).
- Шаговый двигатель 28BYJ-48 (купить на AliExpress).
- Микросхема драйвера двигателей ULN2003 (купить на AliExpress - в виде модуля, но можно найти и в виде отдельной микросхемы).
- Потенциометр 10 кОм (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Общие принципы работы шаговых двигателей
Внешний вид шагового двигателя 28BYJ-48 представлен на следующем рисунке:
Первый вопрос, который напрашивается при взгляде на этот рисунок – почему в отличие от обычного двигателя из этого шагового двигателя выходят 5 проводов различных цветов? Чтобы понять это давайте сначала разберемся с принципами работы шагового двигателя.
Начнем с того, что шаговые двигатели не вращаются, а “шагают”, поэтому они и называются шаговыми двигателями. То есть в один момент времени они будут передвигаться только на один шаг. Чтобы добиться этого в устройстве шаговых двигателей присутствует несколько катушек и на эти катушки нужно подавать питание в определенной последовательности чтобы двигатель вращался (шагал). При подаче питания на каждую катушку двигатель делает один шаг, при последовательной подаче питания на катушки двигатель будет совершать непрерывные шаги, то есть вращаться. Давайте более подробно рассмотрим катушки, присутствующие внутри шагового двигателя.
Как можно видеть из рисунка, двигатель имеет однополярную катушку с 5 выводами. Но фактически это 4 катушки, на которые нужно подавать питание в определенной последовательности. На красные провода необходимо подать +5V, на остальные 4 провода необходимо подать землю чтобы запустить в работу соответствующую катушку. Мы будем использовать плату Arduino чтобы подавать питание на эти катушки в определенной последовательности и тем самым заставлять двигатель вращаться. Более подробно ознакомиться с принципами работы шаговых двигателей можно в статье про подключение шагового двигателя к микроконтроллеру AVR.
Так почему же этот двигатель называется 28BYJ-48? Честно говоря, мы не знаем точного ответа на этот вопрос. Некоторые наиболее важные технические характеристики этого шагового двигателя приведены на следующем рисунке.
На первый взгляд от такого количества характеристик может закружиться голова, но давайте попробуем выделить из них самые важные, те, которые нам понадобятся для дальнейшей работы. Во-первых, мы знаем, что это шаговый двигатель 5V, поэтому необходимо подавать на красный провод 5V. Также мы знаем что это четырехфазный шаговый двигатель поскольку в нем четыре катушки. Передаточное число этого двигателя - 1: 64. Это означает, что вал, который вы видите снаружи, сделает одно полное вращение в том случае, когда двигатель внутри сделает 64 оборота. Это происходит благодаря шестерням, которые включены между двигателем и выходным валом. Эти шестерни помогают в увеличении крутящего момента.
Еще одним важным показателем, который нам следует знать, является угол шага: 5.625°/64. Это значит что когда двигатель сделает последовательность в 8 шагов он будет поворачиваться на 5.625° при каждом шаге и за один полный оборот он сделает 64 шага (5.625*64=360).
Расчет шагов на оборот для шагового двигателя
Важно знать, как рассчитать количество шагов за один оборот для вашего шагового двигателя, потому что только тогда вы можете эффективно его запрограммировать.
Мы в данном проекте для управления двигателем мы будем использовать 4-шаговую последовательность, поэтому угол шага будет составлять 11.25°. Поскольку изначально он равен 5.625°(приведен в даташите), то для 8 шаговой последовательности получим 11.25° (5.625*2=11.25).
Справедлива следующая формула:
Количество шагов за оборот = 360 / угол шага.
В нашем случае 360/11.25 = 32 шага за оборот.
Более подробно про режимы функционирования шагового двигателя вы можете прочитать в этой статье.
Микросхема драйвера двигателей ULN2003
Используется для управления вращения двигателем в одном направлении. Внутренняя схема соединений микросхемы ULN2003 представлена на следующем рисунке.
Контакты с IN1 до IN7 микросхемы ULN2003 являются ее входами, а контакты с OUT 1 по OUT 7 являются ее выходами. На контакт COM подается положительное напряжение источника питания, необходимое для устройств, подключаемых к выходам микросхемы.
Контакты платы STM32F103C8 для управления шаговым двигателем
Распиновка платы STM32F103C8 представлена на следующем рисунке.
Шаговым двигателем мы будем управлять с помощью ШИМ (широтно-импульсная модуляция) контактов платы STM32F103C8. Всего таких контактов в плате 15 и они обозначены на представленной схеме значком волны (~). В нашем проекте мы будем использовать 4 ШИМ контакта (с PA0 по PA3) платы STM32F103C8 для управления шаговым двигателем.
Более подробно про использование ШИМ в плате STM32F103C8 вы можете прочитать в этой статье.
Схема проекта
Схема подключения шагового двигателя к плате STM32F103C8 (STM32 Blue Pill) представлена на следующем рисунке.
Схема соединений между платой STM32F103C8 и микросхемой драйвера двигателей ULN2003 представлена в следующей таблице.
Плата STM32F103C8 | Микросхема ULN2003 |
PA0 | IN1 |
PA1 | IN2 |
PA2 | IN3 |
PA3 | IN4 |
5V | COM |
GND | GND |
Схема соединений между микросхемой драйвера двигателей ULN2003 и шаговым двигателем 28BYJ-48 представлена в следующей таблице. Ее выходные контакты OUT1-OUT4 подключены к соответствующим контактам шагового двигателя (оранжевый, желтый, розовый и синий).
Микросхема ULN2003 | Шаговый двигатель 28BYJ-48 |
OUT1 | ORANGE |
OUT2 | YELLOW |
OUT3 | PINK |
OUT4 | BLUE |
COM | RED |
Схема соединений между платой STM32F103C8 и потенциометром представлена в следующей таблице.
Потенциометр | Плата STM32F103C8 |
LEFT (INPUT) | 3.3 |
CENTRE(OUTPUT) | PA4 |
RIGHT(GND) | GND |
Далее рассмотрим способы управления двигателем с помощью нашей платы STM32.
Принцип управления шаговым двигателем с платы STM32F103C8
Для управления шаговым двигателем с помощью платы STM32F103C8 в нашем проекте необходимо выполнить следующую последовательность шагов:
- Установить скорость вращения шагового двигателя с помощью потенциометра.
- Вручную с помощью монитора последовательной связи Arduino IDE ввести количество шагов для вращения двигателя по часовой (положительные значения) или против часовой (отрицательные значения) стрелки.
- В соответствии с введенным в мониторе последовательной связи Arduino IDE значением выполнить вращение шагового двигателя на заданное количество шагов.
Примеры представлены в следующей таблице.
Значение в окне монитора последовательной связи | Вращение шагового двигателя |
2048 | 360 (по часовой стрелке) |
1024 | 180 (по часовой стрелке) |
512 | 90 (по часовой стрелке) |
-2048 | 360 (против часовой стрелке) |
-1024 | 180 (против часовой стрелке) |
-512 | 90 (против часовой стрелке) |
И продемонстрированы на следующем рисунке.
Объяснение программы для платы STM32
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты. Программировать плату STM32F103C8 мы будем с помощью Arduino IDE через USB порт.
Первым делом в программе мы подключим библиотеку Stepper.h, необходимую для работы с шаговым двигателем.
1 |
#include <Stepper.h> |
Затем мы определим число шагов, необходимых для полного оборота шагового двигателя. В нашем случае оно равно 32 поскольку мы используем метод 4-х шагов (4 Step-sequence) для вращения шагового двигателя, то есть получаем 360/32 = 11.25 градуса. Таким образом, за один наш большой шаг (stride angle) ось шагового двигателя поворачивается на угол 11.25 градусов.
1 |
#define STEPS 32 |
Мы также можем использовать режим половинного шага (Half step mode) в котором используется последовательность из 8 шагов (8 step sequence) в качестве большого шага (stride angle). Для данного режима получаем 360/64=5.625 градуса.
1 |
Steps per revolution = 360 / STEP ANGLE |
Скорость вращения шагового двигателя мы устанавливаем считывая аналоговое значение с контакта PA4, к которому подключен потенциометр.
1 |
const int speedm = PA4 |
Затем мы преобразуем это аналоговое значение в цифровое и сохраняем его в переменной целого типа. Далее мы с помощью функции map это число из диапазона 0-4096 преобразуем в диапазон 1-1023 чтобы его можно было использовать для установки скорости вращения шагового двигателя. Более подробно об использовании АЦП (аналого-цифрового преобразования) в плате STM32 вы можете прочитать в этой статье.
1 2 3 |
int adc = analogRead(speedm); int result = map(adc, 0, 4096, 1, 1023); |
Далее для установки скорости мы используем функцию stepper.setSpeed(result).
Затем мы должны создать объект для управления шаговым двигателем, в котором необходимо указать контакты платы STM32, с которых будет производиться управление двигателем. Будьте предельно внимательны в этом вопросе потому что в большинстве случаев ошибки в этом вопросе приводят к тому, что шаговый двигатель начинает вращаться не так, как вам нужно.
1 |
Stepper stepper(STEPS, PA0, PA2, PA1, PA3); |
В следующей команде мы будем считывать необходимое число шагов для нашего двигателя из окна монитора последовательной связи. К примеру, нам необходимо 2048 значений для одного полного оборота (32*64 = 2048), тогда 64 будет у нас передаточное число, а 32 – последовательность половинного шага (half step sequence) для одного полного оборота.
1 |
rotate = Serial.parseInt(); |
Следующая команда заставляет наш шаговый двигатель вращаться. Если значение переменной rotate в этой команде будет равно 1, то двигатель сделает один шаг по часовой стрелке.
1 |
stepper.step(rotate); |
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <Stepper.h> // библиотека для работы с шаговым двигателем #define STEPS 32 // число шагов вашего шагового двигателя const int speedm = PA4; // контакт для считывания значения скорости вращения Stepper stepper(STEPS, PA0, PA2, PA1, PA3); // создаем объект для управления шаговым двигателем int rotate = 0; //переменная, с помощью которой будет задаваться число шагов, которые должен сделать двигатель void setup() //Setup() runs only once { Serial.begin(9600); // последовательная связь со скоростью 9600 бод pinMode(speedm,INPUT); // режим работы контакта PA4 на ввод данных } void loop() //loop() runs infinitely { if (Serial.available()>0) //проверяем поступают ли какие либо данные по последовательному порту { rotate = Serial.parseInt(); //gets the value for rotation from serial monitor int adc = analogRead(speedm); // считываем аналоговое значение с контакта PA0 int result = map(adc, 0, 4096, 0, 1023); // конвертируем значение АЦП из диапазона (0-4096) в диапазон (0-1023) stepper.setSpeed(result); //устанавливаем скорость вращения двигателя stepper.step(rotate); //заставляем двигатель вращаться на необходимое число шагов Serial.println(rotate); //prints the value you specified to rotate } } |