Драйвер биполярных шаговых двигателей

Модуль управления биполярным («двухфазным») шаговым двигателем БУШД-01N.04-02

Продолжаю цикл заметок «проекты-малыши» В данной заметке будет рассмотрена одна из возможных реализаций модуля управления биполярным («двухфазным») шаговым двигателем (ШД) на базе связки микросхем L297/1 и L298N:

По весне зашел ко мне один мой хороший товарищ.

У товарища появилась идея – сделать себе сверлильно/гравировально/фрезерный станок. Он практически всё уж́е нашел – и движки, и сверла/фрезы, и даже подходящую станину для станка. Не хватало только узлов для управления ШД.

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

Поскольку движки он нашел биполярные (с четырьмя провод́ами на «выходе»), для управления ШД предполагалось использовать широко распространенную микросхему L298N (ну и L297 – в качестве контроллера).

И на мой робкий вопрос («А на хера городить что-то новое, когда в Интернете навалом готовых решений по теме, а лучше вообще соорудить схему с МК») последовал не менее робкий ответ: «Хочется сделать так, как мне надо, а искать соответствующую реализацию – с ума сойдешь, да и не факт, что найдешь».

Ну а поскольку товарищ действительно хороший – решил-таки пойти у него на поводу и развести плату под именно его н́ужды. В результате родилась такая вот схема:

Как видно, схема практически полностью передрана с документации (ага, документации – привет treasure, я помню твои нарекания:) ) на L297/L298.

Не вижу особого смысла подробно описывать здесь принципы работы данной связки, так как этой теме посвящена далеко не одна HTML-страница (про виды ШД и принципы управления ими также есть хорошая статья (хорошая статья также приаттачена к заметке)). Однако, в общих чертах, всё-таки поясню.

Есть мнение, что микросхемы L297 и L298 были разработаны именно для работы в связке. И именно этим объясняется нехуевый такой их коммерческий успех.

Данный успех косвенно подтверждается тем, что L297 и L298 до сих пор нормально продаются (инфа от пламенных тружеников радиорынка), несмотря на то, что даже убогая связка ATMega48 с кнопками, транзисторами и соответствующей логикой раза в два дешевле, чем L297+L298, а функций в мегу можно натолкать на порядок больше. Судите сами – достаточно соединить в соответствии с документацией чипы L297 и L298 – и вот драйвер для биполярного ШД готов, безо всяких прошивок. Согласитесь, это довольно лакомая тема для тех, кто с кирпичами дела не имеет, а шаговые движки крутить хочет. Да и вообще – многий софт для станков-поделок заточен именно под L297.

Суть сей связки – собираем драйвер в соответствии с документацией и получаем возможность:

— крутить биполярные движки (до 46В и 2А на фазу, что по прошлым временам весьма и весьма неплохо); — устанавливать скорость кручения; — устанавливать направление кручения; — устанавливать максимальный ток обмотки ШД; — устанавливать различные режимы вращения ШД. Повторю, что для этого не надо никаких программаторов, чтобы прошить какой-либо МК – все функции управления наглухо встроены в L297. А чип L298 – и вовсе безмозглый, это просто драйвер, позволяющий преобразовывать слаботочные логические сигналы (0В/5В) от LM297 в сигналы/цепи управления непосредственно обмотками двигателя (46В/2А). Как видно из стандартной схемы, по линиям A, B, C, D, INH1 и INH2 микросхема L297 управляет ШД, по линиям SENSE_1 и SENSE_2 – считывает ток обмотки двигателя. На остальные выводы L297 подаются питание и управляющие TTL-сигналы. В данной реализации задействованы следующие линии управления работы драйвером: — CLOCK (CLK, pin 18): по этой линии передается тактовая частота вращения ротора двигателя; — CW/CCW (DIR, pin 17): по этой линии задается направление вращения ротора ШД (условно – при лог. «1», присутствующей на данном входе, ротор ШД будет вращаться по часовой стрелке, при лог. «0» — против часовой стрелки. Условно – потому, что направление вращения еще и напрямую зависит от того, как именно подключены к L298 обмотки ШД); — Vref (pin 15): по этой линии осуществляется управление максимальным током обмотки ШД. Если напряжение на токосчитывающих резисторах R15 и R16 превысит напряжение на входе Vref, соответствующая обмотка отключается до того момента, пока напряжение на R15/R16 не станет меньше Vref; — HALF/FULL (H/F, pin 19): по этой линии осуществляется выбор между полношаговым и полушаговым режимами вращения ротора ШД. Если на этом входе логический нуль – выбран полношаговый режим работы, если единица – полушаговый; — CONTROL (CTRL, pin 11): по этой линии можно выбрать группу сигналов управления ШД, которые будут промодулированы («изрезаны») сигналом от внутренних «токовых» компараторов (это которые осуществляют контроль тока обмотки). Если на данной линии логический нуль – модулируются сигналы INH1 и INH2, если единица – сигналы A, B, C, D. Всё вышесказанное – вещи довольно стандартные, не один раз описанные, и вопросов тут вроде как не должно возникать. Однако, в приведенной схеме есть и пара «нововведений». Во-первых, сигналы тактовой частот́ы и выбора направления вращения ротора ШД подаются через оптроны, а это какая-никакая, а всё-таки гальваноразвязка. Во-вторых, в схему добавлены две оптопары для подключения концевых выключателей. То есть получается, что модуль управления двигателем вообще не связан гальванически с управляющим контроллером (не с LM297, а с, допустим, МК, который управляет L297). В-третьих, контроллер L297 питается от встроенного в модуль линейного стабилизатора на +5.0В, так что отдельной линии питания от пользователя не требует (правда, жрет он на пяти вольтах до 80мА на холостом ходу – об этом надо помнить). Ну и самое главное, с точки зрения товарища: джампер «DIVIDER» и элементы, с ним связанные. Здесь, наверное, надо остановиться поподробнее. Если замкнуты контакты 2 и 3 джампера «DIVIDER», то схема работает в «обычном» режиме: цепочка R2+VD1 отключена и максимальный ток обмотки определяется только тем, в каком положении находится движок подстроечного резистора R5. А вот если замкнуть контакты 1 и 2 джампера «DIVIDER», тогда происходит следующее. Если на входе CLK присутствует логическая единица, то за счет диода VD1 резистор R2 оказывается отключен от R5, и максимальный ток обмотки по-прежнему определяется только подстроечным резистором. А когда на входе CLK присутствует логический нуль, вот тогда резистор R2 оказывается через диод VD1 посаженным на «массу», а это означает, что R2 шунтирует R5. Из-за этого напряжение на входе Vref уменьшается (на сколько – зависит от номиналов R2, R12 и типа диода VD1, при указанных на схеме номиналах напряжение на R5 уменьшится примерно в два раза), что влечет за собой уменьшение максимального тока обмотки. Идею эту товарищ у кого-то украл (у кого именно – не помнит), а использовать ее решил для автоматического уменьшения тока удержания обмотки в те моменты времени, когда движок не крутится. Питание на схему подается через точки подключения 1 и 2 («плюс» и «масса» соответственно). Поскольку L297 питается от встроенного стабилизатора L7805, то диапазон напряжений питания составляет +7,5В…+30,0В. Еще раз напомню – L297 жрет неплохой ток, поэтому при напряжении питания более +12,0В на стабилизатор лучше повесить радиатор. Шаговый двигатель подключается к точкам 3-6. На плате точки 1-6 расположены таким образом, что для подачи питания и подключения ШД можно использовать обычные клеммники с шагом выводов, равным 5,0мм. Концевые выключатели подключаются к разъему XP2 («LIMIT»). Ну а разъем XP1 («CONTROL») служит для связи модуля управления ШД и, например, микроконтроллера. Через этот разъем подается тактовая частота, сигнал выбора направления вращения ротора ШД, а также снимаются сигналы от концевых выключателей. Под указанную схему была немедленно разведена и изготовлена печатная плата:Как видно, плата получилась односторонняя, и разведена под дырочные элементы ([поправляет очки] под радиокомпоненты для установки и монтажа в отверстия), ибо место позволяло, а начинающим так будет проще. SMD-элемент ровно один – конденсатор C12. Помимо деталей, указанных на схеме, присутствуют также 4 проволочные перемычки J1-J4 (две по 20,32мм и две по 7,62мм). Под оптронами по идее должна быть профрезерована щель (это там, где «маска» отсутствует) для обеспечения «настоящей» гальваноразвязки. Однако, товарищ распорядился щель не делать, поскольку огромной разности потенциалов между модулем и управляющим контроллером у него заведомо не будет. Ну и габаритные размеры платы вкупе с элементами коммутации и управления:На сегодня всё. Желаю удачи при работе с шаговыми двигателями! Содержание архива:

