Как управлять шаговым двигателем микроконтроллером

от admin

Как управлять шаговым двигателем микроконтроллером

Описан еще один способ «полушагового» управления 2-тактным униполярным шаговым двигателем на Бейсике в BASCOM-AVR микроконтроллером ATtiny2313.

Как правило, у каждого радиолюбителя есть выкрученные из старой радиоаппаратуры 2-тактные униполярные ШД с 6-ю или 5-ю проводами. В современных устройствах они практически не используются, но из них можно много чего сделать. Данный метод не претендует на истину и носит лишь информативный характер. Предполагается, что если вы зашли на эту страничку, значит, Вы знаете, что такое шаговый двигатель. В данной статье не рассматривается применение специализированных микросхем. Цель данной статьи — наработка материала для создания более сложного устройства в будущем на основе одного микроконтроллера.

Итак, рассмотрим схему управления ШД микроконтроллером на примере устройства для проверки шаговых двигателей. Основа устройства МК ATtiny2313, выбран лишь потому, что у него есть необходимое количество ног для развития устройства в будущем. ШД подключен к микроконтроллеру через ULN2003. Это не лучшее решение для постоянной эксплуатации мощного ШД, но для проверки и оценки возможностей вполне достаточно. Как правило ШД выкрученные из старых принтеров и «флоппиков» не выделяются особой мощностью и годятся в основном лишь только «прищепки поворачивать», поэтому максимального тока ULN-ки 500мА вполне хватает. Кнопки управляют направлением вращения двигателя, при нажатии и удержании одной двигатель крутится в одну сторону, при нажатии другой — в другую. Светодиод подтверждает нажатие кнопок.

Плата3д

Но главное в нашем устройстве управляющая программа, поэтому рассмотрим ее в подробностях. Первым делом, как положено, выбираем тип МК и частоту на которой он будет работать.

Потом устанавливаем все выводы порта B как «выход». Выводы 6 и 7 микроконтроллера устанавливаем как «вход», для подключения кнопок. Светодиод подключен к выводу 9 поэтому PORTD.5 «выход» и присваиваем ему имя Led. Для компенсации дребезга контактов устанавливаем продолжительность опроса кнопок оператором Debounce равной 50. Объявляем переменную S и делаем ее равной 1. В зависимости от значения этой переменной программа будет включать и выключать соответствующие выводы порта B.

2

Здесь запущен основной цикл программы. Т.к. ни одна из кнопок пока еще не нажата, то гасим светодиод и выключаем все выводы порта B, что бы на обмотках двигателя не было напряжения во время ожидания нажатия кнопок. Оператор Debounce бесконечно следит за нажатием кнопок и срабатывает сразу, когда на выводе 6 или 7 появляется низкий уровень, отсылая выполнение программы в соответствующую подпрограмму.

Теперь главное. Нажата кнопка «ВЛЕВО». Включаем светодиод и увеличиваем переменную S на 1. Так как мы управляем двигателем «полушагом», то для упрощения программы выбрано всего 8 вариантов состояния выходов порта B. Поэтому следим за значением переменной S и если оно больше 8, то снова делаем его равным 1. Теперь выбираем одно из состояний выводов порта B соответственно значению переменной S. Ждем несколько микросекунд и проверяем, нажата ли еще кнопка. Если кнопка нажата, то возвращаемся в начало подпрограммы, увеличиваем и проверяем переменную S, переключаем выводы в следующее состояние. Так до тех пор, пока нажата кнопка. Когда отпускаем кнопку, нас после проверки последнего условия автоматом возвращает в основной цикл программы, где программа снова ждет нажатия кнопки.

4

При нажатии кнопки «ВПРАВО» все происходит точно также, только теперь переменную S уменьшаем и следим, что бы она не становилась равной 0.

5

Отдельно нужно сказать об операторе задержки Waitms. Этот оператор регулирует скорость вращения вала двигателя, чем он его значение меньше, тем быстрее крутится вал. Дело в том, что для управления реальным ШД должен применяться оператор Waitus со значением от 1000 до 5000, но Proteus 7.10 отказывается симулировать схему на такой скорости. Поэтому для симуляции ставим в программу Waitms 50 и двигатель в Proteus-е весело крутится. А для реального ШД ставим Waitus 1000 иначе он будет просто дергаться при нажатии кнопки. Также, возможно, придется подобрать это значение под конкретный двигатель. Бывает так, что один мотор прекрасно и бесшумно крутится с значением Waitus 1000, а другой мычит на месте. Изменишь значение на 2000 и все, поехал.

Если после сборки и подключения двигатель не крутится, мычит или дергается в разные стороны проверяем сначала правильность подключения его обмоток. Можно просто методом «научного тыка» перебрать все возможные варианты. Так же внимательно программируем «фьюзы». Если мотор медленно, но верно «тикает» или пытается двинуться в нужном направлении можно попробовать изменить значение оператора Waitus.

Управление шаговым двигателем

