Что-то этот простой тип микроконтроллеров прямо-таки пробудил во мне творчество! Очередной поделкой на них стала система управления шаговыми двигателями. Вчера я написал простую
однозадачную управлялку пятью шаговиками (единовременно может двигаться только один ШД: у всех пяти двигателей общие DIR и STP[CLK] и индивидуальные EN). А сегодня развил идею и сделал
многозадачную управлялку тремя шаговиками (можно еще повесить, но т.к. наружу торчит лишь три разных таймера, то пришлось бы мудрить, объединяя оба варианта). Все складываю в общий репозиторий stm8samples на сосфорже, т.к. для каждой подобной мелочевки заводить отдельную репу - перебор.
Ну, а реализована основная часть на двухдолларовой
макетке с ибея на основе STM8S105K4T6C и долларового
переходничка USB<->TTL оттуда же. Для затравки приведу еще картинку (набросал сегодня утром):
Схема макетки на STM8S105.
Управление реализовано простым текстовым интерфейсом: можно даже сеанс screen открыть, и в нем работать. Или запустить привычный мне com. Но я, т.к. готовый клиент от STM32 у меня уже был, взял его и маленько «кастрировал» (мне не нравится в com то, что ему для переноса строк еще и '\r' добавлять надо - нафиг этот график).
При подаче команды 'h' микроконтроллеру, тот выдаст краткую справку (сделано прежде всего для себя, т.к. я часто забываю протоколы, а в документацию лезть лень - да и как-то вяло она у меня пишется, а черновички имеют свойство теряться). В обоих вариантах управление почти одинаковое, за исключением некоторых особенностей.
Однозадачная управлялка
Здесь, как я говорил выше, все (от 1 до 5) шаговые двигатели имеют общие входы: тактовый (STP[CLK]) и задающий направление (DIR), но индивидуальные входы разрешения подачи напряжения на обмотки (ENx). Чтобы не парится с адресацией, я просто повесил ENx на первые пять битов порта B (он в этом МК представлен полностью, в отличие от остальных портов):
Подключение драйвера ШД
От старых забав (ну и для проверки того, что МК не завис) я оставил в обоих вариантах управление частотой мигания "набортного" светодиода при помощи команд '-' и '+', изменяющих полупериод мигания от 0.1 до 10 секунд с шагом в 0.1с (с точностью до точности работы внутреннего RC-генератора).
Скорость (точнее - длительность в микросекундах одного шага) задается командой 'S', за которой следует двухбайтное целое число - длительность (т.о., максимальная длительность шага получается равной примерно 32.7мс == 30.5 шагов в секунду). Узнать текущую скорость можно командой 's'. Скорость можно менять "на ходу" (в обоих вариантах "управлялки").
Узнать, сколько же шагов осталось до конца движения, можно командой 'm'.
Команда 'x' останавливает двигатель, сбрасывая счетчик шагов, а команда 'p' - только приостанавливает (при повторной подаче этой команды двигатель продолжает движение).
Здесь еще реализована команда 'a' (ее нет во второй версии) - добавить к текущему счетчику шагов какое-то количество шагов еще. Особенность ее в том, что она добавляет шаги в ту же сторону, куда движется двигатель. Если в итоге количество шагов будет отрицательным, двигатель меняет направление движения на противоположное.
Кстати, ковыряя второй вариант, я заметил баг: если получится так, что количество добавляемых шагов обнулит счетчик шагов, то двигатель начнет долго и беспощадно двигаться... Надо будет исправить.
Ввод целых чисел сделан, как и для STM32 (оттуда я по сути его и выдрал): в терминал пишутся цифры числа, а как только число записано, вводится любой нецифровой символ (который будет игнорирован!).
Ну и основные команды - '0'..'4'. За ними следует двухбайтное целое - количество полных шагов, которые надо выполнить двигателю с соответствующим номером. Если при этом какой-то из двигателей еще едет, в терминал выдается сообщение об ошибке. Ну, а как только двигатель доедет до пункта назначения, выдается сообщение "stop". Если введено отрицательное число, то двигатель вращается против часовой стрелки. За один раз можно сдвинуться максимум на 32767 шагов, но команда 'a' позволяет выполнять движение сколь угодно долго.
Многозадачная управлялка
Здесь подключение вот какое:
Подключение драйвера ШД
В протокол внесены небольшие изменения (регистр команд) + поправки на то, что надо задавать каждый раз номер ШД. Т.о., все команды пуска/паузы/останова/информации имеют формат <команда><цифра><символ>*[<число><символ>] (символ '*' выводит на терминал МК, подтверждая, что все ОК; иначе выводится сообщение об ошибке). Здесь <команда> - одна из команд, <цифра> - 0..3 (номер движка); далее - опционально (для команд, требующих ввода параметра): <число> - двухбайтное целое.
Действие команд 'S' и 's' аналогично предыдущей версией, за исключением того, что теперь это - длительность дробной части шага (например, при делении на 16 это будет длительность 1/16 шага). Аналогично, команда 'm' отображает, сколько осталось дробных частей шага до конца движения.
Команда 'X' останавливает соответствующий двигатель, а команда 'P' - делает паузу/возобновляет движение.
Команды добавления шагов здесь нет. Основные команды по запуску движения ШД такие же, как в предыдущей версии ('0'..'2'). Т.к. здесь номер двигателя уже указан, за командой сразу следует число - количество дробных частей шага.
Таким образом, в данной версии при дроблении шага на 16 мы получаем максимум 2047 шагов за одну команду. Если надо проехать дальше, следует подождать останова двигателя, а затем дать еще раз команду движения на 2047 шагов. И так, пока не доедет, куда надо.
Еще одной особенностью задания команды движения в данном случае является то, что МК не возмущается, если двигатель еще едет, а устанавливает счетчик шагов в новое значение и продолжает движение. Это сделано специально: данная версия рассчитана на обратную связь по датчикам (т.е. мы не должны считать в шагах текущее положение двигателей), чтобы применить ее, скажем, в корректоре поля.
Однако, и здесь можно ухитриться: если перед задачей нового количества шагов сначала сделать паузу, потом узнать, сколько шагов осталось, то вполне можно реализовать аналог команды 'a' из предыдущей версии.
В принципе, софт у меня всегда "живой", и как тот самолет, достраивается в полете. Если будет необходимо, можно будет счетчики шагов во второй версии сделать четырехбайтными, правда, придется исхитриться в процедуре считывания числа (чтобы не было переполнения).
Ну и как же не похвастаться напоследок: в субботу выдался такой замечательный теплый день, что я весь день провозился с машиной. Смонтировал в багажник светодиодные ленты, чтобы лучше видно было в темноте, а еще воткнул две 12-вольтных розетки по бокам от полки (чтобы из салона можно было иметь к ним доступ) - теперь подзарядить всякую фигню сзади будет совершенно несложно.