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

Предыстория
Понадобилось мне прошлой осенью восстановить измерительный стенд. Одна из главных частей стенда — система протяжки лески с закрепленной на ней трубочке сквозь СВЧ-резонатор (это такая медная банка весом 20-30 кг). Причем протяжка должна осуществляться периодически с фиксацией положения (на 1мм подвинул, остановился, подождал секунду, ещё на 1мм подвинул, и так далее). Естественно сразу возникла мысль о шаговом двигателе (ШД). Но как им управлять? Разобрался. Начал искать схемные решения — биполярными двигателями сложно управлять, поэтому выбор пал на униполярный. Был приобретён кЫтайский моторчик под названием
MOTS1 (ST28), который в России продаётся Velleman`ом

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

Пришёл черёд разработки контроллера управления. Разработкой движили несколько целей:

  • Покупать «чужой» контроллер за 5 т.р. совесть не позволяла
  • Стоимость разработанного контроллера не должна превышать 500-700 р.
  • Простота конструкции для а) повторяемости устройства, б) проще отладка, в) неблагоприятная электромагнитная обстановка, г) чтобы те, кто найдут контроллер через 20 лет смогли разобраться как его «завести», т.к. я подобным образом разбирался с СВЧ-резонатором, пролежавшим в шкафу с конца 90х…
  • Управление с компьютера. Всяких FT232RL в Москве я не нашёл на тот момент, поэтому без всяких раздумий решил использовать интерфейс RS-232.
  • Питание от компьютерного разъёма (который питает харды, приводы и т.д.). Комп всё равно рядом, 2 напряжения: +5 для питания микросхем, +12 для ШД.

Хронология событий
Набросал схему.

Набросал плату в Sprint Layout.

Скачать файл с разводкой

Прошивка для ATmega8L.
Опыта было мало, время поджимало — решил не возиться с ассемблером и написал на каком-то из Basic`ов. Весила она около 25% флеша ATmega8L.

Перешёл на «железо»: нашёл лист шестилетней фотобумаги от уже убитого струйника Epson. Распечатал, заЛУТил (не с первого раза — бумага фигово липнет, старая наверно), спаял.

Для связи с COM-портом изпользуется разъём IDC-10 (изготовлен кабель IDC-10 — DB-9F), для соединения с пятью проводами ШД — штыри PLS-8 (3 штыря из 8 отломаны).

При макетировании из-за того, что ни осциллограф, ни комп не были заземлены, и особенностей БП компьютера, я спалил оба COM-порта. С тех пор использую переходник USB-COM на основе PL2303.

Во время тестирования и отладки понял, что зря я не предусмотрел кнопку сброса МК и разъём внутрисхемного программирования…Пришлось «подвесить» его на проводах =)

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

Зимой я решил переписать прошивку для МК.
Естественно уже на ассемблере. За неделю осилил, и вот что получилось

StepControl.asm

Краткое описание алгоритма программы:

  • 1. Инициализации и конфигурирование регистров, макросы, таблица векторов прерываний
  • 2. Оправляем пользователю приглашение «hello», что контроллер готов.
  • 3. Ждём, когда же пользователь проснётся и пришлёт МК команду.
  • Команда представляет собой 3 байта. Первый и второй байт — число периодов управляющих сигналов, третий байт — направление вращения.
  • Формирование пакетов управляющих сигналов возложено на программу на компьютере.
  • Передача осуществляется на скорости 38400бит/с.
  • 4. Принимаем команду, сохраняем в RAM. Читаем из RAM в РОН.
  • 5. Запускаем таймер.
  • 6. Переходим к пункту 3.

А тем временем таймер по прерыванию совпадения:

  • 1. Уменьшаем счётчик сигналов на единицу. Если не дошли до нуля, то
  • 1.1. Определяет направление вращения
  • 1.2. Выбирает следующую управляющую комбинацию сигналов из памяти программ
  • 1.3. Выводим соответствующую управляющую комбинацию в PORTB.
  • 2. Если счётчик сигналов равен нулю — тормозим таймер.