Шаговый двигатель это, как понятно из его названия, двигатель который вращается дискретными перемещениями . Достигается это за счет хитрой формы ротора и двух (реже четырех) обмоток. В результате чего, путем чередования направления напряжения в обмотках можно добиться того, что ротор будет по очереди занимать фиксированные значения.
В среднем, у шагового двигателя на один оборот вала, приходится около ста шагов. Но это сильно зависит от модели двигателя, а также от его конструкции. Кроме того, существуют полушаговый и микрошаговый режим , когда на обмотки двигателя подают ШИМованное напряжение, заставляющее ротор встать между шагами в равновесном состоянии, которое поддерживается разным уровнем напряжения на обмотках. Эти ухищрения резко улучшают точность, скорость и бесшумность работы, но снижается момент и сильно увеличивается сложность управляющей программы — надо ведь расчитывать напряжения для каждого шага.

Один из недостатков шаговиков, по крайней мере для меня, это довольно большой ток. Так как на обмотки напруга подается все время, а такого явления как противоЭДС в нем, в отличии от коллекторных двигателей, не наблюдается, то, по сути дела, мы нагружаемся на активное сопротивление обмоток, а оно невелико. Так что будь готов к тому, что придется городить мощный драйвер на MOSFET транзисторах или затариваться спец микросхемами.

  • Биполярный — имеет четыре выхода, содержит в себе две обмотки.
  • Униполярный — имеет шесть выходов. Содержит в себе две обмотки, но каждая обмотка имеет отвод из середины.
  • Четырехобмоточный — имеет четыре независимые обмотки. По сути дела представляет собой тот же униполярник, только обмотки его разделены. Вживую не встречал, только в книжках.

Где взять шаговый двигатель.
Вообще шаговики встречаются много где. Самое хлебное место — пятидюймовые дисководы и старые матричные принтеры . Еще ими можно поживиться в древних винчестерах на 40Мб, если, конечно, рука поднимется покалечить такой антиквариат.
А вот в трехдюймовых флопарях нас ждет облом — дело в том, что там шаговик весьма ущербной конструкции — у него только один задний подшипник, а передним концом вал упирается в подшипник закрепленный на раме дисковода. Так что юзать его можно только в родном креплении. Либо городить высокоточную крепежную конструкцию. Впрочем, тебе может повезет и ты найдешь нетипичный флопарь с полноценным движком.

Схема управления шаговым двигателем
Я разжился контроллерами шаговиков L297 и мощным сдвоенным мостом L298N.

  • На вход CW/CCW подаем направление вращения — 0 в одну сторону, 1 — в другую.
  • на вход CLOCK — импульсы. Один импульс — один шаг.
  • вход HALF/FULL задает режим работы — полный шаг/полушаг
  • RESET сбрасывает драйвер в дефолтное состояние ABCD=0101.
  • CONTROL определяет каким образом задается ШИМ, если он в нуле, то ШИМ образуется посредством выходов разрешения INH1 и INH2 , а если 1 то через выходы на драйвер ABCD. Это может пригодится, если вместо L298 у которой есть куда подключать входы разрешения INH1/INH2 будет либо самодельный мост на транзисторах, либо какая-либо другая микросхема.
  • На вход Vref надо подать напряжение с потенциометра, которое будет определять максимальную перегрузочную способность. Подашь 5 вольт — будер работать на пределе, а в случае перегрузки сгорит L298 , подашь меньше — при предельном токе просто заглохнет. Я вначале тупо загнал туда питание, но потом передумал и поставил подстроечный резистор — защита все же полезная вещь, плохо будет если драйвер L298 сгорит.
    Если же на защиту пофигу, то можешь заодно и резисторы, висящие на выходе sense выкинуть нафиг. Это токовые шунты, с них L297 узнает какой ток течет через драйвер L298 и решает сдохнет он и пора отрубать или еще протянет. Там нужны резисторы помощней, учитывая что ток через драйвер может достигать 4А, то при рекомендуемом сопротивлении в 0.5 Ом, будет падение напряжения порядка 2 вольт, а значит выделяемая моща будет около 4*2=8 Вт — для резистора огого! Я поставил двухваттные, но у меня и шаговик был мелкий, не способный схавать 4 ампера.

  • Управляющий контроллер L297
  • Силовой мост L298N
  • Силовой мост L293
  • Управляющий контроллер с интегрированным силовым мостом L6208
  • Сводная таблица микросхем управления шаговыми двигателями

Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!

А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.

207 thoughts on “Управление шаговым двигателем”

А можешь посоветовать шаговик из тех, которые сейчас можно купить?
Я не знаю как у всех, но я д аже двухдюймовые флопики повыкидывал лет пять назад, а 5-ти дюймовых и в помине не было.

По продаваемым не в курсе. В нашей деревне их в продаже нету, а что там в Московии я даже не знаю.

Оппа, теперь самое время разбираться, что за шаговики у меня имеются по результатам годового потрошения CD-DVD ROM’ов. 🙂

А в сидюках/дивдюках вроде бы стоят обычные коллекторники+синхронный на шпиндель. Хотя могут быть и шаговики, но я не встречал ни разу.

Шаговики во многих CD/DVD приводах стоят — для таскания каретки с лазером (у меня минимум 3 таких экземпляра валяются). Но конструкция двигателя — как в трехдюймовых дисководах, для практического применения неудачная.

ну когда я расотрошил сиди ром там был безколлекторник + еще какойто на шпиндель
для безколлекторника я думаю применение в моделизме
http://forum.rcdesign.ru/index.php?showtopic=12183&st=560
может пригодится кому

