mirror of
https://github.com/eddyem/scorpio.git
synced 2025-12-07 11:15:12 +03:00
106 lines
6.1 KiB
Plaintext
106 lines
6.1 KiB
Plaintext
Протокол работы.
|
||
|
||
Внимание! Направление вращения (по или против часовой стрелки) относительно вида на мотор сзади!
|
||
|
||
Контроллер поддерживает независимое управление:
|
||
- двумя униполярными шаговыми двигателями, движение которых ограничено парой концевых выключателей:
|
||
"нулевой", движение за который запрещено, и "вспомогательный", движение за который допускается, -
|
||
"вспомогательный" концевик блокирует движение в обоих направлениях, "нулевой" - только в отрицательном;
|
||
- "набортным" светодиодом (управление - только "включить/выключить");
|
||
- тремя ШИМ-каналами (частота таймера ШИМ - 200кГц, на 8 битах это дает частоту ШИМ в 781 Гц),
|
||
выходное напряжение (5В) снимается с "набортного" LDO, поэтому при необходимости отбора более
|
||
200-300мА тока (суммарно) следует использовать дополнительный MOSFET.
|
||
|
||
Управление шаговыми двигателями выполняется в полушаговом режиме.
|
||
Концевые выключатели имеют встроенные слабые подтяжки к шине питания 5В и защищены резисторами 220Ом
|
||
и суппрессором, поэтому при необходимости прокладки длинной линии к концевику следует установить
|
||
сильные внешние подтяжки. Схема: https://github.com/eddyem/scorpio/tree/master/kicad/stm8_platform
|
||
Код: https://github.com/eddyem/scorpio/tree/master/STM8/2stepper4reductor
|
||
|
||
Передача данных выполняется по шине 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 ]
|