Такой алгоритм позволяет «пополнять» содержимое счётчика сигналов во время работы таймера (естественно не в момент прерывания) и добиться «непрерывной» работы ШД. Но этим уже занимается программа написанная на VisualBasic 6.0 (нравится он мне, как бы его не обижали любители С# и Delphi).

Скачать программку

Во время тестирования программы поднимал и опускал двигателем болт, привязанный на нитке…Вспомнилась детская игрушка башенный кран :)

Оценка стоимости всего этого безобразия:

№ п/п	Наименование			Цена, руб	Кол-во	Стоимость, руб
1	Вилка штыревая PLS-8			1.6	1	1.6
2	Конденсатор керамич. 0.1мкФ, 50В	3	1	3
3	Конденсатор электролит. 1мкФ, 50В	14	5	70
4	Корпус DP-9C для D-SUB 9pin		13	1	13
5	Микроконтроллер ATmega8L		78	1	78
6	Панель под микросхему 16 контактов	2.6	2	5.2
7	Панель под микросхему 28 контактов	4.6	1	4.6
8	Преобразователь уровней MAX232CPE	16	1	16
9	Разъём DB-9F				23	1	23
10	Разъём IDC-10F на шлейф			16	1	16
11	Разъём IDC-10MR вилка угловая		23	1	23
12	Разъём питания THP-4M			8.8	1	8.8
13	Сборка транзисторов ULN2003AN		15	1	15
14	Шаговый двигатель ST28			320	1	320
							Итого:	597.2

Как видно, уложился в 600р. Может конечно что-то и подзабыл, но одна из поставленных задач выполнена.

Выводы
Получился довольно «узконаправленный» контроллер. Но задачи создать универсальное устройство не было. Изготавливается довольно быстро, всё в DIPах и выводным монтажом. Размеры — наверно чуть больше 2х спичечных коробков. Возможность модернизации: Легко задать необходимую управляющую последовательность в коде прошивки, ассемблировать, зашить в МК и пользоваться, код занимает около 3% памяти — места хватит ещё светомузыку приделать :)

Возможные применения

  • детская игрушка башенный кран =)))
  • системы протяга всевозможных нитей, лески, например, занавески открывать по команде с компа
  • маломощные приводы (до 6Вт, т.к. ULN2003AN больше 500мА не терпит, если конечно ШД столько сам потянет)
  • системы, требующие точного позиционирования (число управляющих импульсов на 1 оборот ШД равно 2048!!!, жаль мощность очень невелика)