http://forum.rcdesign.ru/index.php?showtopic=12183&st=560
может чем пригодится там модельный регултор хода
может управлять сдромным безколлекторником

работал с шаговыми движками на своей фирме.
ещё с нашими совеццкими и руссийскими.

сколько раз коротыш верещал на источниках — не счесть ) единственное оправдание — я про них ещё тогда ничего не знал и доков не имел. работал методом тыка…

всё хорошо, но нету обратной связи.

зы! от постоянных замыканий избавлялись частыми переключениями обмоток, когда надо было застопорить двигло.

. в смысле от постоянных замыкани? Как ты умудрялся его коротнуть? Одновременным замыканием ключей верхнего и нижнего плеча? Так там Dead Time надо ставить!

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

Долгая подача напруги на обмотки это его нормальный рабочий режим. Главное чтобы напряжение было номинальным.

Полезно, спасибо. Мне в свое время довелось раскурочить 8″ дисковод. Два шаговика лежат дожидаются своего часа. Так, что информация может пригодиться.

У меня этих дисководов полтора десятка штук!

Есть интересная статья по использованию шаговых двигателей
Журнал Современная электроника Октябрь 2004 г. стр. 46-47
Автор: Олег Пушкарев, Омск, конструкция на базе PIC16F84 и
драйвера — ULN2003A. (WWW.SOEL.RU)
Журнал очень рульный, советую почитать, статьи высылают
по почте, по запросу или подписка (в том числе бесплатная).

Еще одна задача — управление двигателем
постоянного тока на 24 в (12В), реверс,
управление скоростью. Есть буржуйская схема,
но без регулятора, могу тиснуть, схема из
стриммера, реверс-технология схемы.

кто знаком с драйвером шины ULN2804a b ULN2004a , какая разници между ними.

Кажется, один для КМОП, другой — для ТТЛ. Схема отличается только номиналом сопротивления от входного штырька до базы транзистора. В одном случае — 10ком (для КМОП), в другом — кажется, 1,5 ком, точно не помню. Ну, и входные уровни соответственно разные. В остальном — одинаково. Я сам года три назад выбирал, какие брать. А использую все же чаще ULN2003 (привычка, чтоли)…

У меня есть движок от древнего лазерного принтера. Двигатель фирмы CANON PM60-H418Z21B можно ли запустить таку вещь? Торчат из него по 3 провода с каждой обмотки. P.S. С шаговиками я делов не имел пока, но очень интересно.

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

Управление шаговым двигателем с помощью Arduino и драйвера A4988

Если вы планируете создать свой собственный 3D-принтер или станок с ЧПУ, вам нужно будет управлять несколькими шаговыми двигателями. Если использовать для этого только Arduino, то большая часть скетча будет занята кодом управления шаговыми двигателями и не останется много места для чего-то еще.

Данную проблему можно решить, использовав специальный автономный драйвер шагового двигателя — A4988.

Модуль A4988 может контролировать как скорость, так и направление вращения биполярного шагового двигателя, такого как NEMA 17, использую всего два вывода контроллера.

Вы знаете, как работают шаговые двигатели?

Шаговые двигатели используют зубчатое колесо и электромагниты (катушки), позволяющие вращать ось по одному шагу за раз.

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

  • Последовательность импульсов определяет направление вращения двигателя.
  • Частота импульсов определяет скорость двигателя.
  • Количество импульсов определяет угол поворота.

Микросхема драйвера шагового двигателя A4988

Модуль собран на чипе A4988. Не смотря на свой малый размер (всего 0,8 ″ × 0,6 ″), но обладает хорошими характеристиками.

Драйвер шагового двигателя A4988 имеет высокую выходную мощность (до 35 В и 2 А) и позволяет управлять одним биполярным шаговым двигателем с выходным током до 2 А на катушку, например NEMA 17.

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

Драйвер предлагает 5 различных разрешений шага, а именно:

  • полный шаг
  • 1/2 шага
  • 1/4 шага
  • 1/8 шага
  • 1/16 шага

Распиновка драйвера A4988

Драйвер A4988 имеет всего 16 контактов, которые связывают его с внешним миром. Распиновка у A4988 следующая:

распиновка модуля A4988

Давайте ознакомимся со всеми контактами по очереди.

Выводы питания

На самом деле A4988 требует подключения двух источников питания.

Подключение питания к A4988

VDD и GND используется для управления внутренней логической схемой. Напряжение питания должно находиться в пределах от 3 до 5,5 В.

Vmot и GND для обеспечения питания шагового двигателя. Тут напряжение в пределах от 8 до 35 В.

Согласно datasheet, для питания двигателя требуется соответствующий разделительный конденсатор рядом с платой, способный выдерживать ток 4 А.

Предупреждение:

Этот драйвер имеет на плате керамические конденсаторы с низким ESR , что делает его уязвимым для скачков напряжения. В некоторых случаях эти выбросы могут превышать 35 В (максимальное номинальное напряжение A4988), и это может потенциально необратимо повредить плату и даже двигатель.

Один из способов защитить драйвер от таких скачков — подключить электролитический конденсатор емкостью 100 мкФ (или как минимум 47 мкФ) к контактам источника питания двигателя.

Выводы выбора микрошага

Драйвер A4988 допускает использование режима микрошага. Это достигается за счет подачи питания на катушки с промежуточными уровнями тока.

Выводы выбора микрошага

Например, если вы решите управлять шаговым двигателем NEMA 17 с шагом 1,8 градуса (200 шагов на оборот) в режиме 1/4 шага, то двигатель будет выдавать 800 микрошагов на оборот.

Драйвер A4988 имеет три вывода селектора размера шага (разрешения), а именно: MS1, MS2 и MS3. Установив соответствующие логические уровни на эти контакты, мы можем настроить двигатели на одно из пяти ступенчатых разрешений.

Выводы выбора микрошага

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

Выводы управления

Драйвер A4988 имеет два управляющих входа, а именно: STEP и DIR.

Выводы управления A4988

STEP — управляет микрошагом мотора. Каждый высокий импульс, отправляемый на этот вывод, приводит двигатель в действие на количество микрошагов, заданное выводами Microstep Selection (MS1, MS2 и MS3). Чем быстрее импульсы, тем быстрее будет вращаться двигатель.

DIR — управляет направлением вращения двигателя. Если на него подать высокий уровень, то двигатель будет вращается по часовой стрелке, а если низкий — против часовой стрелки.

Если вы просто хотите, чтобы двигатель вращался только в одном направлении, то вы можете соединить вывод DIR непосредственно с VCC или GND соответственно.

Выводы STEP и DIR не подтянуты внутренними резисторами, поэтому вы не должны оставлять их не подключенными.

Выводы управления питанием A4988

A4988 имеет три различных вывода для управления состоянием питания, а именно. EN, RST и SLP.

Выводы управления питанием A4988

EN — вывод включения (0)/ выключения (1) драйвера A4988. По умолчанию на этом выводе установлен низкий уровень, поэтому драйвер всегда включен.

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

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

Если вам не нужно использовать вывод RST, вы можете подключить его к соседнему контакту SLP / SLEEP, чтобы вывести его на высокий уровень и включить драйвер.

Выводы для подключения шагового двигателя

Выходные контакты: 1B, 1A, 2A и 2B.

выходные контакты

К этим выводам можно подключить любой биполярный шаговый двигатель с напряжением питания от 8 до 35 В.

Каждый выходной контакт модуля может обеспечить ток до 2 А. Однако величина тока, подаваемого на двигатель, зависит от источника питания системы, системы охлаждения и настройки ограничения тока.

Система охлаждения — радиатор

Чрезмерное рассеивание мощности микросхемы драйвера A4988 приводит к повышению температуры, которая может выйти за пределы возможностей микросхемы, что, вероятно, приведет к ее повреждению.

Даже если микросхема драйвера A4988 имеет максимальный номинальный ток 2 А на катушку, микросхема может подавать только около 1 А на катушку без перегрева.

Для достижения более 1 А на катушку требуется радиатор или другой метод охлаждения.

Система охлаждения - радиатор

Драйвер A4988 обычно поставляется с радиатором. Желательно установить его перед использованием драйвера.

Настройка тока A4988

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

Ограничение тока

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

Для настройки тока шагового двигателя есть два метода:

Способ 1:

В данном случае мы собираемся установить ограничение тока путем измерения напряжения (Vref) на выводе «ref».

  1. Взгляните на техническое описание вашего шагового двигателя. Запишите его номинальный ток. В нашем случае мы используем NEMA 17 200 шагов/об, 12 В 350 мА.
  2. Переведите драйвер в полношаговый режим, оставив три контакта выбора микрошага отключенными.
  3. Удерживайте двигатель в фиксированном положении, не синхронизируя вход STEP.
  4. Во время регулировки измерьте напряжение Vref (один щуп мультиметра на минус питания, а другой к металлическому корпусу потенциометра).
  5. Отрегулируйте напряжение Vref по формуле:

ограничение тока = Vref x 2,5

Например, если ваш двигатель рассчитан на 350mA, вы должны установить опорное напряжение 0,14В.

Ограничение тока - способ 1

Способ 2:

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

  1. Взгляните на техническое описание вашего шагового двигателя. Запишите его номинальный ток. В нашем случае мы используем NEMA 17 200 шагов / оборот, 12 В 350 мА.
  2. Переведите драйвер в полношаговый режим, оставив три контакта выбора микрошага отключенными.
  3. Удерживайте двигатель в фиксированном положении, не синхронизируя вход STEP. Не оставляйте вход STEP висящим в воздухе, подключите его к источнику питания логики (5 В)
  4. Подключите амперметр последовательно с одной из катушек шагового двигателя и измерьте фактический ток.
  5. Возьмите небольшую отвертку и отрегулируйте потенциометр ограничения тока, пока не установите номинальный ток шагового двигателя.

Ограничение тока - способ 2

Подключение драйвера шагового двигателя A4988 к Arduino UNO

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

Подключения довольно простое. Начните с подключения VDD и GND (рядом с VDD) к контактам 5V и минус на Arduino. Входные контакты DIR и STEP подключите к цифровым контактам №2 и №3 на Arduino соответственно. Шаговый двигатель подключите к контактам 2B, 2A, 1A и 1B.

Предупреждение:

