eddy_em: (Default)
eddy_em ([personal profile] eddy_em) wrote2021-12-03 11:10 pm

Протокол контроллера TeA

Постепенно развиваю "чайный" контроллер. Думаю, по протоколу уже вряд ли что-то нужно будет добавить. Намедни отладил CAN (т.к. я им с самого начала не занимался, там было много косяков).

Все базовые вещи работают как по 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 раза и он опять пытается разогнаться, и так - пока не достигнет нужного положения).

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