BUSHD-01N.04-02_Hardware.zip:

БУШД-01N.04-02.pdf – схема, плата в неизвестном масштабе и габаритные размеры модуля; БУШД-01N.04-02_ФР.lay – плата, вариант для «шаблонщиков»; БУШД-01N.04-02_ЛУТ.lay – плата, вариант для «утюжников».

Платы нарисованы в Sprint Layout 5.0 (бесплатная гляделка).

Источник: http://we.easyelectronics.ru/podkassetnik/modul-upravleniya-bipolyarnym-dvuhfaznym-shagovym-dvigatelem-bushd-01n04-02.html

Управление биполярным шаговым двигателем. Часть 1. Теория. Схема с контроллером PIC12F629 и драйвером LB1838

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

Соответственно, с их помощью можно повернуть вал и на определённое число оборотов, потому что N оборотов — это тоже определённый угол, равный 360*N, и, в том числе, на нецелое число оборотов, например на 0.75 оборота, 2.5 оборота, на 3.7 оборота и т.д.

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

Естественно такие возможности не могли обойти стороной и радиолюбители. Они с успехом используют шаговики в конструкциях самодельных роботов, самодельных станков с ЧПУ и т.д. Ниже описаны результаты моих опытов с шаговым двигателем, надеюсь, что кому-то это может оказаться полезным.

Итак, что нам понадобится для экспериментов. Во-первых, шаговый двигатель. Я брал 5-ти вольтовый китайский биполярный шаговик с загадочным названием, выдранный из старого 3,5″ дисковода, аналог M20SP-GW15. Во-вторых, поскольку обмотки двигателя потребляют значительный ток (в данном случае до 300 мА), то вполне понятно, что подключить шаговик к контроллеру напрямую не удастся, нужен драйвер.

В качестве драйвера для биполярных шаговых двигателей обычно используют схему так называемого H-моста или специальную микросхему (в которой всё равно встроен H-мост).

Можно конечно ваять самому, но я взял готовую микруху (LB1838) из того же старого дисковода.

Собственно, кроме всего вышеописанного, для наших экспериментов также понадобятся: PIC-контроллер (был взят PIC12F629, как самый дешёвый) и пара кнопок.

Перед тем, как перейти непосредственно к схеме, давайте немного разберёмся с теорией.

Биполярный шаговый двигатель имеет две обмотки и, соответственно, подключается по четырём проводам. Найти концы обмоток можно простой прозвонкой — концы проводов, относящиеся к одной обмотке, будут между собой звониться, а концы, относящиеся к разным обмоткам, — нет. Концы первой обмотки обозначим буквами “a”, “b”, а концы второй обмотки буквами “c”, “d”.