Подключение или отключение шагового двигателя при включенном драйвере может привести к его повреждению.

Затем подключите вывод RST к соседнему выводу SLP/SLEEP, чтобы драйвер оставался включенным. Также держите контакты выбора микрошага отключенными, чтобы двигатель работал в полношаговом режиме.

Наконец, подключите источник питания двигателя к контактам VMOT и GND. Не забудьте установить большой развязывающий электролитический конденсатор 100 мкФ на контакты источника питания двигателя, рядом с платой.

Код Arduino — простой пример

Следующий скетч даст вам полное представление о том, как управлять скоростью и направлением вращения биполярного шагового двигателя с помощью драйвера шагового двигателя A4988, и может служить основой для более практических экспериментов и проектов.

Пояснение к скетчу:

Скетч начинается с определения выводов Arduino, к которым подключены выводы STEP и DIR A4988. Мы также определяем stepsPerRevolution. Установите его в соответствии со спецификациями шагового двигателя.

В разделе setup() кода все контакты управления двигателем объявлены как цифровой выход.

В цикле loop() мы медленно вращаем двигатель по часовой стрелке, а затем быстро вращаем его против часовой стрелки с интервалом в секунду.

Управление направлением вращения: для управления направлением вращения двигателя мы устанавливаем вывод DIR в высокое или низкое положение. Сигнал высокого уровня вращает двигатель по часовой стрелке, а низкого — против часовой стрелки.

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

Скетч Arduino — использование библиотеки AccelStepper

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

Итак, для нашего следующего эксперимента мы будем использовать расширенную библиотеку шаговых двигателей под названием AccelStepper library. Она поддерживает:

  • Ускорение и замедление.
  • Одновременное управление несколькими шаговыми двигателями с независимым шагом для каждого двигателя.

Эта библиотека не включена в IDE Arduino, поэтому вам необходимо сначала установить ее.

Установка библиотеки

Чтобы установить библиотеку, перейдите в Эскиз> Include Library> Manage Libraries… Подождите, пока диспетчер библиотек загрузит индекс библиотек и обновит список установленных библиотек.

Установка библиотеки

Отфильтруйте результаты поиска, набрав «Accelstepper». Щелкните первую запись и выберите «Установить».

Скетч Arduino

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

Пояснение к скетчу:

Мы начинаем с подключения недавно установленной библиотеки AccelStepper.

Определяем выводы Arduino, к которым подключаются выводы STEP и DIR A4988. Устанавливаем motorInterfaceType значение 1. (1 означает внешний шаговый драйвер с выводами Step и Direction).

Затем мы создаем экземпляр библиотеки с именем myStepper.

В функции setup() мы сначала устанавливаем максимальную скорость двигателя 1000. Затем мы устанавливаем коэффициент ускорения для двигателя, чтобы добавить ускорение и замедление к движениям шагового двигателя.

Затем мы устанавливаем обычную скорость 200 и количество шагов, например, 200 (поскольку NEMA 17 совершает 200 шагов за оборот).

В функции loop() мы используем оператор If, чтобы проверить, как далеко двигателю нужно проехать (путем чтения distanceToGo), пока он не достигнет целевой позиции (moveTo). Как только distanceToGo станет равен нулю мы переключаем двигатель в противоположное направление, изменив moveTo на противоположное значение относительно его текущего положения.

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

Плавность хода, шум и момент шагового двигателя при управлении микроконтроллером

Далее опишу алгоритм управления ШД с помощью микроконтроллера.

Перед тем, как начать описывать задачу, я изложу основы управления ШД, которые будут включать необходимый минимум для рассмотрения, описанных в статье способов управления.

Рассмотрим необходимый минимум основ управления ШД , необходимый для понимания принципа управления, описанного ниже. А именно:

Способы подключения обмоток, необходимые для осуществления данного режима работы. Полношаговый режим управления при задействовании на один шаг двух фаз.

Изменение полярности обмотки с помощью Н-моста.

Принципиальная электрическая схема, включающая в себя 4 драйвера полумоста и 2 Н-моста.

Способ модуляции синусоидального сигнала с помощью широтно-импульсной модуляции (далее просто ШИМ).

ШД имеют 4,5,6 или 8 выводов обмоток. При подключении к модулю управления ШД в каждом конкретном случае необходимо задействовать определенные выводы. В четырех выводном ШД задействуются все четыре вывода. Пяти выводной ШД не подходит для метода управления, описываемого в этой статье. В шести выводном не задействуются выводы нейтральных точек. В восьми выводном ШД обмотки соединены последовательно (см. рис. 1). Конечно можно задействовать все выводы обмоток, но эти методы управления выходят за рамки статьи.

Рис.1

Рис.1

Описание полношагового режима управления.

Для управления ШД необходимо подавать определенную последовательность сигналов на обмотки ШД . По сути создавая статором бегущую волну, заставляющую синхронно вращаться поле статора и ротора ШД . На рис. 2 над диаграммой схематично показан статор с обмотками. Цвет обмоток указывает на их полярность. В центре находится ротор в виде магнита. Если обратить внимание на диаграмму, то будет видно, что в середине каждого шага идет поочередное изменение полярности обмоток. В след за изменяющимся полем статора, вращается ротор по часовой стрелке. Для изменения вращения двигателя можно поменять местами выводы одной обмотки, и ротор начнет вращаться в противоположную сторону. Но зачем менять подключение обмоток, если можно программным путем поменять местами подаваемые сигналы, что и сделано с А+ и А- на рис.2. При этом ротор также начнет вращаться в противоположную сторону. Для большей наглядности сигнал на диаграмме имеет прямоугольную форму. Далее в статье прямоугольный сигнал будет заменен на сигнал ШИМ, модулирующий синусоиду.

