mirror of
https://github.com/eddyem/mmpp.git
synced 2025-12-06 02:25:15 +03:00
\documentclass[a4paper,12pt]{extarticle}
\usepackage{listings}
\usepackage{/home/eddy/ed}
\def\lstref#1{(см.~листинг~\ref{#1})}
\lstset{basicstyle=\small\ttfamily,breaklines=true,extendedchars=true,aboveskip=1em,belowcaptionskip=5pt,
prebreak = \hbox{\normalfont\small\hfill\green{\ensuremath{\hookleftarrow}}},
postbreak = \hbox to 0pt{\hss\normalfont\small\green{\ensuremath{\hookrightarrow}}\hspace{1ex}},
commentstyle=\color{blue},showspaces=false,showstringspaces=false,
stringstyle=\bfseries\color[rgb]{0.6,0,1},
keywordstyle=\bfseries\color[rgb]{0,0.1,0.5},
tabsize=4}
\nocolon
\def\Z{Цейсс--1000\xspace}
\title{Многорежимный фотометр--поляриметр (MMPP) телескопа \Z. Техническая документация.}
\author{Емельянов~Э.В. \and Фатхуллин~Т.А.}
\graphicspath{{./imgs/}}
\begin{document}
\maketitle
\tableofcontents
\section{Описание прибора}
MMPP (Multi-Mode Photometer-Polarimeter) "--- многорежимный фотометр-поляриметр телескопа \Z
предназначен для проведения фотометрических и поляриметрических исследований. Прибор оснащен двумя турелями
USB-HSFW (Edmund Optics) с пятью позициями для 50-мм фильтров, анализатором линейной поляризации и
четвертьволновой пластиной. Основным светоприемником фотометра является ПЗС Eagle~V ($2048\times2048\,$пикс),
позволяющий проводить научные исследования в диапазонах от~300 до~1050\,нм с максимумом чувствительности
около 600\,нм. Данный ПЗС оснащен водяным охлаждением. Также прибор рассчитан на использование с быстрым
КМОП-светоприемником Andor NEO~5.5 ($2560\times2160\,$пикс) в режиме <<быстрой фотометрии>> и <<lucky
imaging>>.
В фотометрическом режиме в течение ночи без переоснащения прибора возможна работа в восьми фотометрических
полосах. Изменение рабочего набора фильтров выполняется посредством замены колес в турелях (пять наборов колес
описаны в конфигурации интерфейса управления прибором; нестандартные наборы потребуют изменения конфигурации).
На рис.~\ref{MMPP_optsch} приведена оптическая схема MMPP. Непосредственно на входном фланце закреплен
транслятор поворотной платформы фазовой пластины диаметром 25\,мм. Далее располагается транслятор поворотной
платформы анализатора поляризации диаметром 50\,мм. Последними в корпусе установлены турели фотометрических
фильтров. К задней стенке прибора крепится фланец светоприемника: ПЗС или CMOS.
\TODO[картинка]
\begin{pict}
%\includegraphics{}
\caption{Оптическая схема прибора.}
\label{MMPP_optsch}
\end{pict}
Исходные коды прошивки системы управления, утилит командной строки, принципиальные схемы и pdf-файлы с
чертежами прибора размещены в отдельном репозитории github\footnote{\url{https://github.com/eddyem/mmpp}}.
\section{Оптические характеристики}
\paragraph{Характеристики прибора}
\begin{list}{}{}
\item Теоретическое невиньетированное поле: $11.4'$~в режиме фотометрии, $10.9'$~в режиме линейной поляризации
(оба размера "--- диагонали ПЗС-светоприемника), $2.6'$~в режиме циркулярной поляризации;
\item диагональ светоприемников: ПЗС "--- $10.3'$, КМОП "--- $5.6'$;
\item кривые пропускания фильтров приведены на рис.~\ref{filters_curves};
\item
\end{list}
\TODO[картинки]
\begin{pict}
%\includegraphics{}
\caption{Кривые пропускания фотометрических фильтров системы Джонсона--Коузинса.}
\label{filters_curves}
\end{pict}
\comment[характеристики]{четвертьволновой и поляроида}
\paragraph{Характеристики ПЗС-светоприемника}
\TODO[Тимур]
\section{Механика}
Поворотные платформы фазовой пластины и анализатора поляризации установлены на цилиндрических направляющих,
позволяющих при помощи соединения винт-гайка вводить и выводить их из пучка посредством шаговых двигателей.
Шаг винтового соединения составляет 1\,мм, т.е. поворот шаговых двигателей на один шаг приводит к перемещению
трансляторов на 5\,мкм. Перемещение трансляторов ограничено датчиками Холла~A1101. Точность установки
нуль-пункта трансляторов составляет $\pm0.13\,$мм. В положении <<0>> оба транслятора полностью выведены из
пучка. Полный ход транслятора фазовой пластины составляет около $67.5\,$мм (13500~шагов), транслятора
анализатора поляризации "--- около $145\,$мм (29000~шагов). Положение <<в пучке>> определяется юстировкой
прибора, которую необходимо производить каждый раз после вмешательства в положение трансляторов или концевых
датчиков. В среднем для транслятора фазовой пластины оно составляет 11400~шагов, а для транслятора анализатора
поляризации "--- 16400~шагов.
Четвертьволновая фазовая пластинка приводится во вращение при помощи поворотной платформы 8MPR16-1 фирмы
Standa, в которой аналоговый датчик Холла (служащий для определения нуль-пункта) заменен на A1101 (с
встроенным компаратором и триггером Шмидта). Для вращения анализатора поляризации используется поворотная
платформа 8MR190-2-4233 фирмы Standa. В ней в качестве нуль-пункта используется концевой выключатель.
Конструктивные изменения данной платформы заключаются в удалении разъема типа DS9 и подключения проводки
напрямую (при помощи пайки).
Точность установки нуль-пунктов обеих поворотных платформ составляет~$\pm5'$. Дискрет поворотной платформы
фазовой пластины составляет~$0.75'$ (80~шагов на $1\degr$), дискрет анализатора поляризации "--- $0.6'$
(100~шагов на $1\degr$).
Монтаж фотометра на фланце телескопа \Z выполняется в соответствии с положением меток на фланцах
телескопа и прибора. Аналогично по расположению меток устанавливаются светоприемники. Для удобства
визуализации позиционный угол фланца телескопа должен быть установлен в положение~$337.5\degr$.
\subsection{Система управления}
Так как турели Edmund Optics представляют собой самостоятельные устройства с управлением по USB, система
управления прибором имеет модульную структуру. В приборе размещен USB-концентратор, к которому подключены обе
турели с фильтрами, а также преобразователь интерфейсов USB$\leftrightarrow$TTL для работы с модулями
управления парой шаговых двигателей.
\subsubsection{Турели}
Протокол управления турелями HSFW Edmund Optics не был документирован фирмой-изготовителем, поэтому был
восстановлен методом обратной разработки. Устройство работает через HID-интерфейс и не нуждается для работы в
правах суперпользователя.
Для управления устройством разработана утилита
\verb'HSFW_management'\footnote{\url{https://github.com/eddyem/eddys_snippets/tree/master/HSFW_management},
там же "--- примеры работы с утилитой} \lstref{hsfwman}, полностью реализующая возможности турелей: поиск
среди устройств по идентификатору, названию колеса или названию фильтра; перемещение заданного колеса в
требуемую позицию; реинициализация с перемещением в стартовую позицию; сохранение сведений о фильтрах в
различных колесах в EEPROM устройства.
Турели поддерживают до пяти разных колес с фильтрами. Маркировка колес выполняется при помощи постоянного
магнита, вклеиваемого в соответствующее отверстие на колесе. При подготовке нового колеса необходимо
убедиться, что маркирующий магнит вклеен в соответствии с полярностью магнита, задающего положение нуль-пункта
(см.~рис.~\ref{wheel_naming}).
\TODO[картинка]
\begin{pict}
%\includegraphics{}
\caption{Маркировка колес с фотометрическими фильтрами.}
\label{wheel_naming}
\end{pict}
\begin{lstlisting}[caption=Краткая справка по параметрам утилиты {\tt HSFW\_manage},label=hsfwman]
-H, --home переместиться в стартовую позицию
-N, --wheel-name=arg название колеса
-W, --wheel-id=arg буквенный идентификатор колеса
-h, --help отобразить эту справку
-i, --filter-id=arg идентификатор фильтра, например, "A3"
-n, --filter-name=arg название фильтра
-p, --f-position=arg номер позиции фильтра
-s, --serial=arg серийный номер турели (с начальными нулями)
--list список имен только присутствующих устройств
--list-all список всех сохраненных имен
--rename переименовать сохраненные имена
колес/фильтров
--resetnames сбросить все названия в значения по умолчанию
\end{lstlisting}
\subsubsection{Управление шаговыми двигателями}
Каждый линейный транслятор в совокупности с соответствующей поворотной платформой и управляющим контроллером
оформлен как отдельное устройство. Протокол управления приведен в приложении~\ref{MMPP_control}.
Все управляющие контроллеры размещаются на одной сигнальной шине UART (протокол: 8N1). Сигналы Tx контроллеров
подключаются по схеме <<открытый сток>> с использованием внешней или слабой внутренней подтяжки. Скорость
интерфейса задается в настройках контроллера, по умолчанию это 115200~бод.
Система управления построена на основе микроконтроллера STM32F030 (см.~рис.~\ref{MMPP_scheme}). Запись
микропрограммы выполняется посредством встроенного в микроконтроллер бутлоадера (для его активации на плате
размещены кнопки <<boot>> и <<reset>>). При помощи датчика тока MAX471 возможно измерение потребляемого
двигателями в процессе работы тока. Микроконтроллер формирует сигналы STEP\slash DIR, которые преобразуются в
силовые сигналы для шаговых двигателей при помощи модулей на основе драйверов DRV8825. В случае замены
драйверов, до подключения шаговых двигателей требуется выставить предельный потребляемый ток в соответствии с
таблицей~\ref{MotCurrents} в приложении. Драйверы работают в режиме дробления шага на~16, однако, система
управления не позволит переместить шаговый двигатель на дробное количество шагов, т.к. после окончания
движения двигатель обесточивается.
Система обеспечивает плавный разгон и торможение двигателей (кроме ситуаций наезда на концевик). Интерфейсы
подключения концевых выключателей различаются: для двигателя~1 концевики подключаются к аналоговым входам МК,
что позволяет параллельно ним установить дополнительные кнопки управления с сильной подтяжкой (резисторы
сопротивлением 47~кОм) к земле. Данные кнопки выведены на лицевую панель прибора и позволяют управлять
перемещением трансляторов без компьютера (для проверки работоспособности системы и перемещения транслятора
анализатора поляризации при замене нижней турели светофильтров).
Номер контроллера (по умолчанию "--- 0) хранится во внутренней флеш-памяти МК. Контроллер анализатора
поляризации имеет номер~1, контроллер фазовой пластины "--- 2. В случае замены контроллера до установки его в
прибор необходимо провести базовые настройки в соответствии со списком на стр.~\pageref{MMPP_basesettings}.
Сразу после включения питания контроллеры находятся в неинициализированном состоянии. Для их инициализации в
ручном режиме необходимо сместить все позиционные устройства в положительном направлении на небольшую величину
(для гарантированного съезда с нулевого концевика), а затем двигать их в отрицательном направлении на
количество шагов, превышающее рабочий диапазон "--- для установки на нулевые концевики. Далее до следующего
отключения питания эту процедуру проводить не нужно.
Для удобства управления устройствами MMPP разработана утилита
\verb'MMPP_control'~\footnote{\url{https://github.com/eddyem/mmpp/tree/master/MMPP_control}}
\lstref{mmppcontrman}.
\begin{lstlisting}[caption=Краткая справка по параметрам {\tt MMPP\_control},label=mmppcontrman]
-A, --absmove абсолютное движение (без этого флага заданное
количество шагов рассматривается как
относительное)
-L, --lin1=arg перемещение линейного транслятора поляроида на
N шагов
-R, --rot1=arg вращение поляроида на заданный угол (в градусах)
-S, --stop прекратить любое движение
-a, --sendraw=arg отправить в порт заданную управляющую
последовательность символов напрямую
-d, --comdev=arg имя устройства последовательного порта
-h, --help отобразить данную справку
-l, --lin2=arg перемещение линейного транслятора фазовой
пластины на N шагов
-q, --quiet не отображать никакой информации в stdout
-r, --rot2=arg вращение фазовой пластины на заданный угол
(в градусах)
-s, --status получение состояния устройства
-t, --temp отображение температуры (довольно условной)
микроконтроллеров
-w, --wait ожидание окончания движения узлов (если
предыдущая команда выполнялась с -y)
-y, --async не ожидать окончания движения
\end{lstlisting}
\section{Интерфейс системы управления}
\comment[Тимур]{конфигурационный файл колес}
\label{wheels_config}
\section{Приложения}
\subsection{Замена колес с фильтрами}
Доступ к колесам турелей осуществляется через лицевую панель фотометра. Для замены соответствующего колеса
необходимо ослабить винт, фиксирующий колесо в турели, открыть крышку турели, поменять колеса, затянуть
фиксирующий винт и закрыть крышку турели.
Расположение элементов указано на рис.~\ref{wheel_change}. Доступ к фиксирующему винту нижней турели
осуществляется через боковую крышку. Чтобы ослабить этот винт, необходимо сначала переместить транслятор
анализатора поляризации (контроллер \No\,1) на концевик~1. Это реализуется либо через интерфейс управления
прибором, либо посредством сервисных кнопок, расположенных над боковой крышкой.
\TODO[картинка]
\begin{pict}
%\includegraphics{}
\caption{Расположение элементов турелей.}
\label{wheel_change}
\end{pict}
Первая и вторая кнопки управляют транслятором анализатора поляризации, третья и четвертая "--- транслятором
фазовой пластины. В каждой группе нажатие левой кнопки вызывает движение транслятора в сторону концевика~0,
нажатие правой "--- в сторону концевика~1~(см.~рис.~\ref{buttons}).
\TODO[картинка]
\begin{pict}
%\includegraphics{}
\caption{Расположение кнопок управления положением линейных трансляторов.}
\label{buttons}
\end{pict}
Расположение фильтров в колесе должно быть указано в соответствующем конфигурационном файле интерфейса
системы управления прибором (см.~стр.~\pageref{wheels_config}).
После окончания замены колес турели находятся в неинициализированном состоянии. Для их инициализации
необходимо выполнить одну из процедур: либо проводить замену с отключенным питанием контроллера (в этом
случае инициализация турелей произойдет автоматически, однако, необходимо будет выполнить инициализацию
подвижных элементов MMPP), либо при помощи интерфейса системы управления или утилиты \verb'HSFW_manage'
установить оба колеса в положение <<home>>.
\subsection{Методика установки нуль-пунктов}
Для установки нуль-пунктов линейных трансляторов используются вспомогательные рамки с натянутыми на них
нитяными крестами (см.~рис.~\ref{aux_frames}). Рамки устанавливаются вместо оптических узлов: фазовой
пластины, анализатора поляризации и двух фильтров. Контрольный выходной крест натягивается также на фланец
ПЗС-светоприемника. Для контрольной засветки оптического тракта используется крестообразный лазерный
осветитель, устанавливаемый на специальном фланце во входном окне прибора. Регулировочными винтами необходимо
добиться совмещения центра изображения креста осветителя с центром нитяного креста на фланце ПЗС. Дальнейшая
юстировка производится визуально, либо при помощи вспомогательной видеокамеры с объективом-трансфокатором.
\TODO[картинка]
\begin{pict}
%\includegraphics{}
\caption{Вспомогательные юстировочные рамки.}
\label{aux_frames}
\end{pict}
Юстировка турелей фильтров производится следующим образом. При помощи интерфейса системы управления либо
утилиты \verb'HSFW_manage' в обеих турелях выставляются позиции с нитяными крестами. Далее путем регулировки
трех фиксирующих винтов турель центруется относительно удерживающего цилиндра
(см.~рис.~\ref{turrets_centering}). После центровки турелей оба колеса необходимо установить в положение
<<hole>>, чтобы освободить оптический тракт для установки нуль-пунктов линейных трансляторов.
\TODO[картинка]
\begin{pict}
%\includegraphics{}
\caption{Схема установки турелей с фильтрами.}
\label{turrets_centering}
\end{pict}
Для определения нуль-пунктов трансляторов можно использовать кнопки на боковой панели прибора, при помощи
которых необходимо грубо совместить перекрестие нити в соответствующем оптическом узле с изображением креста
осветителя. Точное совмещение выполняется при помощи интерфейса системы управления или утилиты
\verb'MMPP_control'. По данным \verb'MMPP_control' определяются положения нуль-пунктов \lstref{zeropoints}
транслятора анализатора поляризации (Pol: M0POS) и фазовой пластины (L/4: M0POS).
\begin{lstlisting}[caption=({\tt MMPP\_control -s}),label=zeropoints]
Pol: M0ST M0LEFT M0POS - M1ST M1LEFT M1POS || L/4: M0ST M0LEFT M0POS - M1ST M1LEFT M1POS
Pol: STOP 0 16400 - STOP 0 0 || L/4: STOP 0 11400 - STOP 0 0
ESW00 ESW01 ESW10 ESW11 || ESW00 ESW01 ESW10 ESW11
RLSD RLSD HALL RLSD || RLSD RLSD HALL RLSD
\end{lstlisting}
Для определения положений нуль-пунктов анализатора поляризации и четвертьволновой пластины необходимо
использовать дополнительное оборудование: осветитель, оснащенный поляризатором с известным направлением
поляризации, а также формирователь круговой поляризации с известным направлением вращения (поляризатор и
четвертьволновая пластина). Возможно также определение нуль-пунктов поляризационной оптики при помощи
наблюдения стандартов с линейной и круговой поляризацией.
Определение нуль-пункта анализатора поляризации производится при помощи вспомогательного поляроида,
осветителя с объективом и светоприемника (при достаточной яркости осветителя в качестве светоприемника
возможно использовать фоторезистор). Получить поляризованный в данной плоскости свет можно при помощи
куска поляризующей пленки из жидкокристаллических мониторов. Юстировка плоскости поляризатора производится
при помощи поляризационной стопы, поляризационной призмы (например, призмы Глана) или поляризатора с известным
направлением плоскости поляризации.
После юстировки осветителя необходимо осветить им оптический тракт прибора и сфокусировать на светоприемнике.
Далее требуется линеаризовать показания светоприемника. Это можно сделать, изменяя степень заполнения ШИМ
источника питания осветителя (осветителем может выступать светодиод, для минимизации влияния импульсного
характера осветителя на точность измерений рекомендуется задавать максимальную частоту ШИМ, от 100\,кГц и
выше). В случае использования фоторезистора освещенность хорошо аппроксимируется функцией $I =
a\cdot\exp(b-\ln R)$ (см.~рис.~\ref{photores_cali}). Далее строится зависимость освещенности светоприемника от
угла вращения и по аппроксимации параболой областей вблизи минимумов освещенности определяется положение
скрещенных поляризатора и анализатора, откуда можно определить положение нуль-пункта анализатора поляризации.
После определения нуль-пункта анализатора он выставляется в положение~$90\degr$ по отношению к осветителю, и в
пучок вводится фазовая пластина. Измеряя интенсивность прошедшего света в зависимости от угла вращения
четвертьволновой пластины определяются положения плоскостей ее экстремальных скоростей. Точные значения углов
определяются аналогично "--- из аппроксимации участков вблизи минимумов освещенности
(см.~рис.~\ref{phase_cali}). Для используемой в MMPP четвертьволновой пластины угол между плоскостями
экстремальных скоростей в полосе~R составляет $91.7\degr$. Определить, какая из плоскостей соответствует
максимальной фазовой скорости, можно при помощи источника циркулярно поляризованного света с известным
направлением вращения плоскости поляризации.
\TODO[картинка]
\begin{pict}
%\includegraphics{}
\caption{Пример графика зависимости сопротивления фоторезистора от интенсивности освещения.}
\label{photores_cali}
\end{pict}
\TODO[картинка]
\begin{pict}
%\includegraphics{}
\caption{Интенсивность излучения вблизи плоскостей экстремальных скоростей фазовой пластины.}
\label{phase_cali}
\end{pict}
\subsection{Порядок сборки и замены узлов прибора}
Распайка разъема питания:
1 - земля,
2 - нуль,
3 - фаза.
\TODO[Уйма фотографий со стадиями сборки прибора]
Подключение проводов: Rx/Tx преобразователя UART-USB к Tx/Rx контроллеров; дополнительно можно установить
сильную (около 4.7\,кОм) подтяжку между +3.3\,В и Rx преобразователя.
\subsection{Система управления линейными трансляторами и поворотными платформами прибора}
\label{MMPP_control}
\subsubsection{Принципиальная схема}
Разработанная на основе микроконтроллера STM32F030F4P6 система управления шаговыми двигателями имеет
модульную структуру. Один модуль управляет двумя биполярными шаговыми двигателями (напряжение питания 12\,В)
с опросом пары аналоговых и пары цифровых (активны при замыкании на нуль) концевиков. На
рис.~\ref{MMPP_scheme} приведена принципиальная схема одного модуля.
\begin{pict}
\includegraphics[width=\textwidth]{steppers}
\caption{Принципиальная схема модуля управления шаговыми двигателями.}
\label{MMPP_scheme}
\end{pict}
Суппрессор~D1 совместно с резисторами~R3 и~R4 (допустимо уменьшить при необходимости сопротивление резисторов
до $68\div100\,$Ом) обеспечивает антистатическую защиту входов микроконтроллера по линии UART.
Кнопки~SW1 (<<reset>>) и~SW2 (<<boot>>) обеспечивают выбор режима загрузки микроконтроллера и аппаратный
сброс при отладке (для перехода в режим встроенного загрузчика по UART необходимо нажать кнопку <<boot>>,
затем, удерживая ее, нажать и отпустить кнопку <<reset>>, после чего отпустить кнопку <<boot>>; далее при
помощи утилиты \verb'stm32flash' или команды \verb'make boot' можно записать файл прошивки во флеш-память
микроконтроллера).
Транзистор~Q1 на входе цепи питания обеспечивает защиту от переполюсовки (при подаче питания в правильной
полярности p-канальный MOSFET находится в открытом состоянии, при переполюсовке он закрыт).
Датчик~U2 (MAX471) служит для измерения тока, потребляемого шаговыми двигателями во время работы. Выход
датчика является источником тока (500\,мкА на каждый Ампер измеряемого тока). Резистор~R6 выступает в качестве
его нагрузки, в результате чего напряжение на выходе RC-фильтра на~R7 и~C8 изменяется по закону 0.75\,В на
каждый Ампер измеряемого тока.
Делитель на резисторах~R8 и~R9 позволяет измерять напряжение в цепи питания прибора. Стабилитрон~D3
ограничивает напряжение, подаваемое на вход АЦП микроконтроллера, величиной менее~3.5\,В. Фильтр на~R10 и~C9
обеспечивает сглаживание пульсаций и быстрых изменений напряжения. Выходное напряжение примерно в 5.7~раз
меньше входного.
Драйверы шаговых двигателей DRV8825 в виде чип-модулей устанавливаются в соответствующие гнезда. Подтяжка
контактов модуля M0$\div$M2 к питанию задает требуемый микрошаговый режим. Конденсаторы~C10 и~C11 (low ESR,
минимум 100\,мкФ) обеспечивают сглаживание пульсаций напряжения питания во время работы драйверов.
Разъемы~J3 и~J8 служат для подключения шаговых двигателей и концевых выключателей. Напряжение питания на
датчики Холла для защиты LDO~U1 подается через резистор~R11. Конденсатор~C7 обеспечивает потребление датчика
Холла во время переходных процессов. Антистатическая защита выходов концевых выключателей обеспечивается
резисторами~R12, R13, R15 и~R22 и суппрессором. Резисторы~R23 и~R24 обеспечивают подтяжку к питанию
аналоговых концевиков, имеющих три градации: 0, Vdd/2 и Vdd. Таким образом, кнопки управления линейными
трансляторами необходимо тоже подтянуть к земле резисторами сопротивлением 47\,кОм.
Отдельно назначение каждого вывода микроконтроллера рассмотрено в таблице~\ref{MCUpins}.
\begin{tbl}
\caption{Назначение выводов микроконтроллера. Тип: AIN~-- аналоговый вход, PUPD~-- выход push\slash pull,
OD~-- выход open drain, FIN~-- плавающий вход, FINPU~-- вход с подтяжкой к Vdd.}
\label{MCUpins}
\begin{tabular}{|c|c|l|}
\hline
\tabstrut\bf Pin & \bf Тип & \bf Назначение \\
\hline
PA0 & AIN & Ток шагового двигателя \tabstrut \\
PA1 & AIN & Напряжение питания (12\,В) \\
PA2 & AIN & Концевик~1 двигателя~0 \\
PA3 & AIN & Концевик~0 двигателя~0 \\
PA4 & PUPD & Такты драйвера двигателя~0 (TIM14\_CH1) \\
PA5 & PUPD & Подача питания на двигатель~1 \\
PA6 & PUPD & Такты драйвера двигателя~1 (TIM3\_CH1) \\
PA7 & PUPD & Направление вращения двигателя~1 \\
PA9 & OD & USART1 Tx \\
PA10& FIN & USART1 Rx \\
PA13& FINPU& Концевик~0 двигателя~1 \\
PA14& FINPU& Концевик~1 двигателя~1 \\
PB1 & PUPD & Управление питанием датчика тока \\
PF0 & PUPD & Подача питания на двигатель~0 \\
PF1 & PUPD & Направление вращения двигателя~0 \\
\hline
\end{tabular}
\end{tbl}
\subsubsection{Протокол управления}
Управление контроллерами производится по шине UART (8N1, скорость задана в конфигурации, по умолчанию
115200\,бод). Команды передаются в строковом режиме: признаком окончания команды является символ новой строки.
Микроконтроллер не обрабатывает принимаемые данные до формирования валидной строки. Символы пробела или
табуляции внутри строки игнорируются. Первым в строке следует номер контроллера (число int32). Данный номер
сохраняется во флеш памяти МК во время его инициализации. Каждый модуль обрабатывает лишь те команды, которые
адресованы ему, либо же имеют широковещательную адресацию (в этом случае в качестве адреса указывается -1).
Так как вывод данных микроконтроллером при получении широковещательного идентификатора не блокируется, не
рекомендуется использовать широковещательные посылки при наличии более одного устройства на линии связи (кроме
посылок экстренного останова, сброса и т.п.).
После идентификатора контроллера следует текст команды и (опционально) ее аргументы. В случае, если команда
валидна, контроллер возвращает строку <<ALL OK>>. Если команда не распознана, возвращается маркер ошибки
<<BADCMD>>. В случае же ошибок в аргументах команды возвращается маркер ошибки <<ERR>>. Если команда
возвращает какую-либо информацию, она следует сразу за маркером <<ALL OK>>. Данные, занимающие более одной
строки текста, завершаются маркером <<DATAEND>>. Если команда лишь требует выполнения определенного действия,
маркер <<ALL OK>> возвращается после установления возможности выполнения данного действия. В силу синхронного
характера интерфейса связи, команды, требующие длительного времени на исполнение (например, перемещение
объекта) не выводят в случае ошибки или достижения заданного положения никаких данных, процесс их исполнения
необходимо контролировать периодическим запросом состояния модуля.
Первым символом в строке команды должен быть один из следующих:
\begin{description}\def\itm#1{\rlap{#1}\phantom{(ничего)}}
\item[(ничего)] команда <<ping>>, в ответ на которую устройство выдает сообщение <<ALIVE>>;
\item[\itm{G}] команда-геттер;
\item[\itm{M}] работа с двигателями;
\item[\itm{R}] программная перезагрузка микроконтроллера (первый после перезагрузки геттер <<status>> вернет
значение <<SOFTRESET=1>>);
\item[\itm{S}] команда-сеттер;
\item[\itm{W}] команда записи во флеш-память значений конфигурации из оперативной памяти.
\end{description}
Программная перезагрузка контроллера может использоваться для повторной инициализации счетчиков положения
двигателей (по опорным концевикам нуль-пунктов). Команду записи данных во флеш-память необходимо вызывать
после изменения конфигурации параметров контроллера и проверки геттером <<configuration>> их значения (за
исключением скорости интерфейса UART все изменения конфигурационных данных сразу отражаются на поведении
контроллера).
\paragraph{Команды-геттеры.}
Данные команды предназначены для вывода в терминал определенной информации. Данные выводятся сразу за маркером
<<ALL OK>>. В случае, если они занимают лишь одну строку (возвращается только один параметр), маркер конца
данных не выводится, при выводе же более одного параметра конец вывода обозначается маркером <<DATAEND>>.
\begin{description}\def\itm#1{\rlap{#1}\phantom{XX}}
\item[\itm{A}] запрос результатов измерения АЦП:
\begin{description}
\item[\itm{D}] значение Vdd$\cdot100\,$В, например, {\tt VDD=330} ($Vdd=3.3\,$В);
\item[\itm{I}] потребляемый обоими моторами ток I$\cdot100\,$А, например, {\tt IMOT=70} ($I=0.7\,$А);
\item[\itm{M}] напряжение питания U$\cdot100\,$В, например, {\tt VMOT=1193} ($U=11.93\,$В);
\end{description}
\item[\itm{C}] получение текущих значений параметров конфигурации, например,
\begin{verbatim}
CONFSZ=36
DEVID=0
V12NUM=1
V12DEN=10
I12NUM=1
I12DEN=1
V33NUM=1
V33DEN=1
ESWTHR=150
MOT0SPD=60
MOT1SPD=60
USARTSPD=115200
REVERSE0=0
REVERSE1=0
MAXSTEPS0=0
MAXSTEPS1=0
DATAEND
\end{verbatim}
\item[\itm{R}] получение <<сырых>> данных с АЦП:
\begin{description}
\item[0] ток ШД;
\item[1] напряжение 12\,В;
\item[2] концевик~1 двигателя~0;
\item[3] концевик~0 двигателя~0;
\item[4] внутренняя температура;
\item[5] Vdd.
\end{description}
например,
\begin{verbatim}
ADC[0]=4095
ADC[1]=2340
ADC[2]=4095
ADC[3]=4087
ADC[4]=1665
ADC[5]=1532
DATAEND
\end{verbatim}
\item[\itm{S}] состояние двигателей (возвращает описанные ниже переменные \verb'MOTORx', \verb'ESWxy',
\verb'POSx' и \verb'STEPSLEFTx').
\item[\itm{T}] условная температура микроконтроллера, например, \verb'TEMP=365'.
\end{description}
\paragraph{Геттеры состояния.}\label{stategetters}
В переменных \verb'MOTORx' ({\tt x} "--- номер двигателя, 0 или 1) хранится текущее состояние конечного
автомата шаговых двигателей.
Ее значение может быть одним из следующих:
\begin{description}\def\itm#1{\rlap{#1}\phantom{STOPZERO}}
\item[\itm{ACCEL}] состояние разгона "--- начало движения;
\item[\itm{DECEL}] состояние торможения "--- окончание движения;
\item[\itm{MOVE}] движение с постоянной скоростью;
\item[\itm{MOVETO0}] бесконечное движение до достижения концевика~0;
\item[\itm{MOVETO1}] бесконечное движение до достижения концевика~1;
\item[\itm{MVSLOW}] движение с наименьшей постоянной скоростью (в случае перемещения на малое количество
шагов);
\item[\itm{SLEEP}] ожидание команд, движение отсутствует;
\item[\itm{STOP}] окончание движения (по запросу);
\item[\itm{STOPZERO}] окончание движения с обнулением положения;
\item[\itm{UNKNOWN}] неизвестное состояние "--- ошибка.
\end{description}
Переменные \verb'ESWxy', где {\tt y}~-- номер концевика (0 или 1), {\tt x}~-- номер двигателя (0 или 1)
отражают состояние концевых выключателей и кнопок.
\begin{description}\def\itm#1{\rlap{#1}\phantom{RLSD}}
\item[\itm{BTN}] (только для концевиков двигателя~0) нажата кнопка;
\item[\itm{ERR}] (только для концевиков двигателя~0) уровень вне допустимых диапазонов;
\item[\itm{HALL}] активен датчик Холла (логический~0);
\item[\itm{RLSD}] концевик неактивен (логическая~1).
\end{description}
Текущее положение (в шагах) двигателя характеризуется переменной \verb'POSx' ({\tt x}~-- номер мотора, 0
или~1). Если ее значение отрицательно, требуется инициализация данного двигателя (движение до концевика~0).
Во время движения геттер состояния возвращает также значение переменной \verb'STEPSLEFTx' "--- оставшееся
количество шагов.
В случае, если до вызова геттера состояния контроллера произошел его сброс (программный сброс, инициированный
пользователем, либо сброс, инициированный watchdog'ом), геттер вернет дополнительно одну из двух переменных:
\verb'SOFTRESET=1' или \verb'WDGRESET=1'.
Внимание! После вызова данного геттера переменные не завершаются маркером <<DATAEND>>!
Пример:
\begin{lstlisting}
SOFTRESET=1
MOTOR0=SLEEP
POS0=-1
ESW00=ERR
ESW01=BTN
MOTOR1=SLEEP
POS1=-1
ESW10=HALL
ESW11=HALL
\end{lstlisting}
\paragraph{Команды работы с двигателями.}
Следующим символом после этой команды должен быть номер двигателя (0 или 1), в случае ошибки будет возвращен
ответ \verb'Num>1'. В данной группе всего две команды:
\begin{description}\def\itm#1{\rlap{#1}\phantom{Mnum}}
\item[\itm{Mnum}] перемещение двигателя на \textbf{num} (положительное или отрицательное целое) шагов, в
случае ошибки возможны следующие варианты ответа:
\begin{description}\def\itm#1{\rlap{#1}\phantom{TooBigNumber}}
\item[\itm{BadSteps}] \textbf{num} не является числом;
\item[\itm{IsMoving}] двигатель находится в состоянии движения;
\item[\itm{OnEndSwitch}] двигатель находится на концевике, запрещающем движение в заданном направлении;
\item[\itm{ZeroMove}] \textbf{num} равно нулю;
\item[\itm{TooBigNumber}] значение \textbf{num} превышает системное \verb'MAXSTEPSx';
\end{description}
\item[\itm{S}] остановить двигатель.
\end{description}
\paragraph{Команды-сеттеры.}
При нормальном завершении команда-сеттер изменяет значение соответствующей переменной в оперативной памяти и
(за исключением скорости интерфейса UART) данные изменения сразу же отражаются на поведении контроллера. Для
постоянного сохранения изменений во флеш-памяти МК необходимо дать команду записи во флеш-память после всех
проведенных изменений и их проверки.
\begin{description}\def\itm#1{\rlap{#1}\phantom{M\#num}}
\item[\itm{C\#num}] изменение значения текущей скорости двигателя с номером \textbf{\#} на \textbf{num}
(данное изменение действует лишь до окончания движения двигателя);
\item[\itm{Dxnum}] установка знаменателя (\textbf{d}enominator) величины \textbf{x} (D, I или M~-- в
соответствии с геттером значения измерений АЦП) в \textbf{num};
\item[\itm{Exnum}] установка числителя (num\textbf{e}rator) (аналогично \textbf{Dxnum});
\item[\itm{I num}] изменение значения идентификатора (целое число) контроллера;
\item[\itm{M\#num}] установка максимального диапазона (\textbf{num} от~1 до~65535) шагового двигателя
\textbf{\#};
\item[\itm{P num}] включение (\textbf{num} равно нулю) или отключение (\textbf{num} отсутствует или любое,
кроме нуля) внутренней подтяжки на UART Tx;
\item[\itm{R\#num}] реверсивное движение двигателя \textbf{\#} (\textbf{num} равное нулю отключает реверс),
в режиме реверса меняется только направление вращения двигателя, но не обрабатываемые концевики;
\item[\itm{S\#num}] изменение значения максимальной скорости двигателя с номером \textbf{\#} на \textbf{num}
(максимальная скорость устанавливается после окончания движения с ускорением и не зависит от
текущей скорости, \textbf{C\#num});
\item[\itm{T num}] изменение пороговых величин (\textbf{num} в ADU) для градации состояний концевика
двигателя~0 (0..num~-- датчик Холла, 2048-num..2048+num~-- пользовательская кнопка,
4096-num..4095~-- свободное состояние);
\item[\itm{U num}] изменение скорости UART.
\end{description}
\paragraph{Сеттеры скорости двигателей.}
Для установки значения скорости в \textbf{N} шагов в секунду, используются сеттеры \textbf{C} или \textbf{S}.
Их аргумент имеет значение $3000/N$. Например, чтобы дать команду контроллеру с идентификатором <<0>>
изменить текущую скорость вращения двигателя~0 на 50~шагов в секунду, необходимо передать команду
\textbf{0SC060} (0~-- номер контроллера, S~-- сеттер, C~-- текущая скорость, 0~-- двигатель~0, $60=3000/50$).
\paragraph{Сеттеры числителя и знаменателя.} Сеттеры \textbf{Dxnum} (знаменатель) и \textbf{Exnum}
(числитель) устанавливают величины соответствующих аппроксимаций к коэффициентам перевода измеренных АЦП
величин из ADU в физические величины. Следует учитывать, что при расчетах используется беззнаковая
целочисленная 32-битная математика, поэтому во избежание переполнения не следует задавать слишком большие
величины. В качестве параметра \textbf{x} используется мнемоника из соответствующего геттера (\textbf{D}~--
Vdd, \textbf{I}~-- потребляемый ток, \textbf{M}~-- напряжение питания). Для преобразования числа с плавающей
точкой в несократимую арифметическую дробь можно использовать функцию Octave \verb'rat()'. Например, для
преобразования коэффициента~$1.23$ в несократимую дробь с точностью~$0.1$:
{\lstset{language=Octave}
\begin{lstlisting}
[N D] = rat(1.23,0.01)
N = 16
D = 13
\end{lstlisting}}
Полученное приближение~$16/13=1.2308$ лежит в заданных точностных рамках.
\paragraph{Сеттер идентификатора устройства.} Сразу после получения нового идентификатора, устройство
перестает откликаться на команды со старым идентификатором. Поэтому в случае проблем (устройство
<<потеряно>>) необходимо произвести перезагрузку устройства кратковременным нажатием на кнопку <<reset>> или
кратковременным отключением питания. Если же устройство является единственным на линии связи, можно
обратиться к нему по <<широковещательному>> идентификатору <<-1>>.
\subsubsection{Состояние устройства и базовые настройки}
Состояние устройства в \verb'MMPP_control' отображается четырьмя строками, например:
\begin{lstlisting}
Pol: M0ST M0LEFT M0POS - M1ST M1LEFT M1POS || L/4: M0ST M0LEFT M0POS - M1ST M1LEFT M1POS
Pol: STOP 0 16400 - STOP 0 0 || L/4: STOP 0 11400 - STOP 0 0
ESW00 ESW01 ESW10 ESW11 || ESW00 ESW01 ESW10 ESW11
RLSD RLSD HALL RLSD || RLSD RLSD HALL RLSD
\end{lstlisting}
Нечетные строки "--- название полей в четных строках. Две вертикальные линии разделяют поля первого и второго
контроллера (в первой группе они имеют соответствующие пометки: <<Pol>> и <<L/4>>).
\begin{description}\def\itm#1{\rlap{#1}\phantom{MxLEFT}}
\item[\itm{MxST}] состояние двигателей~0 и~1;
\item[\itm{MxLEFT}] количество оставшихся шагов;
\item[\itm{MxPOS}] текущее положение двигателей;
\item[\itm{ESWxy}] состояние концевика \textbf{y} двигателя \textbf{x}.
\end{description}
Значение полей описано в пункте <<Геттеры состояния>> на стр.~\pageref{stategetters}.
\paragraph{Базовые настройки.}\label{MMPP_basesettings}
Параметры текущей конфигурации контроллера можно получить при помощи геттера конфигурации. Например,
\begin{lstlisting}[caption=Базовые настройки контроллеров]
MMPP_control -a 1GC
Send raw string: 1GC
Receive:
CONFSZ=36
DEVID=1
V12NUM=605
V12DEN=94
I12NUM=3
I12DEN=4
V33NUM=1
V33DEN=1
ESWTHR=500
MOT0SPD=3
MOT1SPD=5
MAXSTEPS0=50000
MAXSTEPS1=50000
INTPULLUP=1
USARTSPD=115200
REVERSE0=1
REVERSE1=0
DATAEND
MMPP_control -a 2GC
Send raw string: 2GC
Receive:
CONFSZ=36
DEVID=2
V12NUM=605
V12DEN=94
I12NUM=3
I12DEN=4
V33NUM=1
V33DEN=1
ESWTHR=500
MOT0SPD=3
MOT1SPD=2
MAXSTEPS0=50000
MAXSTEPS1=50000
INTPULLUP=1
USARTSPD=115200
REVERSE0=0
REVERSE1=1
DATAEND
\end{lstlisting}
В случае замены контроллера необходимо записать в новый чип конфигурацию, соответствующую заменяемому.
Важными параметрами являются \verb'DEVID' (идентификатор устройства), \verb'ESWTHR' (порог реакции на
изменение уровня на концевиках двигателя~0, \verb'MOTxSPD' (предельные скорости соответствующих двигателей),
\verb'MAXSTEPSx' (максимальное количество шагов данного двигателя), \verb'INTPULLUP' (при отсутствии внешней
подтяжки шины~Tx контроллеров отключенная подтяжка приведет к неработоспособности), \verb'USARTSPD' (скорость
шины UART) и \verb'REVERSEx' (направление вращения двигателя).
\paragraph{Значения предельных токов DRV8825.} \label{MotCurrents}
Предельные токи определяются по уровню напряжения на подстроечных резисторах DRV8825.
\TODO[ТОКИ!]
\end{document}