На рассматриваемом экземпляре есть цифровая маркировка контактов возле мотора и цветовая маркировка проводов (бог его знает, может это тоже какой-то стандарт): 1 — красный, 2 — голубой — первая обмотка; 3 — жёлтый, 4 — белый — вторая обмотка.

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

За один полный цикл двигатель делает четыре шага.

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

То есть, например, после второй комбинации (когда мы подали + на вывод “c” и минус на вывод “d”) мы можем подать либо третью комбинацию (отключить вторую обмотку, а на первой подать — на “a” и + на “b”), тогда двигатель повернётся на один шаг вперёд, либо первую комбинацию (двигатель повернётся на один шаг назад).

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

То есть, допустим мы повернули двигатель на 5 шагов вперёд, подавая на него комбинации 2-3-4-1-2, потом обесточили, а потом захотели повернуть ещё на один шаг вперёд.

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

И так далее в таком же духе.

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

На этом мы закончим с двигателем и перейдём к драйверу LB1838.

У этой микрухи есть четыре управляющие ноги (IN1, IN2, EN1, EN2), на которые мы как раз и будем подавать сигналы с контроллера, и четыре выходных ноги (Out1, Out2, Out3, Out4), к которым подключаются обмотки двигателя. Обмотки подключаются следующим образом: провод “a” подключается к Out1, провод “b” — к Out2, провод “c” — к Out3, провод “d” — к Out4.

Ниже представлена таблица истинности для микросхемы драйвера (состояние выходов в зависимости от состояния входов):

IN1 EN1 Out1 (a) Out2(b) IN2 EN2 Out3(c) Out4(d)
Low High + Low High +
High High + High High +
X Low откл откл X Low откл откл

Теперь давайте нарисуем на диаграмме, какую форму должны иметь сигналы IN1, EN1, IN2, EN2 для одного полного цикла вращения (4 шага), т.е. чтобы на выходах появились последовательно все 4 комбинации подключения обмоток:

Если присмотреться к этой диаграмме (слева), то становится очевидно, что сигналы IN1 и IN2 можно сделать абсолютно одинаковыми, то есть на обе этих ноги можно подавать один и тот же сигнал. В этом случае наша диаграмма будет выглядеть так:

Итак, на последней диаграмме нарисовано, какие комбинации уровней сигналов должны быть на управляющих входах драйвера (EN1, EN2, IN1, IN2) для того, чтобы получить соответствующие комбинации подключения обмоток двигателя, а также стрелками указан порядок смены этих комбинаций для обеспечения вращения в нужную сторону.

Вот в общем-то и вся теория. Необходимые комбинации уровней на управляющих входах формируются контроллером (мы будем использовать PIC12F629).

Схема:

Элементы:R1..R2 = 1 кОм. Когда соответствующая кнопка не нажата — резистор подтягивает напряжение на входе контроллера к +5 В (высокий уровень). При нажатии на кнопку напряжение на входе подтягивается к земле (низкий уровень).С1, С2 = 0,1 мкФ — керамические конденсаторы.С3 = 470 мкФ х 16В — электролитический конденсатор.

Готовый девайс:

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

Простейшая программа управления (.asm + .hex)

Скачать плату в формате DipTrace 2.0

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

продолжение (для драйвера L293D)…

Источник: http://radiohlam.ru/?p=1003

Шаговые двигатели: особенности и практические схемы управления. Часть 2

Журнал РАДИОЛОЦМАН, февраль 2015

Владимир Рентюк, Запорожье, Украина

Часть 1.

Часть 2. Схемотехника систем управления

Выше были рассмотрены наиболее важные общие вопросы использования шаговых двигателей, которые помогут в их освоении. Но, как гласит наша любимая украинская поговорка: «Не повірю поки не провірю» («Не поверю, пока не проверю»). Поэтому перейдем к практической стороне вопроса.

Как уже отмечалось, шаговые двигатели – это удовольствие не из дешевых.

Но они имеются в старых принтерах, считывателях гибких и лазерных дисков, например, SPM-20 (шаговый двигатель для позиционирования головки в дисководах 5″25 Mitsumi) или EM-483 (от принтера Epson Stylus C86), которые можно найти у себя в старом хламе или купить за копейки на радиобазаре. Примеры таких двигателей представлены на Рисунке 8.

а) б)
Рисунок 8. Шаговые двигатели, используемые в устаревшей компьютерной технике. а) Шаговый двигатель SPM-20 для позиционирования головки вдисководах 5″25 Mitsumi. (Фото с сайта).б) Шаговый двигатель EM-483 от принтера Epson Stylus C86. (Фото с сайта).

Наиболее простыми для начального освоения являются униполярные двигатели. Причина кроется в простоте и дешевизне их драйвера управления обмотками. На Рисунке 9 приведена практическая схема драйвера, использованного автором статьи для униполярного шагового двигателя серии P542-M48 [6].

Рисунок 9. Драйвер униполярного шагового двигателя. (Дополнительнаяинформация по подключению на Рисунках 10 и 12).

Естественно, что выбор типа транзистора для ключей управления обмотками должен происходить с учетом максимального тока коммутации, а его подключение учитывать необходимость заряда/разряда емкости затвора. В ряде случаев прямое соединение MOSFET с ИМС коммутатора может быть недопустимым. Как правило, в затворах устанавливаются последовательно включенные резисторы небольших номиналов.

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

Для рассматриваемого двигателя с рабочим током обмоток I = 230 мА ток управления по базе ключа должен составить, по крайней мере, 15 мА (хотя для нормальной работы ключа необходимо, чтобы ток базы равнялся 1/10 рабочего, то есть 23 мА). Но такой ток от микросхем серии 74HCхх забрать невозможно, поэтому потребуются дополнительные драйверы.

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