Рис.2

Рис.2

Изменить полярность обмотки можно с помощью Н-транзисторного моста (см. рис. 3). В первом варианте из 4 транзисторов открыты Т1,Т4. Ток, соответственно, течет через них. Поменять полярность можно, открыв транзисторы Т2 ,Т3 и при этом закрыв Т1 И Т4. Таким образом, ток через обмотку потечет в противоположную сторону.

Рис.3

Рис.3

Для управления ШД используют два Н моста чаще всего на основе восьми N-канальных MOSFET транзисторов. Для управления транзисторами используются мостовые или полумостовые драйверы. Напряжение на затворе зачастую должно быть выше напряжения истока транзистора на 5-15В. Для MOSFET транзисторов это делают драйверы.

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

Механизм встроенного временного промежутка Dead-Time обеспечивает гарантированное закрытие одного силового ключа до момента начала открытия ключа в противоположном плече. Гарантией надежного закрытия противоположного транзистора является встроенная схема, контролирующая состояние ключей и наличие схемы задержки, формирующей промежуток времени, в течение которого закрыты оба транзистора в плечах полумоста.

На рис.4 приведена принципиальная электрическая схема управления ШД, включающая в себя 4 драйвера полумоста IR2104S и 2 Н-моста на основе транзисторов IRF7836. При подаче 0 В на вход SD драйвера IR2104s драйвер переходит в неактивное состояние.

На приведенной схеме сигнал с диаграмм можно подавать на 4 входа. Так на ШИМ1 А+, на ШИМ2 А-, на ШИМ3 В+, на ШИМ4 В- соответственно (Рис.4).

Рис.4

Рис.4

Ниже кратко опишу принцип работы ШИМ, расчет и модулирование синусоиды.

ШИМ или PWM (широтно-импульсная модуляция или pulse-width modulation) – это способ изменения мощности, подаваемой на нагрузку. Управление заключается в изменении ширины импульса постоянной амплитуды, следующих через равные интервалы времени.

На рис.5 видно, как регулируется мощность. Так 20%, 40%, 80%, 100% это время, когда транзистор открыт относительно времени периода. Соответственно среднее напряжение будет приблизительно равно 20%, 40%, 80%, 100% от максимального.

Рис.5

Рис.5

Меняя ширину импульса, можно модулировать различную форму сигнала. Так, по синусоидальному закону, при котором ширина импульсов изменяется следующим образом (рис. 6), максимальна в середине шага, а к началу и концу шага уменьшается. Синусоиду можно увидеть на осциллографе, пропустив ШИМ-сигнал с контроллера через RC фильтр. Для RC фильтра использовал конденсатор 2.2 нФ и резистор 1.5кОм.

На рис. 6 показан пример модуляции одного синусоидального шага, состоящего всего из 4 уровней напряжения. Напряжение питания 12В.

Рис.6

Рис.6

Для формирования модулированного сигнала необходимо рассчитать уровни ШИМ и их количество на один шаг. На рис.7 приведено два примера одного синусоидального шага с разным количеством ШИМ уровней, где ШИМ можно изменять в пределах от 0 до 255, что соответствует напряжению от 0 до 100%. Как видно на рис.7, чем больше уровней ШИМ, тем больше форма модулированного сигнала будет повторять синусоиду. Каждое изменение ШИМ происходит по прерыванию таймера в микроконтроллере. Меняя время срабатывания прерывания, можно регулировать время одного шага соответственно и скорость двигателя.

Рис.7

Рис.7

Формулу для расчета ШИМ уровней можно получить из формулы мгновенных значений синусоидальных функции. U = Um*sin(ω*t + Ψ)

Рис.8

Рис.8

Um — амплитудное значение ω — угловая частота Ψ — начальный фаза, значение фазы в начальный момент t=0 аргумент ω*t + Ψ – называют фазой синусоидальной функции

Для расчета Ψ = 0

Синусоида от 0 до Т/4 повторяет форму половины шага, а от T/4 до Т/2 зеркально отображает вторую половину шага. Поэтому для расчета достаточно взять участок от 0 до Т/4 или от 0° до 90°. ωt – для удобства можно заменить на угол α = 0° до 90°. Um заменим на максимальное значение ШИМ_max в примере 255. U заменим на ШИМ_N. Получается ШИМ_N = ШИМ_maxSIN(α). Количество вычислений уровней ШИМ зависит от величины точности к примеру 16 с шагом угла 90°/16 = 5,625°

Значения ШИМ необходимо округлять, так как оно может быть только целым.

Вычислив уровни ШИМ, можно модулировать синусоиду. Для этого я занес значения уровней в массив по прерыванию от таймера, поочередно подставляя значения от ШИМ_0 до ШИМ_16 в ШИМ контроллера. Так модулируется половина шага. Для модуляции второй половины нужно наоборот подставлять значения от ШИМ_16 до ШИМ_0.

