Поиск

Управлялка ШД


Протестировал управлялку униполярными двигателями (для реанимации SCORPIO), все работает нормально. Вот такой стенд:

позволяет проверить все необходимые вещи для одной платы. Завтра стенд расширю, чтобы можно было еще две платы подключить и отлаживать все в куче, а потом уже можно будет на SCORPIO это переносить, но сначала сделать еще одну штуку. Штука эта — для управления двигателя в левом нижнем углу фото: чтобы гарантированно не было пропусков шагов, я решил сварганить вот такой колхоз. На заднюю часть вала насадил 200-градационный диск оптического энкодера. Управление, наверное, на STM32F030 сделаю, здесь много ног не потребуется. А вообще, пора переходить с этого колхоза на нормальные моментные приводы: пусть многооборотный сервик «самостоятельно» свое положение и отслеживает!

Протокол

Направление вращения (по или против часовой стрелки) далее задается относительно вида на мотор сзади!
Контроллер поддерживает независимое управление:

  • двумя униполярными шаговыми двигателями, движение которых ограничено парой концевых выключателей: «нулевой», движение за который запрещено, и «вспомогательный», движение за который допускается, — «вспомогательный» концевик блокирует движение в обоих направлениях, «нулевой» — только в отрицательном;
  • «набортным» светодиодом (управление — только «включить/выключить»);
  • тремя ШИМ-каналами (частота таймера ШИМ — 200кГц, на 8 битах это дает частоту ШИМ в 781 Гц), выходное напряжение (5В) снимается с «набортного» LDO, поэтому при необходимости отбора более 200-300мА тока (суммарно) следует использовать дополнительный MOSFET.

Управление шаговыми двигателями выполняется в полушаговом режиме.
Концевые выключатели имеют встроенные слабые подтяжки к шине питания 5В и защищены резисторами 220Ом и суппрессором, поэтому при необходимости прокладки длинной линии к концевику следует установить сильные внешние подтяжки. Принципиальная схема и разведенная печатная плата расположены здесь. Исходный код здесь.

Передача данных выполняется по шине UART (5 Вольт), 9600 бит/с, 8-N-1. Для возможности установки восьми устройств на одной линии связи, Tx микроконтроллера — открытый коллектор, поэтому необходима внешняя подтяжка линии Rx преобразователя USB<->TTL (если таковая в нем отсутствует).
Сразу после включения микроконтроллер выдает свой адрес и текст справки по доступным командам.

Базовый протокол имеет вид: [ addr command data ], где

  • `addr` — адрес устройства (устанавливается перемычками или чип-переключателями на плате);
  • `command` — команда на исполнение;
  • `data` — (опциональные) данные команды.

В случае правильного задания параметров команд возвращается эхо команды с параметрами, иначе в ответе
присутствует err либо -1 вместо параметра. В случае ошибочной команды возвращается справка с полным
их перечнем.
Помимо «собственного» адреса каждый контроллер откликается на команды, отправленные по адресу «широковещательному», для этого в поле addr должна стоять литера b.

Список команд

  • 0, 1 — команды для мотора 0 или 1;
  • r — аппаратный (при помощи watchdog’а) сброс микроконтроллера;
  • G — запрос адреса платы;
  • L [параметр] — запрос состояния «набортного» светодиода (без параметра), либо включить/выключить светодиод (параметр, соответственно, имеет значение 1/0);
  • P ch [параметр] — запрос величины заполнения ШИМ на канале ch (ch принимает значение от 0 до 2, отсутствие сигнала — 0, 5В — 255), либо установка значения заполнения (параметр=0..255);
  • T — запрос значения внутреннего счетчика миллисекунд (по встроенному RC-генератору).