С точки зрения автора статьи, самым оптимальным для управления коммутацией обмоток двигателей небольшой мощности является использование подходящих по току и сопротивлению открытого канала RDC(ON) MOSFET, но с учетом рекомендаций, описанных выше. Мощность, рассеиваемая на ключах для выбранного в качестве примера двигателя серии P542-M48, при полной остановке ротора не превысит

PVT = RDC(ON) × I2 = 0.25 × (0.230)2 = 13.2 мВт.

Транзисторы IRLML2803 с RDC(ON) = 0.25 Ом имеют допустимую мощность рассеяния 540 мВ и постоянный ток стока 0.93 А при температуре 70 °С. Так что, они полностью соответствуют требованиям и обеспечат надежную работу драйвера.

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

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

Еще одним важным моментов является правильный выбор так называемых снаберных диодов, шунтирующих обмотку двигателя (VD1…VD4 на Рисунке 9).

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

Обратите внимание, что в мощные MOSFET такие диоды, как правило, уже встроены.

Режим управления двигателем задается коммутатором. Как уже было отмечено выше, наиболее удобным и эффективным является управление с перекрытием фаз (Рисунок 4б). Такой режим легко реализуется при помощи триггеров.

Практическая схема универсального коммутатора, который использовал автор статьи как в ряде отладочных модулей (в том числе, и с приведенным выше драйвером), так и для практических применений, приведена на Рисунке 10.

Рисунок 10. Схема универсального коммутатора шагового двигателя (с реверсом).

Схема на Рисунке 10 пригодна для любых типов двигателей (униполярных и биполярных).

Частота вращения двигателя задается внешним тактовым генератором (скважность любая), сигнал с которого подается на вход «ШАГИ», а направление вращения устанавливается через вход «НАПРАВЛЕНИЕ».

Оба сигнала имеют логические уровни и, если для их формирования используются выходы с открытым коллектором, то потребуются соответствующие резисторы подтяжки (на Рисунке 10 они не показаны). Временная диаграмма работы коммутатора приведена на Рисунке 11.

Рисунок 11. Временная диаграмма универсального коммутатора с реверсом. Верхние две осциллограммы – Q1 D2-2, Q2 D2-2; нижние две – Q1 D2-1, Q2 D2-1.Маркеры показывают область изменения очередности включения фаз.

Хочу обратить внимание читателей: в Интернете вы могли встретить похожую схему, выполненную не на D-триггерах, а на JK-триггерах. Будьте внимательны! В ряде этих схем допущена ошибка в подключении ИМС.

Если нет необходимости в реверсе, то схема коммутатора может быть значительно упрощена (см.

Рисунок 12), при этом частота вращения останется неизменной, а диаграмма управления будет аналогичной той, которая приведена на Рисунке 11 (осциллограммы до переключения очередности фаз).

Рисунок 12. Упрощенная схема коммутатора шаговогодвигателя (без реверса).

Поскольку особых требований к сигналу «ШАГИ» не предъявляется, для его формирования может использоваться любой подходящий по уровням выходного сигнала генератор. Для своих отладочных модулей автор использовал генератор на базе ИМС таймера 555 (Рисунок 13).

Рисунок 13. Регулируемый генератор импульсов длякоммутатора шагового двигателя.

Для питания собственно двигателя можно использовать схему, приведенную на Рисунке 14, а схему коммутатора и генератора питать или от отдельного источника питания +5 В или через дополнительный маломощный стабилизатор. Земли силовой и сигнальной частей в любом случае необходимо разделить.

Рисунок 14. Схема питания шагового двигателя с режимамиудержания и выключения.

Схема на Рисунке 14 обеспечивает подачу двух стабильных по уровню напряжений для питания обмоток двигателя: 12 В в рабочем режиме и 6 В в режиме удержания. (Формулы, необходимые для расчета выходного напряжения, приведены в [8]).

Рабочий режим включается подачей высокого логического уровня на контакт «ТОРМОЗ» разъема Х1. Допустимость снижения напряжения питания определяется тем, что, как уже отмечалось в первой части статьи, момент удержания шаговых двигателей превышает момент вращения.

Так, для рассматриваемого двигателя P542-M48 момент удержания с редуктором 25:6 равен 19.8 Н·см, а момент вращения всего 6 Н·см. Этот подход позволяет при остановке двигателя уменьшить потребление мощности с 5.52 Вт до 1.

38 Вт! Полное отключение двигателя осуществляется подачей высокого логического уровня на контакт «ВКЛ/ВЫКЛ» разъема Х1.

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

Примечание: В этом варианте использование резисторов подтяжки недопустимо!

В качестве дросселя автор использовал катушку SDR1006-331K (Bourns). Общее питание формирователя напряжения для обмоток двигателя можно уменьшить до 16 – 18 В, что не скажется на его работе.

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

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

Да, этого и не требуется, так как имеется очень большой выбор специализированных ИМС. Все эти ИМС условно можно свести к двум типам. Первый – весьма популярная у любителей робототехники ИМС L293D STMicroelectronics [9] или ее варианты от Texas Instruments.

Они относительно недороги и подходят для управления маломощными двигателями с током обмоток до 600 мА. ИМС имеют защиту от перегрева; устанавливать ее необходимо с обеспечением теплоотвода, которым служит фольга печатной платы [9].

Второй тип – это уже знакомая читателям по публикации в [1] ИМС LMD18245 [2].

Автор использовал драйвер L293DD в схеме для управления биполярным двигателем малой мощности типа 20M020D2B 12 В/0.1 А во время изучения проблемы использования шаговых двигателей. Этот драйвер удобен тем, что содержит четыре полумостовых ключа, поэтому для управления биполярным шаговым двигателем требуется всего одна ИМС.

Полная схема, приведенная в [10] и многократно повторенная на интернет-сайтах, пригодна для использования в качестве тестовой платы.