Так модулируется один шаг. Меняя время срабатывания таймера можно менять время шага. Теперь такие синусоидальные шаги можно подавать, заменив прямоугольные шаги на диаграммах (рис.2).

Для удобства я написал небольшую программу для расчета значений ШИМ . Где PWM_MAX присваивается максимальное значение ШИМ, которое настраивается в микроконтроллере, а sampling присваивается количество уровней ШИМ на половину шага. Так как большинство программируют МК на языке С, данную программу я решил написать на этом же языке.

0 25 50 74 98 120 142 162 180 197 212 225 236 244 250 254 255

На этом необходимый минимум основ управления ШД завершается. Далее будет описана поставленная задача, возникшие трудности и их решение.

Задача: Двигатель должен вращать массу около 7кг за 0,7 — 1 секунду на 90°. Угол поворота отслеживает 10 разрядный или 1024 битный абсолютный энкодер AS5040 закрепленный на валу механизма. При достижении 90° необходимо включить режим удержание ШД. При этом необходимо учитывать воздействие руки человека, толкающей механизм по направлению движения или против, либо удерживающей вплоть до остановки. При этом напряжение питания блока управления ограничено двенадцатью вольтами, а габариты двигателя ограничены по ширине 100мм, а по длине 110мм, включая длину вала. В наличии было три двигателя подходящих габаритов.

Осовные характеристики двигателей:

двигатель №1 Рабочий ток 3,1 А. Активное сопротивление обмотки 1,5 Ом Индуктивность обмотки 3,5 мГн. Момент удержания 0,3 кг*м Величина полного шага 1,8° (200 шагов на один оборот ротора).

двигатель №2 Рабочий ток 4А. Активное сопротивление обмотки 0,8 Ом. Индуктивность обмотки 3,1 мГн. Момент удержания 0,45 кг*м. Величина полного шага 1,8° (200 шагов на один оборот ротора).

двигатель №3 не соответствовал характеристикам, заявленным производителем. Производитель утверждал, что он является аналогом двигателя №2. При замере активного сопротивления обмоток выяснилось, что сопротивление не соответствовало заявленным 0,8 Ом, а составляло всего 0,2 Ом. Следовательно, рабочий ток и индуктивность тоже отличались.

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

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

Проблема №1. Свист двигателя. При уменьшении тока на блоках управления шум становился меньше, двигатель более плавно вращает ротор, и всё-таки шум и плавность вращения оставляли желать лучшего. При увеличении дробления шага на блоках управления до 1/16 шум уменьшился, и плавность хода увеличилась, но эти улучшения были незначительны. Дальнейшее повышение дробления вплоть до 1/512 не привело к улучшению показателей.

Решение проблемы №1. Решил сделать свой драйвер управления ШД на основе микроконтроллера PIC18F2331. Он заточен под управление двигателями. Было задействовано 4 канала широтно-импульсной модуляции для управления 4 драйверами полумоста.

Я начал эксперименты с формой сигнала, модулируемого с помощью ШИМ. Подавал треугольный, прямоугольный, трапециевидный сигналы на обмотки двигателя. Результаты: неутешительные показатели по шуму, вибрации и плавности хода были значительно хуже по сравнению с готовыми блоками управления. Подавая на обмотки двигателя синусоидальный сигнал, плавность хода, начиная от 5 об/мин и выше, стала практически незаметной на глаз. Детали механизма не гремели, но если скорость была ниже 5 об/мин, детали гремели, механизм передвигался рывками, ток потребляемый двигателем рос и выходил за пределы рабочего тока двигателя. Что касается шума, даже при скорости выше 5 об/мин был неприятный шум. Свист похожий на звук, издаваемый зарядными устройствами для телефонов ноутбуков, только гораздо сильнее. Такой же шум я слышал от асинхронных двигателей, управляемых частотными преобразователями. Изучив работу частотных преобразователей, стало ясно, что свист зависит от частоты ШИМ. У меня частота ШИМ составляла 4кГц. При изменении частоты свист менялся, и когда я поднял частоту до 20кГц, шум полностью пропал. Слух человека в большинстве случаев не воспринимает частоту выше 20кГц.Так была решена проблема №1.

Проблема №2. Двигатель ниже 5 об/мин двигается рывками, а ток сильно возрастает, так как у драйвера нет обратной связи по току, соответственно и контроля по перегрузке тоже нет.

Решение проблемы №2. Когда напряжение питания драйвера с 12V снизил до 9V, рывки при передвижении механизма тоже стали меньше, но всё равно недостаточно плавно. Тогда напряжение выставил 12V, а амплитуду ШИМ синусоиды начал уменьшать, и при 20% амплитуды от максимума движение было плавным и тихим.

