Пока, конечно, рано о системе управления говорить: как таковой ее еще нет (т.к. надо будет интегрировать туда управление не только подвижками с вращателями, но и турелями фильтров и светоприемником - но это уже будет не моя задача, я с GUI дел не имею). Но СУ подвижками с вращателями уже отработал на макете.
Рабочий стол
Выпаял феном две выгоревших микросхемы драйверов с платок и впаял новые. Сейчас проверил - все отлично работает. Правда, ток надо тщательно настроить, т.к. сейчас драйвера ощутимо греются (секунд за 10 работы двигателя без нагрузки палец ощущает уже приличный жар - под 60°C).
На старой макетке еще даже остались "рожки да ножки" от генератора на 555, который я использовал при самой первой сборке фотометра (вручную крутить валы замучишься!). Сами платы (их фото я уже приводил) будут расположены драйверами вниз и поджаты к стенкам. Таким образом через дюралевые прослойки радиатором драйверов будет служить корпус прибора.
Двигатель и драйвер
Очень кстати пригодилась пара купленных когда-то на алиэкспрессе девборд STM32F030, да и два десятка переходников USB<->TTL. Их можно увидеть в правой верхней части фото. Посередине - платка с датчиками Холла и кнопками управления, к стержню ручки прицеплен магнит (с ибея ☺) - так им удобней пользоваться.
"Мозги" и концевики
С разгоном-торможением я особо не заморачивался: если шагов хватает, двигатель разгоняется/тормозит, иначе - движется на минимальной скорости. Процедуры разгона и торможения занимают не более пятидесяти шагов двигателя, вот
видео. Если под нагрузкой 50 шагов на разгон будет маловато, сделаю это настраиваемым параметром, как и некоторые остальные.
Нынешний протокол управления описан
на гитхабе. Там все настолько подробно, что дублировать здесь я не буду, лишь вкратце изложу.
Все довольно просто: первым символом команды должен быть номер платы (прошивается в ее флеш-памяти во время первичной настройки), далее идет литера, означающая метод, который надо вызвать: управление мотором, сеттер, геттер, запись во флеш-память текущих настроек или софт-ребут.
Геттеры позволяют узнать значение какого-либо параметра: напряжений, токов, температуры чипа (очень грубо), текущую конфигурацию, "сырые" значения АЦП и состояние двигателей.
Сеттеры задают различные параметры конфигурации и позволяют изменять текущую скорость мотора.
Команд управления мотором всего две: двигаться на N шагов или же остановиться.
Вот сейчас, кстати, подумал, что я неправильно сделал, "железно" ограничив движение моторов за концевики. Это не позволит быстро повернуть вращатель на угол больше 180°. Но это и ежу понятно, что алгоритм будет еще неоднократно допиливаться в ходе юстировки и тестовой эксплуатации прибора.
Концевики подвижек - датчики Холла - посажены вместе с управляющими кнопками на входы АЦП. Концевик[и] вращателя висит просто на цифровом входе (с внутренней подтяжкой к плюсу).
Для обеспечения плавности хода двигателей оба они работают от отдельных таймеров (выход ШИМ с положительным импульсом длиной 20мкс, за которым следует нулевой импульс нужной длины - в зависимости от текущей скорости. В прерывании таймера вызывается короткая процедура анализа текущего состояния шаговиков. Два внутренних счетчика микрошагов инкрементируются, пока не будет выполнен полный шаг, лишь тогда выполнение передается дальше. Дальше - простое ветвление по состояниям КА: управление скоростью в фазах ускорения/замедления и останов двигателя (с отключением удерживающего питания) в фазах STOP.
Анализ концевиков проводится не чаще одного раза в миллисекунду в процедуре, вызываемой из основного цикла main(). Для защиты от дребезга концевик считается сработавшим лишь через 3мс, кнопка - через 100мс. Если сработал концевик, в сторону которого движется двигатель, состояние последнего меняется на STOP (т.е. как только он завершит шаг, будет остановлен). Если сработала кнопка в состоянии движения любого мотора, этот (или оба) мотор останавливается. Если же при нажатии кнопки моторы покоились, то подвижка придет в движение в сторону того концевика, к которому подключена кнопка. Еще одна функция - одновременное нажатие обеих кнопок - позволит выкрутить в нуль вращатель (возможно, при юстировке пригодится, не знаю).
Если написанное еще раза в 3 разбавить текстом, получится нормальное описание протокола управления поляризационной модой фотометра. Но т.к. этого никто не будет делать, я хотя бы в ЖЖ потихоньку буду строчить краткую документацию.