На Рисунке 15 показано включение ИМС драйвера (с привязкой к коммутатору из Рисунка 10), поскольку именно эта часть сейчас представляет для нас интерес, а Figure 6 (Bipolar Stepping-Motor Control) из спецификации [9] не совсем понятна начинающему пользователю.

Она вводит в заблуждение, например, тем, что показаны внешние диоды, которые на самом деле встроены в ИМС и прекрасно справляются с обмотками маломощных двигателей. Естественно, что драйвер L293D может работать с любым коммутатором. Выключается драйвер логическим нулем по входу R.

Примечание: ИМС L293, в зависимости от изготовителя и суффиксов, указывающих на тип корпуса, имеют различия в нумерации и количестве выводов!

Рисунок 15. Схема подключения драйвера L293DD.

Для более мощных двигателей автор статьи использовал драйверы LMD18245. Полная схема тестового модуля приведена на Рисунке 16.

Рисунок 16. Схема управления биполярным шаговым двигателемс использованием драйвера LMD18245.

В отличие от L293DD, LMD18245 является не четырех-, а двухканальным драйвером, поэтому для реализации схемы управления требуются две ИМС. Драйвер LMD18245 выполнен по DMOS технологии, содержит схемы защиты от перегрева, короткого замыкания и выполнен в удобном 15-выводном корпусе ТО-220, что позволяет легко отводить от его корпуса излишнее тепло.

В качестве задающего генератора использовалась схема, приведенная ранее на Рисунке 13, но с увеличенным до 4.7 кОм сопротивлением резистора R2. Для подачи одиночных импульсов используется кнопка BH1, позволяющая сдвинуть ротор двигателя на один шаг. Направление вращения ротора определяется положением переключателя S1.

Включение и выключение двигателя осуществляется выключателем S2. В положение «ВЫКЛ» ротор двигателя освобождается, и его вращение импульсами управления становится невозможным. Режим удержания уменьшает максимальный ток, потребляемый обмотками двигателя, с двух до одного ампера.

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

Необходимо заметить, что поскольку при полношаговом управлении «two-phase-on» включены обе обмотки, ток двигателя удваивается, а схема драйвера должна рассчитываться исходя из требований обеспечения заданного тока двух обмоток (резисторы R3, R8).

Схема содержит описанный ранее двунаправленный двухфазовый формирователь на D-триггерах (Рисунок 10). Максимальный ток драйвера задается резистором, включенным в цепь контакта 13 ИМС LMD18245 (резисторы R3, R8), и двоичным кодом на контактах цепи управления тока (выводы 8, 7, 6, 4).

Формула для расчета максимального тока приведена в спецификации на драйвер [2]. Ограничение тока осуществляется импульсным методом. При достижении максимально заданной величины тока выполняется его «нарезка» («chopping»).

Параметры этой «нарезки» задаются параллельной RC цепочкой, подключенной к выводу 3 драйвера. Достоинством ИМС LMD18245 является то, что токозадающий резистор, не включенный непосредственно в цепь двигателя, имеет достаточно большой номинал и маленькую рассеиваемую мощность.

Для рассматриваемой схемы максимальный ток в амперах, согласно приведенной в [2] формуле, составляет:

где:

VDAC REF – опорное напряжение ЦАП (в рассматриваемой схеме 5 В); D – задействованные разряды ЦАП (в этом режиме используются все 16 разрядов);

RS – сопротивление токоограничивающего резистора (R3 = R8 = 10 кОм).

Соответственно, в режиме удержания (поскольку используются 8 разрядов ЦАП), максимальный ток составит 1 А.

В заключение необходимо отметить, что драйвер LMD18245 позволяет реализовать и микрошаговое управление. Как упоминалось выше, такой режим уменьшает, и даже подавляет паразитный резонанс ротора. Поддержка такого режима для указанного драйвера осуществляется микропроцессором, управляющим входами ЦАП.

Как можно видеть из предложенной статьи, шаговые двигатели хоть и сложнее в управлении, чем коллекторные, но не настолько, чтобы отказываться от них. Как говорили еще древние римляне: «Дорогу осилит идущий».

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

Дополнительную информацию и более детальное рассмотрение проблем, связанных с применением шаговых двигателей, кроме как по упомянутым выше ссылкам [3, 4, 7], можно почерпнуть из ставшей уже классикой монографии Кенио Такаши [11] и на специализированных интернет-сайтах, например, [12].

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

Что имеется ввиду? Если приложить внешнее вращающее усилие к ротору, то с обмоток статора можно снять ЭДС, то есть двигатель становится генератором, причем весьма и весьма эффективным.

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

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

Литература:

  1. Рентюк В. «Управление двигателями постоянного тока»
  2. LMD18245 3A, 55V DMOS Full-Bridge Motor Driver, Texas Instruments Inc., April 2013
  3. Емельянов А. В., Шилин А. Н. Шаговые двигатели: учебное пособие. Волг. ГТУ, Волгоград, 2005
  4. en.nanotec.com
  5. DHS 56 series TECO Electro Devices Co. Ltd.
  6. Geared stepper motor P542-M48 series, Mclennan Servo Supplies Ltd.
  7. Дьяконов В. П., Максимчук А. А., Ремнев А. М., Смердов В. Ю. Энциклопедия устройств на полевых транзисторах. М., СОЛОН-Р, 2002
  8. LM2675 SIMPLE SWITCHER Power Converter High Efficiency 1A Step-Down Voltage Regulator, Texas Instruments Inc., Rev. June 2005
  9. L293, L293D PUSH-PULL FOUR CHANNEL DRIVER WITH DIODES STMicroelectronics, July 2003
  10. Rentyuk Vladimir «Control stepper motors in both directions» EDN March 18, 2010
  11. Кенио Такаши. Шаговые двигатели и их микропроцессорные системы управления: Пер. с англ., М.: Энергоатомиздат, 1987 – 199 с.
  12. stepmotor.ru

