eddy_em: (Default)
[personal profile] eddy_em
Протестировал управлялку униполярными двигателями (для реанимации SCORPIO), все работает нормально. Вот такой стенд:

позволяет проверить все необходимые вещи для одной платы. Завтра стенд расширю, чтобы можно было еще две платы подключить и отлаживать все в куче, а потом уже можно будет на 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 ]

May 2025

S M T W T F S
    123
45678910
11121314151617
1819202122 2324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 28th, 2025 09:45 pm
Powered by Dreamwidth Studios