Проблема №3. Если запустить двигатель сразу на большой скорости без разгона, то момент на валу двигателя будет недостаточным для вращения механизма. Начнется пропуск шагов, сопровождаемый сильным шумом, который распространяется по всему корпусу механизма. Звук напоминал ведро с болтами, которое трясут изо всех сил. Так как необходимо было провернуть механизм на 90° за 0,7 — 1 сек., я решил, что до 45° буду линейно ускоряться, а с 45° до 90° линейно замедляться. Достигнуть даже приближённо времени в 1сек не удалось. Еще было замечено при старте, что первый шаг периодически сопровождался рывком ротора. Это связанно с тем, что зубцы ротора могут находиться не на оси включенной обмотки статора. В следствие чего зубцы ротора стремительно притянутся к обмотке, произойдёт фиксация ротора, сопровождающаяся звуком, похожим на удар. Все последующие шаги будут плавными.

Решение проблемы №3 . Рассматривая график зависимость оборотов двигателя и момента, я заметил, что момент при малых оборотах высокий, а с увеличением оборотов нелинейно падает, и чем меньше напряжение питания, тем хуже зависимость.

Для примера покажу график Рис.9. Взятый из даташита.

На двигатель FL86STH156-6204 ток фазы 6,0 А. Максимальный постоянный ток потребления от источника питания 3,8 А для блока SMD-9.0 Блоки управления SMD-9.0 (напряжение 72В) и SMD-82 (напряжение 220В) Дробление шага ½, источник питания 72 В, 300 Вт.

Рис.9

Рис.9

Чем больше напряжение подается на обмотки ШД, тем быстрее идет нарастание тока в них. Соответственно зависимость момента от скорости улучшается.

В моем случае питание 12В и диапазон допустимых скоростей невысок, так как момент стремительно падает с увеличением скорости.

Так как при равномерном ускорении не удавалось разогнать механизм. Я решил разделить ускорение на три диапазона. Первый при скорости ниже 5 об/мин ускорение максимально, так как момент максимально высокий. Второй диапазон от 5 до 7 об/мин ускорение уже в три раза меньше и последний третий диапазон от 7 об/мин и выше, ускорение в десять раз меньше относительно первого диапазона. Таким образом двигатель набирал максимально быстро скорость в начале пути и укладывался в 1с. Нелинейно разгоняя двигатель, можно значительно сократить время разгона ШД. Замедление механизма проходило в обратном порядке. Так как сохраненной осциллограммы сигнала, подаваемого на драйверы полумостов, у меня не осталось, я нарисовал, как, примерно, должна выглядеть осциллограмма.

Рис.10

Рис.10

При старте, первый шаг периодически сопровождался рывком ротора. Удар можно убрать, путем снижения амплитуды первой половины шага (в моем случае 20% от максимума) и значительно увеличив время первой половины шага по сравнению с другими шагами. Как видно на рис.10, первые половины шагов более вытянуты, чем правые. Это связанно с ускорением. Форма синусоиды искажается, но при этом двигатель работает достаточно плавно и тихо. Как видно на рис.10, ускорение максимально, это заметно по сужению шагов в начале движения. Когда момент максимален, а по мере приближения к максимальной скорости ускорение значительно меньше от изначального. Все диапазоны ускорений подбирались экспериментальным путем. Как регулировать амплитуду и ускорение я описал ранее в этой статье.

Проблема №4. Учет воздействия руки на механизм, если не учитывать воздействие руки, то можно было обойтись парой индуктивных датчиков или оптических датчиков для отслеживания крайних положений и направления вращения. А если учитывать воздействие руки, то без датчика угла поворота (абсолютного энкодера) не обойтись. Если механизм находится в движении, а рука хватает его и удерживает на месте, начинается пропуск шагов и сильный шум. По датчику будет видно, что вал колеблется на месте, и двигатель необходимо отключить и попытаться стартовать через заданный промежуток времени. Эта задача легко решаема. Если рука потянула механизм против направления, по датчику можно легко понять, что механизм вращается в противоположную сторону, и тоже отключить двигатель. И совсем другое дело, воздействие на механизм с увеличением скорости перемещения больше заданной изначально или наоборот притормаживание. Логично было измерять скорость перемещения и подстраиваться, чтобы скорость двигателя совпадала с движением руки, но оказалось, что 10 разрядный датчик as5040 не позволял этого сделать. Предположим, что нужно отслеживать перемещение каждые 1,05° .Так как 10 разрядов это 1024 бита, то вычисляем точность 360°/1024 = 0,35°, количество градусов на один бит возьмём 0,35°3 = 1,05°. Зная время, за которое двигатель проходит 1,05°, можно вычислить скорость. Но не все так просто. У датчика есть погрешность — биение младшего бита, то есть погрешность в один бит, а при измерении скорости нужно сделать два замера пройденного пути. В начале и в конце соответственно погрешность удваивается и составляет 0,35°2=0,7°. Измерить скорость каждые 1,05° невозможно. Логично измерять, например, каждые 0,35°*15=5,25°. Уже можно оценить скорость, но 5,25° это слишком большой угол, двигатель успеет пройти почти 3 шага или более точно 5,25°/1,8°= 2,92.

Решение проблемы №4. Целесообразно для измерения скорости использовать 12 разрядный датчик это 4096 бит. Точность измерения увеличится в четыре раза, что позволит точно подбирать скорость движения механизма под скорость движения руки.

Так была решена последняя проблема.

Думаю, эта статья принесет практическую пользу и поможет читателю лучше понять принципы управления шаговым двигателем.

Читать:
Viper22a схема включения как работает

Похожие публикации