Источник: https://www.rlocman.ru/review/article.html?di=161860

Шаговые двигатели и моторы Ардуино

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

Их можно найти во многих устройствах рядом: от CD-привода до 3D-принтера или робота-манипулятора.

Схема работы шаговых двигетелй, способ подключения к Arduino и примеры скетчей — все это вы найдете в этой статье.

Шаговый двигатель в Ардуино

Шаговый двигатель – это мотор, перемещающий свой вал в зависимости от заданных в программе микроконтроллера шагов и направления.

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

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

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

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

Такие параметры как угол поворота (шаги), направление движения задаются в программе для микроконтроллера.

Основные виды шаговых моторов:

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

Драйвер для управления шаговым двигателем

Драйвер – это устройство, которое связывает контроллер и шаговый двигатель. Для управления биполярным шаговым двигателем чаще всего используется драйвер L298N. Работа двигателя в биполярном режиме имеет несколько преимуществ:

  • Увеличение крутящего момента на 40% по сравнению с униполярными двигателями;
  • Возможность применения двигателей с любой конфигурацией фазной обмотки.

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

Для такой коммутации используется схема-мост с четырьмя ключами. Самым распространенным драйвером является микросхема L298N. Этот мостовой драйвер управляет двигателем с током до 2 А и питанием до 46В.

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

Существует другой вид драйверов —  STEP/DIR драйверы. Это аппаратные модули, которые работают по протоколу STEP/DIR для связи с микроконтроллером. STEP/DIR драйверы расширяют возможности:

  • Они позволяют стабилизировать фазные токи;
  • Возможность установки микрошагового режима;
  • Обеспечение защиты ключа от замыкания;
  • Защита от перегрева;
  • Оптоизоляция сигнала управления, высокая защищенность от помех.

В STEP/DIR драйверах используется 3 сигнала:

  • STEP – импульс, который инициирует поворот на шаг/часть шага в зависимости от режима. От частоты следования импульсов будет определяться скорость вращения двигателя.
  • DIR – сигнал, который задает направление вращения. Обычно при подаче высокого сигнала производится вращение по часовой стрелке. Этот тип сигнала формируется перед импульсом STEP.
  • ENABLE – разрешение/запрет работы драйвера. С помощью этого сигнала можно остановить работу двигателя в режиме без тока удержания.

Одним из самых недорогих STEP/DIR драйверов является модуль TB6560-V2. Этот драйвер обеспечивает все необходимые функции и режимы.

Подключение шагового двигателя к Ардуино

Подключение будет рассмотрено на примере униполярного двигателя 28BYj-48 и драйвера ULN2003. В качестве платы будет использоваться Arduino Uno.

Схема подключения изображена на рисунке ниже. Управляющие выходы с драйвера IN1-IN4 подключаются к любым цифровым контактам на Ардуино. В данном случае используются цифровые контакты 8-11. Питание подключается к 5В. Также для двигателя желательно использовать отдельный источник питания, чтобы не перегрелась плата Ардуино.

Принципиальная схема подключения.

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

Для работы в программе Arduino IDE используется встроенная библиотека Stepper.

Обзор основных моделей шаговых двигателей для ардуино

Nema 17 – биполярный шаговый двигатель, который чаще всего используется в 3D принтерах и ЧПУ станках. Серия 170хHSхххА мотора является универсальной.

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

  • Угловой шаг 1,8°, то есть на 1 оборот приходится 200 шагов;
  • Двигатель — двухфазный;
  • Рабочие температуры от -20С до 85С;
  • Номинальный ток 1,7А;
  • Момент удержания 2,8 кг х см;
  • Оснащен фланцем 42 мм для легкого и качественного монтажа;
  • Высокий крутящий момент – 5,5 кг х см.

28BYJ-48 – униполярный шаговый двигатель. Используется в небольших проектах роботов, сервоприводных устройствах, радиоуправляемых приборах.

Характеристики двигателя:

  • Номинальное питание – 5В;
  • Основан на микросхеме ULN2003;
  • 4-хфазный двигатель, 5 проводов;
  • Угол шага 5,625°;
  • Крутящий момент 120 Гц;
  • Сопротивление постоянного тока 50Ω ± 7% (25 ℃).

Описание библиотеки для работы с шаговым двигателем

В среде разработки Ардуино IDE существует стандартная библиотека Strepper.h для написания программ шаговых двигателей. Основные функции в этой библиотеке:

  • Stepper(количество шагов, номера контактов). Эта функция создает объект Stepper, которая соответствует подключенному к плате Ардуино двигателю. Аргумент — контакты на плате, к которым подключается двигатель, и количество шагов, которые совершаются для полного оборота вокруг своей оси. Информацию о количестве шагов можно посмотреть в документации к мотору. Вместо количества шагов  может быть указан угол, который составляет один шаг. Для определения числа шагов, нужно разделить 360 градусов на это число.
  • Set Speed(long rpms) – функция, в которой указывается скорость вращения. Аргументом является положительное целое число, в котором указано количество оборотов в минуту. Задается после функции Step().
  • Step(Steps) –поворот на указанное количество шагов. Аргументом может быть либо положительное число – поворот двигателя по часовой стрелке, либо отрицательное – против часовой стрелки.

Пример скетча для управления

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

#include const int stepsPerRevolution = 200; Stepper myStepper(stepsPerRevolution, 8,9,10,11); //подключение к пинам 8…11 на Ардуино void setup() { myStepper.setSpeed(60); //установка скорости вращения ротора Serial.begin(9600); } void loop() { //Функция ожидает, пока поступит команда, преобразовывает текст и подает сигнал на двигатель для его вращения на указанное число шагов. Serial.println(“Move right”); //по часовой стрелке myStepper.step(stepsPerRevolution); delay(1000); Serial.println(“Move left”); //против часовой стрелки myStepper.step(-stepsPerRevolution); delay(1000); }

