Шаговые двигатели – это бесщеточные двигатели постоянного тока, которую могут вращаться от 00 до 3600 дискретными шагами. С каждым управляющим сигналом ось такого двигателя поворачивается на фиксированное значение (шаг). Управление вращением подобных двигателей осуществляется последовательностью специальных сигналов. В отличие от серводвигателей шаговые двигатели могут управляться контактами ввода-вывода общего назначения, а не только контактами ШИМ модуляции, и могут вращаться на (+3600) и (-3600). Последовательность следования управляющих сигналов определяет будет ли шаговый двигатель вращаться по часовой или против часовой стрелки. Для управления скоростью вращения такого двигателя необходимо просто изменять уровень управляющих сигналов. У шаговых двигателей есть несколько режимов шагового (дискретного) вращения – на полный шаг, на половину шага и на микрошаг.
В этом проекте мы будем подключать шаговый двигатель 28BYJ-48 к микроконтроллеру ATmega16 (семейство AVR), используя программу Atmel Studio 7.0. Шаговый двигатель будет работать при напряжении питания 5В. Мы будем подключать шаговый двигатель к микроконтроллеру с помощью драйверов электродвигателей ULN2003 и L293 (по отдельности). Оба будут запитываться напряжением 5В.
Примеры шаговых двигателей
Как следует из их названия, вращение шаговых электродвигателей представляет собой серию коротких шагов. В этом и состоит их отличие от двигателей свободного вращения - шаговый двигатель сделает столько шагов, сколько ему будет задано, и вы будете точно знать, сколько он их сделал. Это одна из причин, почему шаговые двигатели широко применяются как в обычных, так и в ЗD-принтерах. В обычных принтерах они точно позиционируют бумагу, а в ЗD - рабочий столик и сопло.
На представленном рисунке представлены три образца шаговых электродвигателей. Миниатюрные электродвигатели типа тех, что показан слева, служат для перемещения элементов объектива в компактной фотокамере или смартфоне. В центре находится шаговый мотор-редуктор с питанием 5В - в его корпусе заключен и шаговый электродвигатель, и редуктор. Справа изображен шаговый электродвигатель, типичный дл я принтеров.
Принцип работы биполярного шагового электродвигателя
На следующем рисунке показана схема работы биполярного шагового электродвигателя. О другом типе шаговых электродвигателей - униполярных – можно прочитать в соответствующих источниках. В биполярном шаговом двигателе, как правило, имеются четыре катушки. Катушки, расположенные одна против другой, соединены так, что работают синхронно.
Все катушки расположены на неподвижном статоре двигателя, а значит, нет необходимости во вращающемся коллекторе и щетках, как у двигателей постоянного тока.
Ротор шагового электродвигателя выполнен в форме намагниченных зубцов с чередующимися северным (С) и южным (Ю) полюсами (зубцов на роторе обычно гораздо больше, чем показано на представленном рисунке). Каждую катушку можно подключить так, что она будет намагничена или как северный полюс, или как южный, - в зависимости от направления тока в катушке. Катушки 1 и 3 работают совместно так, что когда катушка 1 будет южным полюсом, катушка 3 также будет южным полюсом. То же самое относится и к катушкам 2 и 4.
Начнем с варианта рисунка под буквой "а" - когда катушка 1 , а значит, и катушка 3 запитаны так, что становятся южными полюсами (Ю), вследствие того, что разноименные полюса притягиваются, а одноименные отталкиваются, ротор поворачивается против часовой стрелки до тех пор, пока ближайшие зубцы ротора с намагниченностью северного полюса (С) не поравняются с катушками 1 и 3 (как показано на "б").
Чтобы продолжить вращение против часовой стрелки, на следующем шаге (рисунок "в") необходимо подать ток в катушки 2 и 4 так, чтобы они стали северными полюсами (С). Тогда ближайшие зубцы ротора с намагниченностью Ю подтянутся к катушкам 2 и 4 (рисунок "г").
Каждое такое действие проворачивает ротор электродвигателя на один шаг. Для продолжения вращения против часовой стрелки в катушке 1 снова нужно создать намагниченность С (см. представленную таблицу).
Таблица 1. Последовательность действий при вращении шагового двигателя против часовой стрелки
Катушки 1 и 3 | Катушки 2 и 4 |
Ю | - |
- | С |
С | - |
- | Ю |
Прочерки в графах таблицы 1 указывают на то, что катушка в этот момент не оказывает влияния на вращение ротора и должна быть обесточена. Чтобы усилить момент вращения двигателя, на эти обесточенные катушки можно подать такой ток, чтобы полярность их намагниченности совпадала с полярностью стоящего под ней зубца ротора (таблица 2).
Таблица 2. Уточненная последовательность переключения катушек при вращении шагового двигателя
Катушки 1 и 3 | Катушки 2 и 4 |
Ю | С |
С | С |
С | Ю |
Ю | Ю |
Для изменения направления вращения ротора нужно всего лишь изменить порядок переключения катушек, указанный в таблице 2, на обратный.
Необходимые компоненты
- Микроконтроллер ATmega16 (купить на AliExpress).
- Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
- Кварцевый генератор 16 МГц.
- Шаговый двигатель 28BYJ-48 (купить на AliExpress).
- Драйвер двигателей ULN2003 (купить на AliExpress) или L293D (купить на AliExpress).
- Конденсатор 100 нФ (2 шт.) (купить на AliExpress).
- Конденсатор 22 пФ (2 шт.) (купить на AliExpress).
- Кнопка.
- Светодиод (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
- Источник питания с напряжением 5 Вольт.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Маркировка контактов шагового двигателя
Представлена на следующем рисунке.
Как видим, схема контактов шагового двигателя как будто специально "заточена" под то, чтобы подключать его к соответствующим драйверам (ULN2003 или L293D).
Назначение контактов микросхемы ULN2003 (драйвера двигателей) приведено на следующем рисунке.
Внешний вид этого драйвера двигателей выглядит следующим образом:
Внешний вид драйвера мотора L293D приведен на следующем рисунке:
Работа схемы
В следующих двух таблицах представлены схемы соединений входных и выходных контактов драйверов моторов ULN2003 или L293D с микроконтроллером AVR ATmega16 и шаговым электродвигателем.
Atmega16 | ULN2003 | L293D |
A0 | IN1(PIN1) | IN1(PIN2) |
A1 | IN2(PIN2) | IN2(PIN7) |
A2 | IN3(PIN3) | IN3(PIN10) |
A3 | IN4(PIN4) | IN4(PIN15) |
Шаговый двигатель | ULN2003 | L293D |
Orange | OUT1(PIN16) | OUT1(PIN3) |
Yellow | OUT2(PIN15) | OUT2(PIN6) |
Pink | OUT3(PIN14) | OUT3(PIN11) |
Blue | OUT4(PIN13) | OUT4(PIN14) |
Схема устройства с драйвером мотора ULN2003 приведена на следующем рисунке.
Схема этой же самой конструкции, но с драйвером мотора L293D, будет выглядеть следующим образом.
Внешний вид устройства с использованием ULN2003 приведен в начале статьи, а с использованием L293D он будет выглядеть следующим образом:
Соедините все компоненты устройства в соответствии с приведенной схемой соединений (одной из двух). Для управления шаговым двигателем мы будем использовать PORTA микроконтроллера Atmega16. К контактам шагового двигателя нет необходимости подключать питание – для управления им нам понадобятся только контакты его катушек (coil pins) – верно для ULN2003, для L293D немного по другому. Очень важен порядок контактов для того чтобы шаговый двигатель работал корректно. Для микросхемы ULN2003 используются четыре ее входа и четыре ее выхода – входы соединяются с контактами PORTA микроконтроллера, а выходы – с сигнальными контактами шагового двигателя. Также подсоедините кнопку к контакту сброса (Reset pin) чтобы иметь возможность осуществлять сброс микроконтроллера Atmega16 всегда, когда нам это понадобится. Подсоедините к микроконтроллеру кварцевый генератор. Все устройство должно быть запитано напряжением 5В.
Исходный код программы на языке С (Си) с пояснениями
Приведенный в этом разделе код программы демонстрирует вращение шагового двигателя под управлением микроконтроллера AVR в обе стороны: по часовой стрелке и против часовой стрелки. Если вы хотите вращать шаговый двигатель только в одну сторону – просто закомментируйте ненужную часть кода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#define F_CPU 16000000UL /* Define CPU Frequency 1MHz */ #include <avr/io.h> /* подключаем стандартную библиотеку ввода/вывода */ #include <util/delay.h> /* задействуем функции задержки в программе */ int main(void) { DDRA = 0x0F; /* конфигурируем PORTA на выход */ int period = 6; /* устанавливаем период (задержку) между двумя шагами */ while (1) { /* вращаем шаговый двигатель по часовой стрелке */ for(int i=0;i<50;i++) { PORTA = 0x09; _delay_ms(period); PORTA = 0x08; _delay_ms(period); PORTA = 0x0C; _delay_ms(period); PORTA = 0x04; _delay_ms(period); PORTA = 0x06; _delay_ms(period); PORTA = 0x02; _delay_ms(period); PORTA = 0x03; _delay_ms(period); PORTA = 0x01; _delay_ms(period); } PORTA = 0x09; /* последний шаг в начальную позицию */ _delay_ms(period); _delay_ms(1000); /* вращаем шаговый двигатель против часовой стрелки */ for(int i=0;i<50;i++) { PORTA = 0x01; _delay_ms(period); PORTA = 0x03; _delay_ms(period); PORTA = 0x02; _delay_ms(period); PORTA = 0x06; _delay_ms(period); PORTA = 0x04; _delay_ms(period); PORTA = 0x0C; _delay_ms(period); PORTA = 0x08; _delay_ms(period); PORTA = 0x09; _delay_ms(period); } PORTA = 0x09; _delay_ms(period); _delay_ms(1000); } } |