P.S. Автор выражает благодарность своему научному руководителю Сергею Марковичу за спонсорство, коллегам по лаборатории Тарасу и Лёшке, подруге Юле за помощь в тестировании и отладке, и конечно же DI HALT`у за предоставленную возможность быть опубликованным на easyelectronics.ru!

DI HALT
Меня не теряте ;) Я сейчас очень много пишу, но пока не буду уточнять что. Хотя, некоторые уже спалили. Как доделаю хотя бы половину задуманного, естественно, сообщу :) А пока буду выкладывать присланные статьи. Их тут довольно много накопилось.

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

98 thoughts on “Контроллер маломощного униполярного шагового двигателя”

      1. Супер! А исходник на VB6 можно посмотреть? А то програмка Terminal, конечно, хорошо. Но я хочу сделать с моей меги 16 и компа осциллограф-вольтметр-мониторинг температуры, да чтобы графики красивые рисовались).

    1. Да, дизайн интерфейса зачётный.
      Завидую автору, у меня с этим проблемы.
      В принципе, накидать-то такое любой RAD позволяет, но ведь размеры и расположение элементов самому надо подбирать, чтоб красиво смотрелось.

        1. А с каких это пор MS стала авторитетом в области дизайна?
          Впрочем, не хочу холиварить.

          Да, ляпы-то наблюдаются (например, переключение кнопками, зелёный цвет для «стоп»), и до «Отлично» не дотягивает, но оценка «Зачёт» таки применима.

  1. Вот этой строчки не понял:
    ^системы, требующие точного позиционирования (число управляющих импульсов на 1 оборот ШД равно 2048!!!, жаль мощность очень невелика)
    Это ШД с редуктором имеются ввиду?

    1. В кассовых аппаратах ттпа Элвес-Микро-К с японским термопринтером, там стоит шаговый двигатель как-раз величиной с наперсток. Точную маркировку моторчика и принтера не помню.

      1. Как раз стоит с ней поработать, для таких проектов. Тинька вообще на многое способна, хоть и имеет на борту всего 2 таймера, 2Кб Flash, SPI, USART. Отличается командами от mega8 разве что умножением и еще несколько с работами парных регистров.

  2. Кстати, управлять биполярным ШД совсем не сложно. Каждую из двух обмоток двигателя «зажимаешь» между двумя двухтактными эмитерными повторителями (н-п-н и п-н-п транзисторы в связке, гуглится в легкую). На входах 1-0 — одна подярность магнита получается, 0-1 — другая.
    http://www.stepmotor.ru/articles/ispolz.php — тут хорошо и понятно написано. На том же сайте есть хорошая статья про ШД разных типов. Очень хорошо написано.

  3. Вообще идея хорошая. Только вот есть несколько замечаний.
    «…зря я не предусмотрел кнопку сброса МК и разъём внутрисхемного программирования…Пришлось “подвесить” его на проводах…»
    Незнаю, я в таких случаях, после отладки, переделываю плату. В данном случае, переделал бы. Тем более, что запаять несколько панелек и конденсаторов не представляет трудностей. Да и изготовление новой платы не займет много времени, тем более места под разъемы там больше чем достаточно. Всего лишь несколько часов. Зато потом не нужно будет подпаивать оторвавшиеся проводки… Это еще при том, что нужно заготовить полтора десятка проводков, напаять разъем на них, а их припаять к плате, да еще и не перепутать.
    ЗЫ А чего сброс не подтянут? Понятно тогдда, зачем кнопка… А то я долго думал. Подтяни сброс — и ненадо будет кнопку ставить ;)
    ЗЗЫ Использовать разъем на 10 контактов, когда необходимо всего лишь 3, по крайней мере, расточительно…

    1. >> Незнаю, я в таких случаях, после отладки, переделываю плату.

      Сейчас всё работает и нужна в кнопке сбросе и разъёме программирования отпала.

      >> Использовать разъем на 10 контактов, когда необходимо всего лишь 3, по крайней мере, расточительно…

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

  4. Уважаемый dzed, объясните плиз, что значит «число управляющих импульсов на 1 оборот ШД равно 2048» ?
    на чипдипе написано : «Шаг / угол / шаг: 5.625° / 64.» — я так понимаю всего оборот на 360° за 64 шага?

      1. Там шаговый двигатель на 32 шага (64 в полушаговом режиме, откуда и берется 5.625°) и редуктор 1 к 64, в итоге имеем 2048 шагов или 4096 полушагов на оборот рабочего вала. На днях имел счастье разбираться с таким же.

  5. как-то в статье ничего не рассказано про использование сборки ULN2003AN…, чем её применение оправдывается… почему например не использовать специальные драйвера для управления шаговиками?

      1. Именно так! Стоит она меньше 20руб., в то время как спец.драйвера дешевле 100руб. наверно и не найти. К тому же спец.драйвер для униполярного движка как раз собой и представляет сборку электронных ключей. Так что разницы особой не вижу.
        Другое дело — биполярные двигатели! Для них лучше конечно приобретать драйвер. На рассыпухе слишком громоздко, а одними Дарлингтонами там не обойдёшься.

      1. что Вы называете «Общий» ? я так понимаю движок подключают на вых.1.2-1.5, а штырь вых.1.1 — автор просто развел для своих нужд… и его никуда подключать не нужно…

        1. Общий — это общий для каждой обмотки.
          Я просто для своих нужд так развёл. Для создания тока надо приложить напряжение на обмотку, т.е. разность потенциалов. Вот один из потенциалов — напряжение питания. Другой (общую шину) коммутирует сборка Дарлингтонов.
          Повторю: у движка 5 проводов!

          1. цитата:
            «Повторю: у движка 5 проводов!»
            теперь понятно, на фотке двигатель с 4 проводами и обозван он был «униполярным»
            что шло (ну я так думал) в противоречие со статьёй: http://easyelectronics.ru/upravlenie-shagovym-dvigatelem.html

            выдержка:

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

            и все движки которые я вынимал из Floppy дисководов имели 4 вывода!

            раставить точки над ё помогла статья: http://www.electroprivod.ru/motor_step.htm

            теперь вроде все понятно…

              1. Я извинюсь за такой вопрос, но почему уважаемый dzed пишет, что его схема не сможет управлять биполярным двигателем? Ведь насколько я понимаю, управление им строится как создание разности потенциалов между выводами обмотки(не вдаваясь в подробности в какой последовательности). Т.е. на А1 подать «1», на В1 — «0». Вот разность потенциалов. Хотите обратно, пожалуйсата: на А1 подать «0», на В1 — «1». Остается только переписать программу. Ведь ULN2003 только «усилитель» для порта контроллера?

                1. Дело в том, что ULN2003 «0» может подать на любую ногу, а вот «1» она подавать не умеет. В лучшем случае оставит висеть в воздухе. Поэтому с помощью этой микросхемы разность потенциалов указанным Вами образом невозможно. Посмотрите даташит на неё, сообразите как она работает.

                    1. Посмотрите схемы управления. Есть специальные микросхемы для управления биполярными шаговиками, типа L298,L293. Там сборка дарлингтонов будет избыточна, можно собрать на одиночных транзисторах.
                      http://www.stepmotor.ru/upravl.htm
                      вот тут вроде хорошо написано и схемки есть.

  6. Аналогичную схему собирал сам, на макетке (до прочтения сего опуса). Т.к. с выводами движка было не ясно, то переключал их по очереди к разным выводам. Видать где то коротнул и спалил пару ULN-ок. Теперь вот думаю диоды на тыкать, что бы не палить микруху.

        1. дык простой двигатель, постоянного тока на 42V, и линейка с датчиком,
          двигатель тащит, датчик по линейке сщитает, вобщем серва.
          описание датчика ненашол, но магу дать фото, может поможет.

          1. дык простой двигатель, постоянного тока на 42V, и линейка с датчиком,
            двигатель тащит, датчик по линейке сщитает, вобщем серва.
            описание датчика ненашол, но могу дать фото, может поможет.

          2. А какая цель, если не секрет?

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

            1. Цель такая, CNC станок, управляется Mach3 или Mach2.
              небольшой, для резки 3D из воска, так называемая восковка(для ювилиров)
              мощи моторов хватает, пробовали. вешал шпиндилёк и по воску, с небольшой глубиной за проход, игольной фрезой 0,2мм гонял из стороны в сторону.
              принтера достались даром(практически вырвал из помойки).
              Насчёт параметров движка есть схема всего принтера в pdf формате,
              но я как-то неочень в схемах, вот механика…

              1. Ага, понятно.
                Просто я сразу прикинул, что обычно движки на постоянке и с энкодерами, используют в мощных CNC, а в мелких предпочитают шаговики, тк шаговик намного проще (и дешевле) подключать к программе, а принтерный движок обычно слабенький.
                И для больших станков эта сложность оправдывается значительно более высоким моментом движка на постоянке (на больших станках можно себе позволить даже такую роскошь, как например постоянный мониторинг программой нагрузки и температуры движков, чтоб вытягивать полную мощность и не перегреть), а тут надо прикинуть, что получится.

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

                Присылайте схему, и ваши координаты мне на емейл simne[ at ] yandex.ru, я посмотрю и пообщаемся.

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

              2. Посмотрел.
                Как оно подключается ясно, но что за интерфейс у энкодеров пока не уверен — нужно посмотреть на плату энкодера.
                Еще нужно будет сделать на макетной плате «измерительный стенд» и убедиться что правильно понимаю, как оно работает.
                Потом можно будет уже делать не времянку.

                Вообще вам не кажется что движки эти совсем хлипкие даже для воска?
                Дело в том, что движки в оригинальной схеме не прямо от 42В запитываются, а через ШИМ. И там, насколько я понял, где-то 1/4 только на движок пропускается (судя по тому, что максимальное потребление 12Ватт всего, следовательно движки от усредненных 12В работают, а может и меньше), а 42В просто нужно печатающей голове, вот они один трансформатор так съэкономили.

                  1. Я уверен что смогу сделать проще, и вероятно лучше.
                    И кстати пригодится ваше умение работать с железом — для меня самая большая сложность изготовление корпусов и радиаторов.

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

                  1. Понятно.
                    Видимо этот движок действительно изначально на 12В рассчитан, но изоляция обычно хорошо за 50В выдерживает (и вообще там индуктивность и всплески от переключений могут и до сотни вольт дотягивать), поэтому и можно так от 42В с шим включать.
                    Ну и заодно при таком подключении можно делать повышенный момент на старте.
                    Я хочу сказать, что сомневаюсь что капиталисты поставили-бы тягать бумажки движок с серьезным запасом — они скорее-бы пейджерную вибру до мотороллера разогнали, то есть он сейчас тянет, но может быстро загнуться, или просто момент сильно упадет.

                    Детальки конечно можно и переслать, а вы где физически находитесь?
                    Я в Киеве — забыл что тут не форум — там профиль показывается.

                    1. Создавайте тему, скажем, «CNC с DC движками» в ветке «Я делаю!»
                      http://forum.easyelectronics.ru/viewforum.php?f=17
                      Действительно тема явно того стоит.

                      Да, сразу желательно фото энкодеров со стороны деталей и с обратной стороны платы. Там и продолжим обсуждать.

  7. Хотел собрать небольшую фиговину на ШД на базе струйного принтера, почитал интернетов, в том числе этот сайт. Оказалось, что в принтере два шаговика, управляются одной микросхемой. Но вот затыка — ШД биполярные (4 провода), следовательно, для управления ими не получится просто биты по LPT-порту гонять, а с этим-то я справился бы легко.
    Тем временем, думая, что все получится именно так — легкое руление из ЛПТ, я отдал принтер умному дяде, который впаял мне кишку от LPT же на концы управляющей микросхемы.
    Микросхема — Toshiba TB62202F, в даташите на собрата ее 62202AFG я понял, что ее как-то надо программировать что ли.
    Вопрос — как? :) Ассемблер-то я на писюке знаю, в порт биты напихать могу, но как по CLK-DATA-STROBE-RESET пинам задать нужное мне действие? да и данные, вроде, идут серийно.

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

      1. При любом запуске выдаёт: Run-time error ’76’ path not found/
        Прошиваю и подключаю через STK 500.
        Может быть можно посылать команды через какие-нибудь другие приложения Hyper Terminal например.

  8. При любом запуске выдаёт: Run-time error ’76’ path not found/
    Прошиваю и подключаю через STK 500.
    Может быть можно посылать команды через какие-нибудь другие приложения Hyper Terminal например.
    Буду весьма презнателен

  9. Попробуйте запускать из каталога «C:\»…если не будет запускаться, то надо проверить наличие необходимых библиотек в System32.
    Я так понимаю, что Вы под Win7 запускаете? Я под ней не тестировал. Но если получится запустить — напишите, что сделали.

    1. Переместил в С-диск. Та же песня. ОС у меня XP SP3 (попросил еще двух людей попробовать на разных компах — не у кого не запускается).
      О каких библиотеках идет речь? Не могли бы Вы заново собрать прогу в новом компиляторе и решить это вопрос (http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=path+not+found)? За ранее спасибо!

    1. Все, работает. Только вот вопрос. Почему шаговик критится с сильными биениями? Плавно, но через определенные интервалы появляются стуки: где-то раз в 0,5 сек. Провода от шаговика менял местами много раз — только хуже становится. Шаговик униполярный, схема вот: http://clip2net.com/clip/m55316/1307620844-clip-104kb.jpg
      Выходная микра: L298

      За ранее спасибо за ответ(ы)!

    1. Как бы я не игрался с данными — все равно биения сильные.
      Но я поймал момент, когда двигатель вращается равномерно: когда забиваю данные в эти окошки http://clip2net.com/clip/m55316/1307622420-clip-39kb.jpg и нажимаю пуск, двигатель сильно бьют. Но когда нажимаю СТОП, шаговик продолжает вращатся еще секунд 30 … 40. Причем работае очень ровно, как и должен!
      Видимо программа плохо «считает». Как думаете?

Добавить комментарий