Протокол контроллера TeA
Постепенно развиваю "чайный" контроллер. Думаю, по протоколу уже вряд ли что-то нужно будет добавить. Намедни отладил CAN (т.к. я им с самого начала не занимался, там было много косяков).
Все базовые вещи работают как по USB, так и по CAN. А вот некоторые отладочные и конфигурационные параметры доступны лишь по USB. Для начала приведу USB-протокол. Как обычно, он текстовый.
Общие с CAN команды имеют вид команда [N [= val]]. Без указания N используются различные специальные команды-геттеры. Относящиеся к подвижкам команды имеют номер N, указывающий на конкретную подвижку (0 - X, 1 - Y, 2 - Z). В случае, если команда является сеттером, после номера необходимо поставить знак "=" и указать новое значение (int32_t). В случае ошибки (когда функция возвращает не 0) в выводе дополнительно печатается "ERRCODE=код ошибки". Если введена неправильная команда, выводится весь список команд с расшифровкой.
Специальные команды
Параметры настроек
Команды управления шаговыми двигателями
Команды только для USB
В случае нулевой длины посылки, выполняется команда "ping". Иначе длина может составлять 2, 3 или 8 байт (иначе возвратится ошибка). Все команды в формате Little Endian.
Ответная посылка лишь в случае "ping" имеет длину, совпадающую с длиной входящего сообщения (оно просто отправляется обратно). В случае ошибки длина сообщения 4 байта, в случае нормального завершения команды - 8 байт (всегда возвращается геттер).
Первые два байта - код команды. Второй - номер параметра (номер канала АЦП, шаговика и т.п.). Третий используется лишь в ответе - код ошибки. Оставшиеся четыре байта - данные (int32_t).
Коды ошибок озвучены выше. Коды команд следующие:
При движении шаговиков реализован трапециевидный или треугольный рамп (в зависимости от того, насколько далеко нужно двигаться). Ускорение на старте и останове одинаково. В случае невозможности движения двигатель получает состояние STALL, после которого количество попыток "соскочить" из заклинивания увеличивается в пять раз (но не учитывается направление движения при заклинивании, поэтому при попытке движения в ту же сторону можно лишь усугубить ситуацию, когда двигатель уже вообще не сможет самостоятельно выйти из этой ловушки).
Пока что реализовано лишь независимое движение. Возможно, когда-нибудь добавлю и зависимое (которое нужно для всяких ЧПУ). Движение выполняется исключительно на целое количество шагов, т.к. промежуточные положения нестабильны (особенно если отключать питание при простое моторов). Флаг "эмуляция серводвигателя" позволяет пытаться удержать текущее положение при внешних воздействиях (но если это окажется невозможным, выставляется флаг STALL и попытки прекращаются вплоть до нового воздействия).
Испытание движения при горизонтальном положении фланца показало, что ось X лучше не дергать быстрей 1000ш/с, ось Y — 1500ш/с, ось Z — 2000ш/с. Надо будет еще в горизонтальных положениях испытать, чтобы определить точно предельные скорости.
В случае, если на текущей скорости перемещение двигателя в шагах не соответствует приведенному на шаги перемещению энкодера, скорость уменьшается в два раза, двигатель переходит в состояние ACCEL (кроме движения с минимальной скоростью). Если за 5 попыток не удастся восстановить стабильное движение, устанавливается состояние STALL, а мотор останавливается. Могу снять ролик, как надрывно мотор X пытается ехать на скорости выше 1300ш/с (только разгонится, как наступает пропуск шагов, скорость сбрасывается в 2 раза и он опять пытается разогнаться, и так - пока не достигнет нужного положения).
Все базовые вещи работают как по USB, так и по CAN. А вот некоторые отладочные и конфигурационные параметры доступны лишь по USB. Для начала приведу USB-протокол. Как обычно, он текстовый.
Протокол USB
Общие с CAN команды имеют вид команда [N [= val]]. Без указания N используются различные специальные команды-геттеры. Относящиеся к подвижкам команды имеют номер N, указывающий на конкретную подвижку (0 - X, 1 - Y, 2 - Z). В случае, если команда является сеттером, после номера необходимо поставить знак "=" и указать новое значение (int32_t). В случае ошибки (когда функция возвращает не 0) в выводе дополнительно печатается "ERRCODE=код ошибки". Если введена неправильная команда, выводится весь список команд с расшифровкой.
Специальные команды
- adc
- получить "сырые" значения по каналам АЦП, где 0 и 1 — внешние каналы, 2 и 3 — внутренние (температура МК и Vdd, соответственно);
- button
- состояние кнопок, это — единственная функция, где основное событие передается через код ошибки (т.к. возвращаемым параметром является время события): 0 - нет событий, 1 - кнопка нажата менее PRESSTHRESHOLD миллисекунд, 2 - кнопка нажата дольше HOLDTHRESHOLD миллисекунд, 3 - кнопка отпущена;
- buzzer
- состояние пищалки (1 - включить, 0 - выключить);
- esw
- состояние концевиков, если не указан номер, возвращается массив, где каждый байт — состояние конкретного концевика (0 - не активен, 1 - активен);
- ext
- состояние одного из трех внешних выходов (0 - земля, 1 - 5 Вольт);
- mcut
- температура МК (/10℃);
- mcuvdd
- напряжение питания МК (/100В);
- ping
- (в тестовых целях) обычное эхо;
- pwm
- значения ШИМ-каналов (в данном случае канал только один с номером 0), от 0 до 255;
- relay
- состояние реле (0 - выключить, 1 - включить);
- reset
- перезагрузить МК;
- time
- время (в условных мс) от включения или перезагрузки;
Параметры настроек
- accel
- ускорение (одинаково для разгона и торможения, шагов/с²);
- encrev
- количество импульсов энкодера на один оборот шаговика (количество шагов на оборот жестко фиксировано: 200);
- encstepmax
- наибольшее количество отсчетов энкодера на шаг (это и следующее — для контроля пропуска шагов);
- encstepmin
- наименьшее количество отсчетов энкодера на шаг;
- eswreact
- реакция на концевики: 0 - игнорировать, 1 - тормозить в любом направлении (может использоваться лишь временно, т.к. в данном случае нельзя будет сойти с концевика), 2 - тормозить при движении в отрицательном направлении;
- maxspeed
- предельная скорость (шагов в секунду);
- maxsteps
- предельное отклонение (в шагах) от "нулевого" положения;
- microsteps
- количество импульсов на один шаг (степень двойки);
- minspeed
- наименьшая скорость (с которой стартует/останавливается двигатель, шагов в секунду);
- motflags
- специальные флаги, битовое поле, где биты: 0 - реверс мотора (значение пина DIR при движении в положительном направлении), 1 - реверс энкодера (или можно поменять местами провода A и B), 2 - у данного двигателя есть энкодер, 3 - снять напряжение с ШД после останова, 4 - инверсия состояния концевиков (т.е. активные будут подтянуты к Vdd, а не земле), 5 - "эмуляция сервомотора" (сохранение текущей позици вала);
- saveconf
- сохранить текущие настройки во флеш-памяти;
- speedlimit
- геттер предельной скорости, учитывая текущую настройку микрошагов (в ш/с);
Команды управления шаговыми двигателями
- abspos
- абсолютное положение (в шагах);
- emerg
- аварийный (без плавного торможения) останов всех моторов;
- emstop
- аварийный (без плавного торможения) останов мотора;
- encpos
- положение в отсчетах энкодера (в т.ч. сеттер);
- gotoz
- выполнить процедуру выхода на концевик с обнулением счетчиков (мотор быстро движется в "минусовую" сторону, по достижению энкодера на минимальной скорости с него съезжает);
- motreinit
- переинициализация двигателей после смены настроек (счетчики положения не сбрасываются при этом);
- relpos
- относительное положение (в шагах), геттер дает количество оставшихся шагов (в т.ч. при движении в абсолютное положение);
- relslow
- движение на минимальной скорости на относительное количество шагов;
- state
- состояние шаговика: 0 - простой, 1 - ускорение, 2 - движение с максимальной скоростью, 3 - движение с минимальной скоростью, 4 - торможение, 5 - "заклинило", 6 - ошибка;
- stop
- плавный останов двигателя;
Команды только для USB
- canid
- CAN идентификатор (т.к. осталась лишь одна свободная нога, я отказался от установки идентификатора перемычками, зато можно все 11 бит использовать);
- canspeed
- скорость (в килободах) CAN-интерфейса;
- delignlist
- очистить программный список игнорирования принимаемых идентификаторов (для режима CAN-USB транслятора);
- dfu
- активировать режим DFU (требует ручной перезагрузки после прошивки);
- dumperr
- дамп кодов ошибки: 0 - все в порядке, 1 - неправильный номер параметра, 2 - неправильное значение параметра, 3 - неправильная длина сообщения, 4 - неизвестная команда, 5 - команда не может быть выполнена (например, требуется запустить двигатель, когда он уже движется);
- dumpcmd
- дамп кодов команд для CAN;
- dumpconf
- дамп текущих настроек (параметр = значение);
- filter
- добавить/изменить/удалить аппаратный CAN-фильтр (не разрешается удалять фильтр, пропускающий сообщения на собственный идентификатор), формат: <номер банка фильтров (0..27)> <номер FIFO (0/1)> <режим (M - по маске, I - по идентификатору)> <числа (до четырех) - идентификаторы или маски>;
- getctr
- получение значения TIMx->CTR (x=1..3);
- ignbuf
- вывести список идентификаторов программного игнорирования (до 10 штук);
- ignore
- добавить идентификатор в список программного игнорирования;
- listfilters
- список всех активных фильтров;
- pause
- прервать отображение входящих CAN-пакетов (в соответствии с фильтрами);
- resume
- продолжить отображение входящих CAN-пакетов;
- send
- переслать данные по CAN, формат: ID [данные], где ID - идентификатор (число в двоичной, восьмеричной, десятичной или шестнадцатеричной системе), данные - от нуля до восьми байт (тоже в любой системе);
- wd
- проверить "сторожевого пса".
CAN-протокол
В случае нулевой длины посылки, выполняется команда "ping". Иначе длина может составлять 2, 3 или 8 байт (иначе возвратится ошибка). Все команды в формате Little Endian.
Ответная посылка лишь в случае "ping" имеет длину, совпадающую с длиной входящего сообщения (оно просто отправляется обратно). В случае ошибки длина сообщения 4 байта, в случае нормального завершения команды - 8 байт (всегда возвращается геттер).
Первые два байта - код команды. Второй - номер параметра (номер канала АЦП, шаговика и т.п.). Третий используется лишь в ответе - код ошибки. Оставшиеся четыре байта - данные (int32_t).
Коды ошибок озвучены выше. Коды команд следующие:
- 0
- эхо;
- 1
- состояние реле (1/0);
- 2
- состояние пищалки (1/0);
- 3
- "сырые" значения АЦП (байт 4 - нулевой канал, 5 - первый и т.д.);
- 4
- состояние кнопок (обязательно указать номер, т.к. в коде ошибки указывается состояние, а в данных - время);
- 5
- состояние концевиков (без параметра - всех, с параметром - заданного);
- 6
- температура МК (/10℃);
- 7
- напряжение Vdd (/100 Вольт);
- 8
- перезагрузить МК;
- 9
- время (в условных мс) от старта;
- 10
- значение ШИМ (0..255);
- 11
- состояние внешних выводов;
- 12
- сохранить текущие настройки;
- 13
- минимальное количество отсчетов энкодера на шаг;
- 14
- максимальное количество отсчетов энкодера на шаг;
- 15
- настройка микрошага;
- 16
- ускорение (шагов/с²);
- 17
- максимальная скорость (ш/с);
- 18
- минимальная скорость (ш/с);
- 19
- получить значение предельной скорости (ш/с) для данной настройки микрошага;
- 20
- максимальное перемещение (в обе стороны от нуля) в шагах;
- 21
- количество отсчетов энкодера на оборот ШД;
- 22
- специальные флаги двигателей;
- 23
- реакция на концевики;
- 24
- переинициализация двигателей после смены настроек;
- 25
- абсолютное положение (в шагах);
- 26
- относительное положение (в шагах), получение количества оставшихся до достижения цели шагов;
- 27
- относительное движение на минимальной скорости;
- 28
- аварийный останов конкретного двигателя;
- 29
- плавный останов двигателя;
- 30
- аварийный останов всех двигателей;
- 31
- выход на нулевой концевик;
- 32
- состояние двигателя;
- 33
- положение в отсчетах энкодера.
При движении шаговиков реализован трапециевидный или треугольный рамп (в зависимости от того, насколько далеко нужно двигаться). Ускорение на старте и останове одинаково. В случае невозможности движения двигатель получает состояние STALL, после которого количество попыток "соскочить" из заклинивания увеличивается в пять раз (но не учитывается направление движения при заклинивании, поэтому при попытке движения в ту же сторону можно лишь усугубить ситуацию, когда двигатель уже вообще не сможет самостоятельно выйти из этой ловушки).
Пока что реализовано лишь независимое движение. Возможно, когда-нибудь добавлю и зависимое (которое нужно для всяких ЧПУ). Движение выполняется исключительно на целое количество шагов, т.к. промежуточные положения нестабильны (особенно если отключать питание при простое моторов). Флаг "эмуляция серводвигателя" позволяет пытаться удержать текущее положение при внешних воздействиях (но если это окажется невозможным, выставляется флаг STALL и попытки прекращаются вплоть до нового воздействия).
Испытание движения при горизонтальном положении фланца показало, что ось X лучше не дергать быстрей 1000ш/с, ось Y — 1500ш/с, ось Z — 2000ш/с. Надо будет еще в горизонтальных положениях испытать, чтобы определить точно предельные скорости.
В случае, если на текущей скорости перемещение двигателя в шагах не соответствует приведенному на шаги перемещению энкодера, скорость уменьшается в два раза, двигатель переходит в состояние ACCEL (кроме движения с минимальной скоростью). Если за 5 попыток не удастся восстановить стабильное движение, устанавливается состояние STALL, а мотор останавливается. Могу снять ролик, как надрывно мотор X пытается ехать на скорости выше 1300ш/с (только разгонится, как наступает пропуск шагов, скорость сбрасывается в 2 раза и он опять пытается разогнаться, и так - пока не достигнет нужного положения).