Заключение

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

Мы также рассмотрели пример написания скетча, использующего встроенную библиотеку Stepper.

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

Источник: https://ArduinoMaster.ru/motor-dvigatel-privod/shagovye-dvigateli-i-motory-arduino/

Шаговый мотор NEMA 17, серии 17HS4402 + драйвер A4988 + Arduino NANO

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

В данной статье мы продолжаем разбираться с темой шаговых двигателей. В прошлый раз мы подключили к плате Arduino NANO небольшой моторчик 28BYJ-48 (5V). Сегодня мы будем делать то же самое, но с другим мотором – NEMA 17, серии 17HS4402 и другим драйвером – A4988.

Шаговый мотор NEMA 17 — это биполярный двигатель с высоким крутящим моментом. Может поворачиваться на заданное число шагов.

За один шаг совершает оборот на 1,8°, соответственно полный оборот на 360° осуществляет за 200 шагов.

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

Такой мотор широко применяется в станках ЧПУ, 3D принтерах, сканерах и т. д.
Управляться он будет с помощью платы Arduino NANO.

Эта плата способна выдавать напряжение 5V, тогда как мотор работает от большего напряжения. Мы выбрали блок питания 12V. Так что нам понадобится дополнительный модуль — драйвер, способный управлять более высоким напряжением через маломощные импульсы Arduino. Для этого отлично подходит драйвер А4988.

Драйвер шагового двигателя А4988.

Плата создана на базе микросхемы A4988 компании Allegro – драйвера биполярного шагового двигателя.

Особенностями A4988 являются регулируемый ток, защита от перегрузки и перегрева, драйвер также имеет пять вариантов микрошага (вплоть до 1/16-шага).

Он работает от напряжения 8 – 35 В и может обеспечить ток до 1 А на фазу без радиатора и дополнительного охлаждения (дополнительное охлаждение необходимо при подаче тока в 2 A на каждую обмотку).

Характеристики:

Модель: A4988; напряжения питания: от 8 до 35 В; возможность установки шага: от 1 до 1/16 от максимального шага; напряжение логики: 3-5.5 В; защита от перегрева; максимальный ток на фазу: 1 А без радиатора, 2 А с радиатором; расстояние между рядами ножек: 12 мм; размер платы: 20 х 15 мм; габариты драйвера: 20 х 15 х 10 мм; габариты радиатора: 9 х 5 х 9 мм; вес с радиатором: 3 г;

без радиатора: 2 г.

Для работы с драйвером необходимо питание логического уровня (3 – 5,5 В), подаваемое на выводы VDD и GND, а также питание двигателя (8 – 35 В) на выводы VMOT и GND. Плата очень уязвима для скачков напряжения, особенно если питающие провода длиннее нескольких сантиметров.

Если эти скачки превысят максимально допустимое значение (35 В для A4988) ,то плата может сгореть. Одним из способов защиты платы от подобных скачков является установка большого (не меньше 47 мкФ) электролитического конденсатора между выводом питания (VMOT) и землёй близко к плате.

Соединение или разъединение шагового двигателя при включённом драйвере может привести к поломке двигателя! Выбранный мотор совершает 200 шагов за полный оборот на 360°, что соответствует 1,8° на шаг. Микрошаговый драйвер, такой как A4988 позволяет увеличить разрешение за счёт возможности управления промежуточными шагами.

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

Разрешение (размер шага) задаётся комбинациями переключателей на входах (MS1, MS2, и MS3).

MS1 MS2 MS3 Разрешение микрошага
Низкий Низкий Низкий Полный шаг
Высокий Низкий Низкий 1/2 шага
Низкий Высокий Низкий 1/4 шага
Высокий Высокий Низкий 1/8 шага
Высокий Высокий Высокий 1/16 шага

Каждый импульс на входе STEP соответствует одному микрошагу двигателя, направление вращения которого зависит от сигнала на выводе DIRECTION. Выводы STEP и DIRECTION не подтянуты к какому-либо конкретному внутреннему напряжению, поэтому их не стоит оставлять плавающими при создании приложений.

Если вы просто хотите вращать двигатель в одном направлении, можно соединить DIR непосредственно с VCC или GND. Чип имеет три различных входа для управления состоянием питания: RESET, SLEEP и ENABLE.

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

Схема соединения.

Мы использовали вот такой блок питания (12V).

Для удобства подключения к плате Arduino UNO, мы использовали собственноручно сделанную деталь. Пластиковый корпус напечатан на 3D принтере, к нему приклеены контакты.

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

Соединяем всё согласно схеме.

Потом открываем среду разработки программ для Arduino и пишем программу, вращающую мотор сначала в одну сторону на 360°, потом в другую.

const int pinStep = 5;

const int pinDir = 4;

const int move_delay = 3;

const int steps_rotate_360 = 200;

void setup() {

  pinMode(pinStep, OUTPUT);   pinMode(pinDir, OUTPUT);  digitalWrite(pinStep, HIGH);   digitalWrite(pinDir, LOW);

}

void loop() {

  digitalWrite(pinDir, HIGH);

  for(int i = 0; i < steps_rotate_360; i++)   {     digitalWrite(pinStep, HIGH);     delay(move_delay);     digitalWrite(pinStep, LOW);     delay(move_delay);

  }

  delay(move_delay*10);

  digitalWrite(pinDir, LOW);

  for(int i = 0; i < steps_rotate_360; i++)   {     digitalWrite(pinStep, HIGH);     delay(move_delay);     digitalWrite(pinStep, LOW);     delay(move_delay);

  }

  delay(move_delay*10);
}

