Чем крутить шаговый двигатель
Советы для начинающих. Arduino и шаговый двигатель Nema 17
Перед началом очередного проекта на Arduino, было решено использовать шаговый двигатель Nema 17.
Почему именно Nema 17? В первую очередь, из-за отличного соотношения цена/качество.
Перед подключением Nema 17, за плечами был определенный опыт работы с шаговиком 24byj48 (даташит). Управлялся он и с помощью Arduino, и с помощью Raspberry pi, проблем не возникало. Основная прелесть этого двигателя — цена (около 3 долларов в Китае). Причем, за эту сумму вы приобретаете двигатель с драйвером в комплекте. Согласитесь, такое можно даже и спалить, не особо сожалея о содеянном.
Теперь появилась задача поинтереснее. Управлять шаговым двигателем Nema 17 (даташит). Данная модель от оригинального производителя реализуется по цене около 40 долларов. Китайские копии стоят раза в полтора-два дешевле — около 20-30 долларов. Очень удачная модель, которая часто используется в 3D принтерах и CNC-проектах. Первая возникшая проблема — как подобрать драйвер для этого двигателя. Силы тока на пинах Arduino для питания не хватит.
Выбор драйвера для управления Nema 17
Google подсказал, что для оживления Nema 17 можно использовать драйвер A4988 от Poulou (даташит).
Кроме того, есть вариант использования микросхем L293D. Но A4988 считается более подходящим вариантом, так что на нем и остановились во избежание потенциальных проблем.
Как уже упоминалось выше, использовались двигатель и драйвер, заказанные из Китая. Ссылки ниже.
Ссылки для заказа необходимого оборудования из Китая
Подключение Nema 17 через A4988
Подключение было реализовано на основании этой темы на Arduino форуме. Рисунок приведен ниже.
Собственно, данная схема присутствует практически на каждом блоге-сайте, посвященном Arduino. Плата была запитана от 12 вольтового источника питания. Но двигатель не вращался. Проверили все соединения, еще раз проверили и еще раз.
Первая проблема
Наш 12 вольтовый адаптер не выдавал достаточной силы тока. В результате адаптер был заменен на 8 батареек АА. И двигатель начал вращаться! Что ж, тогда захотелось перескочить с макетной платы на прямое подключение. И тут возникла
Вторая проблема
Когда все было распаяно, двигатель опять перестал двигаться. Почему? Не понятно до сих пор. Пришлось вернуться к макетной плате. И вот тут возникла вторая проблема. Стоит предварительно было посидеть на форумах или внимательно почитать даташит. Нельзя подключать-отключать двигатель когда на контроллер подано питание! В результате контроллер A4988 благополучно сгорел.
Эта проблема была решена покупкой нового драйвера на eBay. Теперь, уже с учетом накопленного грустного опыта, Nema 17 был подключен к A4988и запущен, но.
Шаговый двигатель сильно вибрирует
Во время вращения ротора двигатель сильно вибрировал. О плавном движении не было и речи. Гугл вновь в помощь. Первая мысль — неправильное подключение обмоток. Ознакомление с даташитом шагового двигателя и несколько форумов убедили, что проблема не в этом. При неправильном подключении обмоток двигатель просто не будет работать. Решение проблемы крылось в скетче.
Программа для Arduino
Оказалось, что есть замечательная библиотека для шаговых двигателей, написанная ребятами из Adafruit. Используем библиотеку AcclStepper и шаговый двигатель начинает работать плавно, без чрезмерных вибраций.
Основные выводы
- Никогда не подключайте/отключайте двигатель, когда на контроллер подано питание.
- При выборе источника питания, обратите внимание не только на вольтаж, но и на мощность адаптера.
- Не расстраивайтесь, если контроллер A4988 вышел из строя. Просто закажите новый 😉
- Используйте библиотеку AcclStepper вместо голого кода Arduino. Шаговый двигатель с использованием этой библиотеки будет работать без лишних вибраций.
Скетчи для управления шаговым двигателем
Простой Arduino-код для проверки шагового двигателя
//простое подключение A4988
//пины reset и sleep соединены вместе
//подключите VDD к пину 3.3 В или 5 В на Arduino
//подключите GND к Arduino GND (GND рядом с VDD)
//подключите 1A и 1B к 1 катушке шагового двигателя
//подключите 2A и 2B к 2 катушке шагового двигателя
//подключите VMOT к источнику питания (9В источник питания + term)
//подключите GRD к источнику питания (9В источник питания — term)
int stp = 13; //подключите 13 пин к step
int dir = 12; //подключите 12 пин к dir
if (a 400) // вращение на 200 шагов в направлении 2
Второй код для Arduino для обеспечения плавного вращения двигателя. Используется библиотека AccelStepper library.
AccelStepper Stepper1(1,13,12); //использует пин 12 и 13 для dir и step, 1 — режим «external driver» (A4988)
int dir = 1; //используется для смены направления
Stepper1.setMaxSpeed(3000); //устанавливаем максимальную скорость вращения ротора двигателя (шагов/секунду)
Stepper1.setAcceleration(13000); //устанавливаем ускорение (шагов/секунду^2)
Stepper1.move(1600*dir); //устанавливает следующее перемещение на 1600 шагов (если dir равен -1 будет перемещаться -1600 -> противоположное направление)
dir = dir*(-1); //отрицательное значение dir, благодаря чему реализуется вращение в противоположном направлении
delay(1000); //задержка на 1 секунду
Stepper1.run(); //запуск шагового двигателя. Эта строка повторяется вновь и вновь для непрерывного вращения двигателя
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!
LXF155:Крутить моторчик
Подписка на печатную версию Весь 2015 год (12 номеров) Первое полугодие (6 номеров) Второе полугодие (6 номеров) | Подписка на электронную версию Весь 2015 год (12 номеров) Первое полугодие (6 номеров) Второе полугодие (6 номеров) | Подшивки старых номеров журнала (печатные версии) Весь 2014 год (12 номеров) Первое полугодие (6 номеров) Второе полугодие (6 номеров) |
Arduino Управляем сервопориводами и шаговыми двигателями
Arduino: Моторы и движение
Пора двигаться дальше – Ник Вейч заставляет колеса крутиться.
Когда LXF только появился, его держали на плаву исключительно скрипты Bash от Ника Вейча. Потом их заменили «люди», и это, по мнению Ника, стало шагом назад.
С тех самых пор, как Майкл Фарадей начал экспериментировать с проводниками в чашках со ртутью, в электронике, пожалуй, ничем не доставить большего и мгновенного удовлетворения, как привести что-то в движение.
Схемы Arduino обычно используются для управления роботами, но роботы не могут побежать, прежде чем сделают первый неуверенный шаг, поэтому здесь мы рассмотрим основы двигателей и сервоприводов.
Говоря о сервоприводе, обычно имеют в виду устройство, чаще всего встречающееся в радиоуправляемом оборудовании, где оно применяется для управления рулем или другими движущимися частями.
Этот тип сервопривода – обычно сочетание нескольких элементов: двигателя, который дает энергию; шестерней, соединяющих двигатель с его приводным рычагом (который может иметь различную форму и размеры); и устройства обратной связи, обычно потенциометра, с помощью которого сервопривод может точно определить положение рычага.
Для схем с сервоприводом вам понадобится обычный RC-сервопривод, ничего больше. Для шаговых двигателей нужен сам двигатель (см. врезку «Закупаемся шаговыми двигателями»), набор транзисторов и диодов или микросхема H-Bridge, типа L239D.
Сервопривод имеет три провода: по красному и черному обычно подается напряжение питания, по третьему, как правило, желтому или оранжевому – управляющий сигнал. Сервоприводы работают от аналоговых управляющих сигналов, использующих токовый импульс. Ширина импульса определяет положение рычага.
По соглашению, импульс длительностью 1,5 мс перемещает сервопривод в нейтральное положение, среднюю точку – между начальной и конечной точками, а весь диапазон возможных положений покрывает ширина импульсов от 1 до 2 мс.
Для питания одного небольшого RC-сервопривода достаточно линии питания Arduino +5 В, но если их больше, подключите более подходящий источник питания. К счастью, RC-сервоприводы обычно прекрасно работают от напряжения 5 или 6 В, поэтому Arduino и все сервоприводы можно подключить к одному внешнему источнику.
Для формирования импульса не нужен высокий ток, и для их питания не нужны дополнительные реле или транзисторы, что тоже хорошо, поскольку на коротких интервалах времени, с которыми мы работаем, с ними могут возникнуть трудности.
На самом деле, эти временные интервалы могут помешать эффективному управлению сервоприводом из кода Arduino. К счастью, существует стандартная библиотека, с редкой креативностью названная Servo. Если вы подключите свой сервопривод в соответствии с рис. 1, то сможете поэкспериментировать с ним и обнаружить его пределы.
Стандартный пример кода для нашей ситуации – шаблон под названием “Sweep”, который можно найти в примерах, поставляемых с Arduino. В нем для постепенного изменения положения сервопривода от 0 до 180 градусов используются функции позиционирования. Однако, если вы не уверены в предельных значениях для своего устройства, сначала можно попробовать что-нибудь попроще.
- include
Servo servo1; // create servo object
Метод .writeMilliseconds() не содержит код, преобразующий угол в ширину импульса, и просто формирует импульс заданной длительности. Эти значения можно уменьшать и увеличивать до тех пор, пока привод не перестанет двигаться, а затем использовать их в качестве предельных при инициализации устройства:
Параметры этой функции – номер вывода, минимальная ширина импульса и максимальная ширина импульса. Здесь мы используем для сервопривода вывод 9 – именно этот вывод используется чаще всего. В старых версиях кода Arduino библиотека работала только с выводами 9 и 10, и даже сейчас на всех платах, кроме Mega, вызов библиотеки сервопривода приведет к тому, что на этих выводах перестанет работать ШИМ (широтно-импульсная модуляция), поэтому можете воспользоваться и ими.
Если вы хотите или вам нужно записывать данные в сервопривод вручную, воспользуйтесь встроенной функцией map:
которая промасштабирует входное значение между первой парой чисел в соответствующее значение между второй парой чисел.
Основа шагового двигателя – статор, соединенный непосредственно с осью двигателя. Статор окружен постоянными магнитами с чередующимися полюсами, направленными наружу.
Статор окружает набор металлических сердечников, обмотанных проводниками. Между проводниками и статором есть небольшой зазор, чтобы двигатель мог вращаться. Когда через эти проводники пропускают ток, сердечник намагничивается северным или южным магнитным полюсом в зависимости от направления тока.
Намагниченные сердечники отталкивают или притягивают постоянные магниты статора, вызывая его поворот. Последовательная подача тока на проводники позволяет вращать двигатель в любом направлении или моментально его остановить.
Число сердечников и магнитов в статоре определяет угловое разрешение двигателя. Это значение существенно различается и в распространенных двигателях составляет от 1,8 градуса (200 шагов на полный оборот) до 30 градусов (12 шагов). Двухполюсные двигатели позволяют обеспечить большую плотность использования сердечников, и поэтому с ними обычно легче получить больший вращающий момент при небольших габаритах.
Сервоприводы полезны для управления всеми видами робототехники, а также для радиоуправляемых самолетов. Пожалуй, самое простое, что можно сделать с их помощью – измерить физический угол. Кроме сервопривода, понадобится только микропереключатель, подключенный к «плечу» или движущемуся рычагу сервопривода. Затем можно подвесить это к цифровому входу и проверять его в каждом цикле (или вместо этого употребить прерывания – см. предыдущую статью) чтобы увидеть, коснулся ли рычаг чего-либо, см. Схему 1.
Форум сайта mypractic.ru
Обсуждение и вопросы по темам сайта.
- Ссылки
- Темы без ответов
- Активные темы
- Поиск
- Наша команда
Управление шаговым двигателем
- Версия для печати
Управление шаговым двигателем
- Цитата
Сообщение Alian » 28 янв 2017, 23:06
Re: Управление шаговым двигателем
- Цитата
Сообщение Alian » 29 янв 2017, 00:01
Re: Управление шаговым двигателем
- Цитата
Сообщение Эдуард » 29 янв 2017, 00:31
Прежде всего, вам надо формализовать задачу.
У меня следующие вопросы.
- Вам надо просто вращать двигатель, или еще требуется постоянно контролировать какой-нибудь датчик для остановки двигателя? Т.е. алгоритм управления – нажали кнопку, и двигатель крутится или более сложный? Что надо делать в программе в рабочем цикле при вращении?
Зачем Вам микро шаговый режим? Он снижает скорость вращения двигателя, уменьшает крутящий момент, требует увеличивать частоту импульсов STEP.
Гиперболический закон изменения скорости вращения это обязательное условие? Или вы боитесь, что двигатель выйдет из синхронизма?
С какой точностью и дискретностью надо регулировать частоту вращения?
На какие-то вопросы, касающиеся физических процессов, вы, скорее всего не знаете ответы. Я бы рекомендовал сделать так.
- Собрать реальную конструкцию или близкий к ней макет.
Подключить STEP/DIR драйвер к плате Arduino UNO по схеме из урока 35. Загрузить в плату программу драйвера с AT командами.
В уроке 31 есть программа верхнего уровня (на компьютер) позволяющая управлять двигателем. Можно выставить любую скорость, режим, направление, сделать любое число шагов.
Проверить на реальной конструкции, с реальной нагрузкой работу всего: механической конструкции, двигателя, электроники. Вы узнаете все: мощность, скорость, какой режим вращения предпочтительнее…
В уроке 32 есть программа верхнего уровня для следящего электропривода. Можете попробовать управлять с помощью нее. Посмотрите фильм из урока.
После этого вы будете иметь практически всю информацию и сможете сформировать задачу.
Только после всего этого может идти речь об индикаторах, кнопках и т.п.
Re: Управление шаговым двигателем
- Цитата
Сообщение Alian » 29 янв 2017, 16:05
Эдуард писал(а): Прежде всего, вам надо формализовать задачу.
У меня следующие вопросы.
- Вам надо просто вращать двигатель, или еще требуется постоянно контролировать какой-нибудь датчик для остановки двигателя? Т.е. алгоритм управления – нажали кнопку, и двигатель крутится или более сложный? Что надо делать в программе в рабочем цикле при вращении?
Думаю, что логично иметь возможность остановки двигателя в нужный момент. Либо концевой датчик для остановки (микропереключатель). Точность положения ротора меня, практически, не интересует, это не станок. В рабочем цикле, когда двигатель вращается нужно только выведение информации на LCD 1602 Hd44780 желательно на русском языке такого характера: установленная скорость, ну и «СТОП» чтобы можно было понять, что для остановки двигателя нужно нажать на кнопку. Характер сообщений или МЕНЮ я еще конкретно не обдумывал, но должны быть такие параметры как скорость в условных единицах, направление вращения, стартстоп. Пока как-то так. Не плохо было бы иметь уровень разряда аккумулятора, ибо устройство предполагается мобильным, но пока не представляю как это реализовать.
Эдуард писал(а): Прежде всего, вам надо формализовать задачу.
У меня следующие вопросы.
Зачем Вам микро шаговый режим? Он снижает скорость вращения двигателя, уменьшает крутящий момент, требует увеличивать частоту импульсов STEP.
Гиперболический закон изменения скорости вращения это обязательное условие? Или вы боитесь, что двигатель выйдет из синхронизма?
С какой точностью и дискретностью надо регулировать частоту вращения?
Читал известную в сети статью Леонида Ридико, по всему видно, что это профессионал в шаговых двигателях. http://darxton.ru/wiki-article/kontroller-shagovogo-dvigatelya/
Он, в частности, указывает ».. В микрошаговом режиме можно осуществлять только разгон и торможение, а основное время работать в полношаговом режиме. » Затем, на невысоких скоростях микрошаговый режим позволяет работать двигателю более плавно.
Что касается гиперболического закона, то в вышеуказанной статье пишется следующее :
«. Использование разгона и торможения позволяет достичь значительно больших скоростей — в индустриальных применениях используются скорости до 10000 полных шагов в секунду. .
. На практике чаще всего применяют разгон и торможение с постоянным ускорением.
. При разгоне или торможении с постоянным ускорением частота повторения шагов должна изменяться линейно, соответствено значение периода, которое необходимо загружать в таймер, должно меняться по гиперболическому закону. «
Точность регулировки частоты вращения не имеет ни малейшего значения. Достаточно весь спектр скоростей поделить на 10-20 градаций от нуля до максимума и выбирать просто нужную относительную цифру перед пуском.
Эдуард писал(а): [list]Собрать реальную конструкцию или близкий к ней макет.
Подключить STEP/DIR драйвер к плате Arduino UNO по схеме из урока 35. Загрузить в плату программу драйвера с AT командами.
В уроке 31 есть программа верхнего уровня (на компьютер) позволяющая управлять двигателем. Можно выставить любую скорость, режим, направление, сделать любое число шагов.
Конструкцию собрал, а именно: двигатель, драйвер, контроллер. Питание на контроллер пока пробовал только 12 вольт, вот вот появится возможность подать до 48 В (как того требует драйвер для максимальных скоростей).
Загружал именно Ваш скетч из урока 35 с библиотекой StepDirDriver. Двигатель вращается. Правда максимальная скорость не очень высока. Я ещё плохо понимаю Ваш скетч, буду задавать вопросы. Мне там не понятно, как формируется скорость.
С AT командами не пробовал, но думаю, что максимальную скорость без разгона по гиперболе все равно не получить.
Эдуард писал(а):
Проверить на реальной конструкции, с реальной нагрузкой работу всего: механической конструкции, двигателя, электроники. Вы узнаете все: мощность, скорость, какой режим вращения предпочтительнее…
Re: Управление шаговым двигателем
- Цитата
Сообщение Alian » 29 янв 2017, 16:26
Re: Управление шаговым двигателем
- Цитата
Сообщение Alian » 29 янв 2017, 16:33
Re: Управление шаговым двигателем
- Цитата
Сообщение Эдуард » 29 янв 2017, 18:12
Я все таки советую проверить максимальную скорость двигателя в программе драйвера с AT командами. Вы можете устанавливать любую скорость с компьютера и все проверить за 5 минут. Вполне возможно, что не придется реализовывать разгон двигателя. Это очень не благодарная задача.
Проверьте какую максимальную скорость обеспечивает ваш двигатель без плавного разгона.
Возможно она вас устроит.
Я когда-то делал управление мощным индукторным двигателем с датчиками положения ротора (ДПР).
Сначала он разгонялся в режиме шагового двигателя без обратной связи.
Затем фазы переключались по сигналам ДПР.
А на следующем этапе скорости магнитное поле в обмотках отставало от реального положения ротора. Приходилось строить виртуальную диаграмму переключения фаз с опережением сигналов ДПР.
Но это был очень скоростной двигатель.
Для больших скоростей вращения применяют бесколлекторные двигатели. Например, эти. У них есть встроенные датчики положения ротора. Без ДПР вы не сможете получить высокой скорости вращения. Любое изменение механической нагрузки, и двигатель выходит из синхронизма.
Проверьте что сможете получить от шагового двигателя без разгона.
Re: Управление шаговым двигателем
- Цитата
Сообщение Alian » 30 янв 2017, 15:45
Re: Управление шаговым двигателем
- Цитата
Сообщение Эдуард » 30 янв 2017, 17:12
Измерить количество оборотов для шагового двигателя?
Посчитать шаги. Для вашего двигателя 200 шагов это полный оборот.
Re: Управление шаговым двигателем
- Цитата
Сообщение Alian » 30 янв 2017, 23:13
Эдуард писал(а): Измерить количество оборотов для шагового двигателя?
Посчитать шаги. Для вашего двигателя 200 шагов это полный оборот.
Нет, я скорость имел ввиду. Оборотов в минуту. По времени засекать — как-то не камильфо. Для Андроида скачивал проги по замеру скорости вращения, они не работают. Прибора для этого измерения — нет.
Re: Управление шаговым двигателем
- Цитата
Сообщение Эдуард » 30 янв 2017, 23:16
Re: Управление шаговым двигателем
- Цитата
Сообщение Alian » 03 фев 2017, 23:06
Re: Управление шаговым двигателем
- Цитата
Сообщение Эдуард » 03 фев 2017, 23:08
Re: Управление шаговым двигателем
- Цитата
Сообщение Rom327 » 09 июл 2017, 15:10
Re: Управление шаговым двигателем
- Цитата
Сообщение Rom327 » 09 июл 2017, 15:24
Re: Управление шаговым двигателем
- Цитата
Сообщение Эдуард » 09 июл 2017, 19:22
Re: Управление шаговым двигателем
- Цитата
Сообщение Rom327 » 09 июл 2017, 22:39
Здравствуйте! Вот наваял скетч из 2-х один. Работает от кнопки на 3-ем пине. Вторая кнопка вообще не реагирует, видимо что-то я наврал.
Вперед шагает на 400 шагов, назад на 100. В принципе то что надо. Как правильно задействовать кнопку на пине 2, чтобы при нажатии на нее мотор постоянно крутился обратно?
// define a constant value named stepPin and assign the value 9 to it — this value will not change during our code
// this assumes digital pin 9 of your Arduino is attached to the step input of your driver
// определяем значение константы по имени продвижение и присвойте значение 9 к нему — это значение не изменится в ходе нашего кода
// при этом предполагается, что цифровой контакт 9 части вашего Arduino крепится к шагу ввода драйвера
#define stepPin 9
// define a constant value named dirPin and assign the value 8 to it — this value will not change during our code
// this assumes digital pin 8 of your Arduino is attached to the step input of your driver
// определяем значение константы по имени штырь и присвоить значение 8 — это значение не изменится в ходе нашего кода
// при этом предполагается, что цифровой вывод 8 части вашего Arduino крепится к шагу ввода драйвера
#define dirPin 8
// define the pins on which we’ve put our N.O. buttons
// определить штыри, на которых мы поместили наши кнопки Н.О.
#define button1 2
#define button2 3
// setup() loop, the Arduino only runs through this once
// настройка() петли, Arduino только проходит через этот раз
void setup() <
// digital pins on the Arduino can only be either set as an output or input — in our case we want to send data to the driver, so we choose output
// цифровых пинов на Arduino можно только либо установить в качестве выходного или входного сигнала — в нашем случае мы хотим отправить данные на водителя, поэтому мы выбираем выходной
pinMode(stepPin , OUTPUT);
pinMode(dirPin , OUTPUT);
// define our button pins as input pullup type
// определения наша кнопка булавки в качестве входного типа подтяжки
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
// let’s set an initial value of low to both our step and dir pins, we could easily write false or 0 instead of LOW
// зададим начальное значение минимума как шаг штырей и дира, мы могли бы легко написать false или 0, а не низкий
digitalWrite(stepPin , LOW);
digitalWrite(dirPin , LOW);
>
// loop() loop, the Arduino continuously cycles through this as fast as it can
// петля() петли, Ардуино постоянно циклов через это как можно быстрее
void loop() <
Драйвер шагового двигателя своими руками
Шаговый двигатель используется в машинах для точного перемещения. Наладим управление шаговым двигателем через USB с компьютера своими руками. Нам потребуется:
1) Шаговый двигатель, возьмем — Nema23 76 мм, вместо него может быть другой, управлять будем биполяным методом, любой гибридный и биполярный шаговый двигатель будет работать с таким же управлением.
2) Блок питания, возьмем — импульсный блок питания мощностью 360W с выходным напряжением 24V / 15A, может использоваться любой другой блок питания, если будет достаточно мощности и напряжения для работы двигателя. Более мощному двигателю будет нужно больше напряжения. Предел напряжения нашего драйвера ограничивается максимальным напряжением, которое выдерживают транзисторы, это 100V, у нас блок питания на 24V. В случае большего напряжения транзисторы в схеме необходимо заменить на более мощные, также при увеличении напряжения, транзисторы могут начать греться, если такое случилось, необходимо дополнительно обдувать их куллером (у меня все в порядке и куллер не требуется). Для подключения блока питания к сети 220V также нужен шнур и нужно определить где в вашей розетке ноль, а где фаза. Контакт блока N подключается к нулю, а L к фазе, также можно подключить заземление (но не обязательно). Определение возможно при помощи индикаторной отвертки, у меня определилось, что слева ноль, а справа фаза.
Как крутить шаговый двигатель
Шаговый двигатель работает от подачи комбинаций напряжения в разных направлениях на его обмотки, у этого шагового двигателя 2 обмотки — 4 провода, первая обмотка — черный (A) и зеленый (A*) провод, вторая обмотка — красный (B) и синий (B*). За одну смену комбинаций делается 1 шаг — 1,8 градусов. Если комбинации быстро менять, то двигатель будет быстро и точно позиционироваться — крутиться. Смена комбинаций возможна в двух направлениях, соответственно двигатель будет крутиться вперед или назад.
Чтобы крутить шаговый двигатель, надо:
1) Собрать устройство — USB контроллер шагового двигателя на микроконтроллере AVR и драйвер шагового двигателя, 2 в 1. Перед тем как собирать это сложное устройство, рекомендую сначало отдельно собрать и проверить работу только USB контроллера, его я уже собрал вот тут — контроллер USB. Если USB связь работает нормально, то можно приступать к изготовлению драйвера.
2) Написать программу для компьютера, которая будет посылать USB команды устройству.
3) Написать программу для микроконтроллера AVR, которая будет принимать USB команды и крутить двигатель.
USB контроллер шаговых двигателей и USB драйвер шагового двигателя
Взятый нами двигатель является гибридным и поддерживает несколько вариантов управления. Управлять двигателем будем биполярным методом и соответственно собираем мы драйвер биполярного шагового двигателя с USB контроллером. Сначало покажу готовый результат, а потом подробно рассмотрим его. Вот фото собранного драйвера шагового двигателя с USB управлением, который я собрал:
Драйвер шагового двигателя с USB управлением своими руками
Схема драйвера биполярного шагового двигателя и USB контроллера (схема длинная и нуждается в прокрутке для просмотра):
Драйвер шагового двигателя USB на микроконтроллере AVR своими руками
Дополнительно нужно (нет в наличии):
1) Модуль питания DC-DC SMAU01L-12 (вместо него пойдет любой конвертер DC-DC с 5V до 10V-15V) — 1 шт., возможно можно без него, от 5V питать (не проверено)
Главным компонентом схемы является программируемый микроконтроллер AVR — ATmega16A, если вы не знаете как с ними работать (записывать программу), сначало ознакомьтесь с основами такой работы, которые подробно описаны в первой статье
управление машиной. Для устройства можно использовать и другой микроконтроллер AVR, я выбрал ATmega16A, т.к. в нем с запасом имеется много памяти и контактов для подключения нескольких двигателей и большого количества рабочих инструментов.
Слева от ATmega16A находятся компоненты для организации связи по протоколу USB — к выводам XTAL подключен внешний кварцевый резонатор с USB-совместимой частотой 12 МГц. Для сглаживания сигнала у него есть 2 конденсатора по 20 пФ, все это соединяется с минусом питания. К контактам, через которые идет обмен сообщениями с USB, подключены 2 резистора по 68 Ом, как того требует протокол USB. Резистор на 1.5 кОм, подключенный к D- линии задает низкоскоростной режим работы USB устройства. Диоды Зенера 3V6 понижают напряжение на линиях, через которые идет обмен данными USB с 5 до 3.6V.
Управление двигателем подключается к контактам PB0, PB1, PB2, PB3, на остальные свободные P-контакты можно в будующем подключить еще двигатели и рабочие инструменты, но пока они пустуют. Микроконтроллер ATmega16 отдает команды и обрабатывает USB сигналы после того как в него записана программа (ниже она будет написана). После него идет конструкция из микросхем IR2102 и транзисторов IRF540N (2 так называемых H-моста) — она приводит шаговый двигатель в движение.
Драйвер IR2101 нужен для преодаления большой емкости затвора транзистора IRF540N, что позволяет открывать и закрыть транзистор с большой скоростью (например принимать сигнал ШИМ, которым может регулироваться скорость двигателя при необходимости — об этом сигнале дальше напишу), что нам и нужно. К сожалению для питания этого драйвера необходимо 10-15V, у нас есть только 5V от USB. Поэтому пришлось поставить компонент DC-DC SMAU01L-12, который преобразует 5V в 12V, вместо него можно использовать любой другой способ получения такого напряжения, например, при помощи трансформатора или любым другим путем. К VCC подключается +12V, к COM -12V. Один драйвер работает с 2мя транзисторами — верхним (H) и нижним (L). Контакты HIN и LIN — входной сигнал с микроконтроллера для верхнего и нижнего транзистора, по этому сигналу транзисторы открываются и закрываются. HO и LO — это выходные сигналы, транзисторы подключаются гейтами (G) к этим контактам. Они подключаются не просто так — справа на линиях 2 резистора 10/100 Ом и диод, они нужны для нормальной работы транзисторов — чтобы они замедлялись при открытии и не замедлялись при закрытии, эти транзисторы слишком быстро открываются и это может вызвать проблемы. Диод и конденсаторы 3300 пФ — нужны для работы драйвера IR2101 согласно документации на эту микросхему.
Каждая обмотка (фаза) двигателя (у двигателя 2 обмотки A и B — 4 контакта) подключается к H-мосту из транзисторов IRF540N. H-мост — это специальная схема соединения транзисторов, которая позволяет подавать через них напряжение высокого уровня (24V) в разных направлениях. Один мост изготавливается из 4-х транзисторов. В итоге здесь вы видите 2 H-моста, которые позволяют гонять разнонаправленное напряжение высокого уровня по 2м обмоткам двигателя и тем самым крутить его.
Обратите внимание, что в мосту — HIN верхнего драйвера соединяется с LIN нижнего драйвера, а LIN верхнего с HIN нижнего. Это сделано для одновременной подачи сигналов. Если вы включили HIN сверху, то обязаны включить LIN с низу, иначе произойдет короткое замыкание. Такое подключение позволяет автоматом включать пару. Впрочем короткое замыкание все же возможно, если вы откроете и HIN и LIN на одном мосте, поэтому не допускайте этого. На контактах PB0 — PB3 допустимы только значения 0000, 1010, 0110, 0101, 1001. Их перебор крутит двигатель. Подача других значений скорей всего приведет к короткому замыканию моста.
Мощные резисторы с низким номиналом 0.1 Ом и высокой мощностью (3-5 Вт) нужны для защиты от высокого тока — это шунты. Если что их можно снять и заменить простым соединением с минусом питания, если например не будет хватать мощности. Для слабых резисторов мощность берется от тока USB: 0.05 А * 5 V = 0.25 Вт (ток USB задается программно, по умолчанию в нашей программе стоит 0.05). Черная полоска на диодах соответствует вертикальной линии на схеме.
Шаговый двигатель и блок питания подключаются к H-мостам, как показано на схеме. Минусы питания 24V, 12V и 5V соединяются. Между плюсом и минусом 24V линии ставится сглаживающий пленочный конденсатор.
Отдельное крупное фото драйвера шагового двигателя: