Управлялка ШД
Oct. 10th, 2018 02:05 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Протестировал управлялку униполярными двигателями (для реанимации SCORPIO), все работает нормально. Вот такой стенд:
позволяет проверить все необходимые вещи для одной платы. Завтра стенд расширю, чтобы можно было еще две платы подключить и отлаживать все в куче, а потом уже можно будет на SCORPIO это переносить, но сначала сделать еще одну штуку. Штука эта — для управления двигателя в левом нижнем углу фото: чтобы гарантированно не было пропусков шагов, я решил сварганить вот такой колхоз. На заднюю часть вала насадил 200-градационный диск оптического энкодера. Управление, наверное, на STM32F030 сделаю, здесь много ног не потребуется. А вообще, пора переходить с этого колхоза на нормальные моментные приводы: пусть многооборотный сервик "самостоятельно" свое положение и отслеживает!
Направление вращения (по или против часовой стрелки) далее задается относительно вида на мотор сзади!
Контроллер поддерживает независимое управление:
Управление шаговыми двигателями выполняется в полушаговом режиме.
Концевые выключатели имеют встроенные слабые подтяжки к шине питания 5В и защищены резисторами 220Ом и суппрессором, поэтому при необходимости прокладки длинной линии к концевику следует установить сильные внешние подтяжки. Принципиальная схема и разведенная печатная плата расположены здесь. Исходный код здесь.
В случае правильного задания параметров команд возвращается эхо команды с параметрами, иначе в ответе
присутствует err либо -1 вместо параметра. В случае ошибочной команды возвращается справка с полным
их перечнем.
Помимо "собственного" адреса каждый контроллер откликается на команды, отправленные по адресу "широковещательному", для этого в поле addr должна стоять литера b. На широковещательные посылки контроллеры не отвечают.
Команды для управления моторами:
Выводимое по команде M состояние двигателя фактически отражает состояние соответствующего конечного
автомата:
Скорость вращения шаговых двигателей лежит в пределах от MIN_USTEP_PERIOD (800мкс на полушаг, т.е. 625 шагов в секунду) до MAX_USTEP_PERIOD (20000мкс на полушаг, т.е. 25 шагов в секунду). Первые ACCEL_USTEPS (100) полушагов двигатели вращаются с постоянным ускорением вплоть до достижения заданной скорости движения, по умолчанию эта скорость составляет DEFAULT_USTEP_PERIOD (2500мкс на полушаг, т.е. 200 шагов в секунду).
Примеры (команда → отклик):
позволяет проверить все необходимые вещи для одной платы. Завтра стенд расширю, чтобы можно было еще две платы подключить и отлаживать все в куче, а потом уже можно будет на 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 ]