Если мы хотим, чтобы мотор просто постоянно вращался в ту или иную сторону, то можно подключить контакт драйвера DIRECTION к земле (вращение по часовой стрелке) или питанию (против часовой) и залить в Arduino такую простенькую программу:

const int pinStep = 5;

const int move_delay = 3;

void setup() {

  pinMode(pinStep, OUTPUT);  digitalWrite(pinStep, LOW);

}

void loop() {

  digitalWrite(pinStep, HIGH);   delay(move_delay);   digitalWrite(pinStep, LOW);   delay(move_delay);

}

Всё это мы рассматривали шаговый режим мотора, то есть 200 шагов за полный оборот. Но, как уже было описано, мотор может работать, в 1/2, 1/4, 1/8, 1/16 шаговых режимах, в зависимости от того, какая комбинация сигналов подаётся на контакты драйвера MS1, MS2, MS3.
Давайте с этим потренируемся, подключим эти три контакта к плате Arduino, согласно схеме, и зальём код программы.

Код программы, которая демонстрирует все пять режимов работы мотора, вращая мотор в одну и другую сторону на 200 шагов в каждом из этих режимов.

const int pinStep = 5;

const int pinDir = 4;

const int move_delay = 3;

const int steps_rotate_360 = 200;

int StepModePins[3] = {8, 7, 6};

const int StepModePinsCount = 3;

bool StepMode[5][3] = {   { 0, 0, 0},   { 1, 0, 0},   { 0, 1, 0},   { 1, 1, 0},

  { 1, 1, 1} };

const int StepModeSize = 5;

void setup() {

  pinMode(pinStep, OUTPUT);

  pinMode(pinDir, OUTPUT);

  for(int i = 0; i < StepModePinsCount; i++)   {     pinMode(StepModePins[i], OUTPUT);

  }

  digitalWrite(pinStep, HIGH);   digitalWrite(pinDir, LOW);

}

void loop() {   for(int i = 0; i < StepModeSize; i++)   {     for(int j = 0; j < StepModePinsCount; j++)     {       digitalWrite(StepModePins[j], StepMode[i][j] == 1 ? HIGH : LOW);

    }

    MakeRoundRotation();   }

}

void MakeRoundRotation() {

  digitalWrite(pinDir, HIGH);

  for(int i = 0; i < steps_rotate_360; i++)   {     digitalWrite(pinStep, HIGH);     delay(move_delay);     digitalWrite(pinStep, LOW);     delay(move_delay);

  }

  delay(move_delay*10);

  digitalWrite(pinDir, LOW);

  for(int i = 0; i < steps_rotate_360; i++)   {     digitalWrite(pinStep, HIGH);     delay(move_delay);     digitalWrite(pinStep, LOW);     delay(move_delay);

  }

  delay(move_delay*10);
}

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

Дополняем схему новыми элементами.

Для подключения кнопок воспользуемся такими проводочками.

Код программы.

const int pinStep = 5;

const int pinDir = 4;

const int ButtonOn1 = 9;

const int ButtonOn2 = 10;

const int PotenciomData = 1;

const int move_delay = 3;

const int CheckButtonDelay = 15;

int CurrentButtonDelay = 0;

int StepModePins[3] = {8, 7, 6};

const int StepModePinsCount = 3;

int ButtonState = 0;

int ButtonDirection = 0;

bool StepMode[5][3] = {   { 0, 0, 0},   { 1, 0, 0},   { 0, 1, 0},   { 1, 1, 0},

  { 1, 1, 1} };

const int StepModeSize = 5;

int StepModeIndex = 0;

void setup() {

  pinMode(pinStep, OUTPUT);

  pinMode(pinDir, OUTPUT);

  for(int i = 0; i < StepModePinsCount; i++)   {     pinMode(StepModePins[i], OUTPUT);

  }

  pinMode(ButtonOn1, INPUT);   pinMode(ButtonOn2, INPUT);

  pinMode(PotenciomData, INPUT);

  digitalWrite(pinStep, LOW);   digitalWrite(pinDir, LOW);

}

void loop() {   if(CurrentButtonDelay >= CheckButtonDelay)   {     CheckButtonState();     CurrentButtonDelay = 0;

  }

  if(ButtonState == 1)   {     MakeMotorStep();

  }

  delay(move_delay);   CurrentButtonDelay += move_delay;

}

void MakeMotorStep() {   digitalWrite(pinStep, HIGH);   digitalWrite(pinStep, LOW);

}

void CheckButtonState() {

  int CurrentButtonState = 0, CurrentButtonDirection = 0, CurrentStepModeIndex = 0;

  bool readbuttonparam = digitalRead(ButtonOn1);

  if(readbuttonparam)   {     CurrentButtonState = 1;     CurrentButtonDirection = 1;

  }

  readbuttonparam = digitalRead(ButtonOn2);

  if(readbuttonparam)   {     CurrentButtonState = 1;     CurrentButtonDirection = 0;

  }

  if(ButtonState != CurrentButtonState)   {     ButtonState = CurrentButtonState;

  }

  if(ButtonDirection != CurrentButtonDirection)   {     ButtonDirection = CurrentButtonDirection;     digitalWrite(pinDir, ButtonDirection);

  }

  CurrentStepModeIndex = map(analogRead(PotenciomData), 0, 1023, 0, StepModeSize-1);   if(StepModeIndex != CurrentStepModeIndex)   {     StepModeIndex = CurrentStepModeIndex;     for(int i = 0; i < StepModePinsCount; i++)     {       digitalWrite(StepModePins[i], StepMode[StepModeIndex][i]);     }   }

}

Источник: http://techclub.su/article_arduino07

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}