eddy_em: (Default)
eddy_em ([personal profile] eddy_em) wrote2018-10-10 02:05 pm

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

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

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

Протокол


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

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

  • "набортным" светодиодом (управление - только "включить/выключить");

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

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


Передача данных выполняется по шине UART (5 Вольт), 9600 бит/с, 8-N-1. STM8 не имеет возможности работы линии Tx USART в режиме "открытый коллектор", поэтому для возможности установки восьми устройств на одной линии связи, Tx микроконтроллера включается лишь на время ответа.


Базовый протокол имеет вид: [ 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 ]


Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org