Команды для управления моторами:

  • E — запрос состояния концевиков;
  • L — движение против часовой стрелки;
  • M — получение состояния мотора;
  • N [шаги] — если параметр «шаги» опущен, получение значения оставшихся до остановки шагов (при движении по командам R и L эта величина равна количеству уже пройденных шагов с обратным знаком), иначе — движение на заданное количество шагов (отрицательное значение — против часовой стрелки);
  • O [шаги] — движение по команде N прерывается на каждом вспомогательном концевике, чтобы сойти с него, необходимо использовать эту команду; при опущенном значении «шаги» будет произведено PULLOFFTHESW_STEPS (100) шагов; вне зависимости от параметра «шаги», если по истечению PULLOFFTHESW_STEPS шагов двигатель не съедет с концевика, он будет остановлен;
  • P — получение текущей позиции (в шагах);
  • R — движение по часовой стрелке;
  • S [время] — получить («время» опущено) или задать текущую скорость вращения; фактически эта команда устанавливает период таймеров, генерирующих прерывания для каждого микрошага; основная частота работы таймера — 1МГц, поэтому, например, значение время=5000 соответствует 100 шагам в секунду;
  • X — остановить двигатель;
  • Z — остановить двигатель и обнулить значение счетчика позиции; счетчик текущей позиции каждого шагового двигателя обнуляется либо вручную при помощи данной команды, либо автоматически при движении против часовой стрелки по команде L (команды N и O не сбрасывают счетчик положения на нулевом концевике!).

Выводимое по команде M состояние двигателя фактически отражает состояние соответствующего конечного
автомата:

  • RELAX — двигатель остановлен, напряжение питание с него снято;
  • INFMV+/- — неограниченное по количеству шагов движение по командам L (-) или R (+);
  • STOP — по завершению текущего шага двигатель будет остановлен;
  • MVSTP+/- — движение на заданное количество шагов (влево/вправо в соответствии со знаком);
  • OFFSW+/ — первые PULLOFFTHESW_STEPS шагов «съезда» с концевика (после этого состояние переходит в `MVSTP+/-` или `STOP`);
  • UNDEF — ошибочное (несуществующее) состояние.

Скорость вращения шаговых двигателей лежит в пределах от MIN_USTEP_PERIOD (800мкс на полушаг, т.е. 625 шагов в секунду) до MAX_USTEP_PERIOD (20000мкс на полушаг, т.е. 25 шагов в секунду). Первые ACCEL_USTEPS (100) полушагов двигатели вращаются с постоянным ускорением вплоть до достижения заданной скорости движения, по умолчанию эта скорость составляет DEFAULT_USTEP_PERIOD (2500мкс на полушаг, т.е. 200 шагов в секунду).

Примеры (команда → отклик):

[00E] → [ 0 0 E 0 ] (no esw)
[01E] → [ 0 1 E 3 ] (both - bad situation)
[00L] → [ 0 0 L ] (all OK)
[01L] → [ 0 1 L E 1 ] (on left endswitch)
[00R] → [ 0 0 R E 2 ] (on right endswitch)
[01R][01M] → [ 0 1 M INFMV+ ]
[01N400] → [ 0 1 N 400 ] (start moving)
[01N] → [ 0 1 N 46 ] (steps left)
[00N-300] → [ 0 0 N err ] (on endswitch)
[00O-100] → [ 0 0 O err ] (on left endswitch)
[00O100] → [ 0 0 O 100 ] (on rigth endswitch or out of them)
[01P] → [ 0 1 P 1903 ] (current position in full steps)
[00S] → [ 0 0 S 2500 ] (get speed value)
[01S1500] → [ 0 1 S 1500 ] (set speed value)
[01X] → [ 0 1 X ]
[01Z] → [ 0 1 Z ]
[0r] → сброс
[0G] → [ 0 G 0 ]
[0L] → [ 0 L 0 ], [0L1] → [ 0 L 1 ], [0L] → [ 0 L 1 ]
[0P] → [ 0 P 0 0 ], [0P0100] → [ 0 P 0 100 ], [0P0] → [ 0 P 0 100 ], [0P510] → [ 0 P -1 ], [0P0500] → [ 0 P 0 -1 ]
[0T] → [ 0 T 191593 ]

eddy_em.livejournal.com

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