Протокол работы. Внимание! Направление вращения (по или против часовой стрелки) относительно вида на мотор сзади! Контроллер поддерживает независимое управление: - двумя униполярными шаговыми двигателями, движение которых ограничено парой концевых выключателей: "нулевой", движение за который запрещено, и "вспомогательный", движение за который допускается, - "вспомогательный" концевик блокирует движение в обоих направлениях, "нулевой" - только в отрицательном; - "набортным" светодиодом (управление - только "включить/выключить"); - тремя ШИМ-каналами (частота таймера ШИМ - 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. Для возможности установки восьми устройств на одной линии связи, 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 ]