\documentclass[a4paper,12pt]{extarticle}
\usepackage{listings}
\usepackage{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 Москвитин~А.С.\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.

\begin{pict}
\includegraphics[width=\textwidth]{sch}
\caption{Оптическая схема прибора. Обозначения: 0~-- входное окно (плоскость фланца телескопа), 1~--
четвертьволновая пластина, 2~-- анализатор поляризации, 3~и~4~-- интерференционные фильтры, 5~-- выходное
окно. Eagle, Andor~-- плоскости расположения соответствующих светоприемников.}
\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{Механика}
\subsection{Элементы механики MMPP}
Поворотные платформы фазовой пластины и анализатора поляризации установлены на цилиндрических направляющих,
позволяющих при помощи соединения винт-гайка вводить и выводить их из пучка посредством шаговых двигателей.
Шаг винтового соединения составляет 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}). Буквой <<P>> на рисунке обозначено положение магнита, отмечающее положение
одного из фильтров <<в пучке>>; <<A>>, <<B>> и <<C>> "--- магниты, маркирующие колесо (магниты <<D>> и <<E>>
расположены дальше и в кадр не вошли). Магнит <<A>> всегда должен присутствовать, маркируя положение
нуль-пункта, позиции с <<B>> по <<E>> могут быть свободными (в этом случае колесо определяется как <<A>>),
либо в одной из них может находиться магнит для соответствующей маркировки.

\begin{pict}
\includegraphics[width=0.49\textwidth]{Wmark0}\hfil\includegraphics[width=0.49\textwidth]{Wmark1}
\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}}. Краткий
перечень параметров утилиты:

\def\t#1{{\ttfamily #1}}
\begin{description}
\item[\ttfamily -A, --absmove] --- абсолютное движение, данный параметр  используется для задания абсолютной
величины количества шагов (аргументы \t{-L} и \t{-l}) или угла в градусной мере (аргументы \t{-R} или
\t{-r}), без этого параметра подразумевается задание аргумента относительно текущего положения;
\item[\ttfamily E, --reset] --- выполнить программный сброс заданного контроллера, для сброса обоих
контроллеров необходимо указать: \t{-E1 -E2};
\item[\ttfamily -L, --lin1=arg] --- переместить линейный транслятор поляроида на заданное количество шагов;
\item[\ttfamily -R, --rot1=arg] --- повернуть поляроид на заданный угол (в градусной мере);
\item[\ttfamily -S, --stop] --- прекратить движение (оба контроллера получают сигнал остановить любое
движение);
\item[\ttfamily -a, --sendraw=arg] --- отправить неформатированные <<сырые>> данные в порт, например, для
передачи команд или получения значений, выходящих за рамки стандартных аргументов утилиты;
\item[\ttfamily -b, --baudrate=arg] --- скорость связи (например, 115200), по умолчанию ее значение "--- 9600;
\item[\ttfamily -d, --comdev=arg] --- название устройства последовательного порта, \t{/dev/ttyUSB0} по
умолчанию;
\item[\ttfamily -h, --help] --- отображение справки по параметрам;
\item[\ttfamily -l, --lin2=arg] ---переместить линейный транслятор волновой пластины на заданное количество
шагов;
\item[\ttfamily -p, --pidfile=arg] --- название pid-файла (по умолчанию "--- \t{/tmp/MMPP\_control.pid});
\item[\ttfamily -q, --quiet] --- <<тихий>> режим для вызова из внешних программ (на стандартный вывод
отображается лишь необходимый минимум информации в виде <<параметр=значение>>, стандартный поток ошибок
отображается без изменений);
\item[\ttfamily -r, --rot2=arg] --- повернуть волновую пластину на заданный угол (в градусной мере);
\item[\ttfamily -s, --status] --- отображение текущего состояния фотометра;
\item[\ttfamily -t, --temp] --- отображение примерной температуры обоих микроконтроллеров;
\item[\ttfamily -w, --wait] --- ожидание завершения всех движений, заданных в предыдущих запусках утилиты с
<<асинхронным>> параметром \t{-y};
\item[\ttfamily -y, --async] --- <<асинхронное>> движение: сразу после передачи команды движения утилита
завершается, не ожидая окончания движения.
\end{description}

Коды возврата утилиты заданы в начале файла \t{main.c}. Они имеют следующее значение:
\begin{description}
\item[0, RET\_ALLOK] нормальное завершение работы;
\item[1, RET\_NOTFOUND] при запуске утилиты не найдено ни одного отвечающего контроллера, либо не получен
ответ от искомого контроллера при передаче команды;
\item[2, RET\_ONLYONE] при запуске обнаружен лишь один контроллер;
\item[3, RET\_COMMERR] ошибка связи или формата передаваемых \slash принимаемых данных;
\item[4, RET\_CANTINIT] невозможно инициализировать контроллер установкой на нулевой концевик;
\item[5, RET\_WAITERR] ошибка, возникшая во время ожидания завершения выполнения предыдущих передвижений;
\item[9, RET\_ERROR] прочая ошибка (из libsnippets);
\item[255, RET\_HELPCALL] запуск утилиты с параметром \t{-h}.
\end{description}


\section{Интерфейс системы управления}
\comment[Тимур]{конфигурационный файл колес}
\label{wheels_config}

\section{Приложения}
\subsection{Замена колес с фильтрами}
Доступ к колесам турелей осуществляется через лицевую панель фотометра (см.~рис.~\ref{turwhls}). Для замены
соответствующего колеса необходимо ослабить винт, фиксирующий колесо в турели, открыть крышку турели, поменять
колеса, затянуть фиксирующий винт и закрыть крышку турели.

\begin{pict}
\includegraphics[width=0.48\textwidth]{turABclosed}\hfil\includegraphics[width=0.48\textwidth]{turABopened}
\caption{Крышки турелей. На рис.~слева отмечено положение винтов, фиксирующих крышки. На рис.~справа "---
турели с открытыми крышками.}
\label{turwhls}
\end{pict}

\begin{pict}
\includegraphics[width=0.6\textwidth]{sidebtns}
\caption{Кнопки ручного управления механизмом линейных трансляторов: 1~и~2~-- перемещение транслятора
анализатора поляризации в отрицательном и положительном направлении, соответственно; 3~и~4~-- аналогичные
перемещения транслятора фазовой пластины.}
\label{buttons}
\end{pict}


Доступ к фиксирующему винту нижней турели осуществляется через боковую крышку (см.~рис.~\ref{wheelscrews}
справа). Чтобы ослабить этот винт, необходимо сначала переместить транслятор анализатора поляризации
(контроллер \No\,1) на концевик~1. Это реализуется либо через интерфейс управления прибором, либо посредством
сервисных кнопок, расположенных над боковой крышкой. Первая и вторая кнопки управляют транслятором
анализатора поляризации, третья и четвертая "--- транслятором фазовой пластины. В каждой группе нажатие левой
кнопки вызывает движение транслятора в сторону концевика~0, нажатие правой "--- в сторону
концевика~1~(см.~рис.~\ref{buttons}).

\begin{pict}
\includegraphics[width=0.48\textwidth]{turAscrew}\hfil\includegraphics[width=0.48\textwidth]{turBscrew}
\caption{Расположение винтов, фиксирующих колеса в турелях. Слева~-- винт верхней турели, справа~-- нижней.}
\label{wheelscrews}
\end{pict}

Фиксирующий винт верхней турели находится под закрепленной посредством магнитов крышке вблизи фланца
светоприемника (см.~рис.~\ref{wheelscrews} слева). Чтобы не потерять крышку во время замены колеса верхней
турели, рекомендуется закрепить ее так, как указано на рисунке. Вращением отмеченной на рисунке шайбы можно
ослабить или затянуть фиксатор колеса верхней турели.


\begin{pict}
\includegraphics[width=0.48\textwidth]{wheels_sch}\hfil\includegraphics[width=0.48\textwidth]{wheelBopened}
\caption{Схема расположения колес в турелях (слева) и частично извлеченное из нижней турели колесо с
фильтрами.}
\label{wheelscheme}
\end{pict}

На внутренней поверхности крышки лицевой панели прибора нанесена схема расположения колес в турелях по
отношению к падающему свету (см.~рис.~\ref{wheelscheme}). Колеса располагаются встречно друг к другу. Следует
размещать колеса в соответствии со схемой в случае, когда установленные фильтры имеют рабочее направление.
В колесе нижней турели (т.е. первой со стороны фланца прибора) свет падает \textbf{на заднюю поверхность}
колеса (противоположную маркировке и крепежу фильтров). В колесе же верхней турели свет падает \textbf{на
переднюю поверхность} колеса.

Расположение фильтров в колесе должно быть указано в соответствующем конфигурационном файле интерфейса
системы управления прибором (см.~стр.~\pageref{wheels_config}).

После окончания замены колес турели находятся в неинициализированном состоянии. Для их инициализации
необходимо выполнить одну из процедур: либо проводить замену с отключенным питанием контроллера (в этом
случае инициализация турелей произойдет автоматически, однако, необходимо будет выполнить инициализацию
подвижных элементов MMPP), либо при помощи интерфейса системы управления или утилиты \verb'HSFW_manage'
установить оба колеса в положение <<home>>.


\subsection{Методика установки нуль-пунктов}
Для установки нуль-пунктов линейных трансляторов используются вспомогательные рамки с натянутыми на них
нитяными крестами (см.~рис.~\ref{aux_frames}). Рамки устанавливаются вместо оптических узлов: фазовой
пластины, анализатора поляризации и двух фильтров. Контрольный выходной крест натягивается также на фланец
ПЗС-светоприемника. Для контрольной засветки оптического тракта используется крестообразный лазерный
осветитель, устанавливаемый на специальном фланце во входном окне прибора. Регулировочными винтами необходимо
добиться совмещения центра изображения креста осветителя с центром нитяного креста на фланце ПЗС. Дальнейшая
юстировка производится визуально, либо при помощи вспомогательной видеокамеры с объективом-трансфокатором.

\begin{pict}
\includegraphics[width=0.6\textwidth]{frames}
\caption{Вспомогательные юстировочные рамки.}
\label{aux_frames}
\end{pict}

Юстировка турелей фильтров производится следующим образом. При помощи интерфейса системы управления либо
утилиты \verb'HSFW_manage' в обеих турелях выставляются позиции с нитяными крестами. Далее путем регулировки
трех фиксирующих винтов турель центруется относительно удерживающего цилиндра. После центровки турелей оба
колеса необходимо установить в положение <<hole>>, чтобы освободить оптический тракт для установки
нуль-пунктов линейных трансляторов.

%\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}

Для определения положений нуль-пунктов анализатора поляризации и четвертьволновой пластины необходимо
использовать дополнительное оборудование (см.~рис.~\ref{pol_zero}): осветитель, оснащенный поляризатором с
известным направлением поляризации, а также формирователь круговой поляризации с известным направлением
вращения (поляризатор и четвертьволновая пластина). Возможно также определение нуль-пунктов поляризационной
оптики при помощи наблюдения стандартов с линейной и круговой поляризацией.

\begin{pict}
\includegraphics[width=0.6\textwidth]{polzro}
\caption{Осветитель для калибровки нуль-пунктов поляризационной моды.}
\label{pol_zero}
\end{pict}


Определение нуль-пункта анализатора поляризации производится при помощи вспомогательного поляроида,
осветителя с объективом и светоприемника (при достаточной яркости осветителя в качестве светоприемника
возможно использовать фоторезистор). Получить поляризованный в данной плоскости свет можно при помощи
куска поляризующей пленки из жидкокристаллических мониторов. Юстировка плоскости поляризатора производится
при помощи поляризационной стопы, поляризационной призмы (например, призмы Глана) или поляризатора с известным
направлением плоскости поляризации.

\begin{pict}
\includegraphics[width=0.6\textwidth]{photores}
\caption{Пример графика зависимости сопротивления фоторезистора от интенсивности освещения. Окружностями
отмечены измеренные данные, линией~-- степенная аппроксимация.}
\label{photores_cali}
\end{pict}

После юстировки осветителя необходимо осветить им оптический тракт прибора и сфокусировать на светоприемнике.
Далее требуется линеаризовать показания светоприемника. Это можно сделать, изменяя степень заполнения ШИМ
источника питания осветителя (осветителем может выступать светодиод, для минимизации влияния импульсного
характера осветителя на точность измерений рекомендуется задавать максимальную частоту ШИМ, от 100\,кГц и
выше). В случае использования фоторезистора освещенность хорошо аппроксимируется функцией $I =
a\cdot\exp(b-\ln R)$ (см.~рис.~\ref{photores_cali}). Далее строится зависимость освещенности светоприемника от
угла вращения и по аппроксимации параболой областей вблизи минимумов освещенности определяется положение
скрещенных поляризатора и анализатора, откуда можно определить положение нуль-пункта анализатора поляризации.

После определения нуль-пункта анализатора он выставляется в положение~$90\degr$ по отношению к осветителю, и в
пучок вводится фазовая пластина. Измеряя интенсивность прошедшего света в зависимости от угла вращения
четвертьволновой пластины определяются положения плоскостей ее экстремальных скоростей. Точные значения углов
определяются аналогично "--- из аппроксимации участков вблизи минимумов освещенности
(см.~рис.~\ref{phase_cali}). Для используемой в MMPP четвертьволновой пластины угол между плоскостями
экстремальных скоростей в полосе~R составляет $91.7\degr$. Определить, какая из плоскостей соответствует
максимальной фазовой скорости, можно при помощи источника циркулярно поляризованного света с известным
направлением вращения плоскости поляризации.

\begin{pict}
\includegraphics[width=0.6\textwidth]{lambda4}
\caption{Интенсивность излучения вблизи плоскостей экстремальных скоростей фазовой пластины. Нулю
каждой кривой соответствут угол: голубой~-- $56.9\degr$, красный~-- $148.8\degr$, желтый~-- $237.0\degr$,
фиолетовый~-- $328.6\degr$.}
\label{phase_cali}
\end{pict}

\subsection{Порядок сборки и замены узлов прибора}
В случае замены блока питания прибора проверить наличие внутреннего соединения корпуса и минусовой шины. Если
сопротивление между ними превышает несколько сотен килоом, соединить минусовую шину и корпус резистором
мощностью~0.25\,Вт и сопротивлением~220\,кОм.

Подключение проводов UART: Rx/Tx преобразователя UART-USB к Tx/Rx контроллеров; дополнительно можно установить
сильную (около 4.7\,кОм) подтяжку между +3.3\,В и Rx преобразователя.

Порядок разборки прибора следующий (соответственно, порядок сборки "--- обратный).

\newcount\acnt\acnt1\def\nxt{\textbf{\the\acnt. }\advance\acnt1}
\nxt Снять фланец светоприемника \look{ass001}.

\begin{pict}
\includegraphics[width=0.7\textwidth]{ass-001}
\caption{Фотометр со снятым фланцем светоприемника.}
\label{ass001}
\end{pict}

\nxt Снять боковые крышки \look{ass002}. Во время съема левой крышки (с боковым люком) отключить провода
управления линейными трансляторами от панели с кнопками.

\begin{pict}
\includegraphics[width=0.49\textwidth]{ass-002}\hfil
\includegraphics[width=0.49\textwidth]{ass-003}
\caption{Боковые крышки сняты.}
\label{ass002}
\end{pict}

\nxt Отсоединить проводники USB и питания турелей, снять верхнюю плиту MMPP, на которой размещен узел
крепления турелей \look{ass005}.

\begin{pict}
\includegraphics[width=0.7\textwidth]{ass-005}
\caption{Отделена панель с креплением турелей.}
\label{ass005}
\end{pict}

\nxt Открутить шесть винтов, крепящих панель турелей к верхней плите фотометра. При сборке
удостовериться, что находящееся вблизи прямоугольного окна резьбовое соединение крепления фланца
светоприемника соответствует изображенному на рис.~\ref{ass006} слева (у данного экземпляра подрезана сторона
вблизи винта фиксации колеса верхней турели).

\begin{pict}
\includegraphics[height=0.25\textheight]{ass-006}\hfil
\includegraphics[height=0.25\textheight]{ass-007}
\caption{Снятие панели крепления турелей.}
\label{ass006}
\end{pict}

\nxt При помощи шестигранника на тонкой длинной рукоятке (либо длинной плоской отвертки) ослабить винты,
фиксирующие турели на центрующем кольце (рис.~\ref{ass009} слева). Снять с кольца турели, вынуть кольцо из
панели турелей и открутить от панели крепежные стойки.

\begin{pict}
\includegraphics[width=0.49\textwidth]{ass-009}\hfil
\includegraphics[width=0.49\textwidth]{ass-010}
\caption{Отсоединение турелей.}
\label{ass009}
\end{pict}

\nxt Отсоединить от задней стенки фотометра электрическую проводку \look{ass011}.

\begin{pict}
\includegraphics[width=0.7\textwidth]{ass-011}
\caption{Проводка, прикрепленная к задней стенке MMPP.}
\label{ass011}
\end{pict}

\nxt Отключить от контроллера анализатора поляризации шлейфы двигателей ротатора и линейного транслятора.
Раскрутить винты, крепящие платформу анализатора поляризации к линейному транслятору (рис.~\ref{ass012}
слева). Отделить ротатор анализатора поляризации от платформы. На задней стороне ротатора раскрутить винты,
удерживающие накладку поляроида. Извлечь поляроид.

\begin{pict}
\includegraphics[width=0.49\textwidth]{ass-012}\hfil
\includegraphics[width=0.49\textwidth]{ass-013}
\caption{Отсоединение платформы анализатора поляризации.}
\label{ass012}
\end{pict}

\nxt Снять крышки, закрывающие силовые соединения блока питания и крышку с силовым разъемом и тумблером
питания. Открутить винты крепления блока питания к корпусу фотометру. Обратить внимание на то, что при сборке
указанный на рисунке~\ref{ass014} справа винт должен быть вкручен до установки блока питания.

\begin{pict}
\includegraphics[height=0.25\textheight]{ass-014}\hfil
\includegraphics[height=0.25\textheight]{ass-015}
\caption{Снятие крышек блока питания.}
\label{ass014}
\end{pict}

\nxt Ослабить винты на клеммнике блока питания. Отсоединить проводку и вынуть блок питания.
На рис.~\ref{ass016} справа изображена крышка тумблера и разъема питания. Конфигурация разъема питания
следующая: контакт~1~-- заземление, 2~-- нуль, 3~-- фаза. Фазовый контакт посредством плавкого
цилиндрического предохранителя на $0.5\div1\,$А соединяется с тумблером питания.

\begin{pict}
\includegraphics[width=0.49\textwidth]{ass-016}\hfil
\includegraphics[width=0.49\textwidth]{ass-017}
\caption{Отсоединение блока питания и силовых элементов.}
\label{ass016}
\end{pict}

\nxt Отсоединить всю доступную проводку. Открутить винты, крепящие боковые накладки к фланцу прибора
\look{ass018}. С левой накладки снять USB-концентратор и входной разъем USB.

\begin{pict}
\includegraphics[width=0.49\textwidth]{ass-018}\hfil
\includegraphics[width=0.49\textwidth]{ass-020}
\caption{Снятие боковых накладок и отключение USB-концентратора.}
\label{ass018}
\end{pict}

\nxt Перевернуть прибор вверх фланцем, открутить все винты крепления стоек, кроме пары для каждой стойки.
Оставшиеся винты открутить, сдвинув прибор к краю стола \look{ass021}.

\begin{pict}
\includegraphics[height=0.25\textheight]{ass-021}\hfil
\includegraphics[height=0.25\textheight]{ass-024}
\caption{Снятие стоек с креплением элементов линейного транслятора анализатора поляризации.}
\label{ass021}
\end{pict}

\nxt Отсоединить от фланца прибора стойки с элементами линейного транслятора анализатора поляризации и
управляющего контроллера \look{ass025}.

\begin{pict}
\includegraphics[width=0.49\textwidth]{ass-025}\hfil
\includegraphics[width=0.49\textwidth]{ass-026}
\caption{Отсоединение стоек.}
\label{ass025}
\end{pict}

\nxt Отсоединить с фланца прибора всю проводку. Открутить винты, крепящие пластину ротатора фазовой пластины
к С-образному кронштейну и снять пластину с ротатором \look{ass027}.

\begin{pict}
\includegraphics[width=0.49\textwidth]{ass-027}\hfil
\includegraphics[width=0.49\textwidth]{ass-028}
\caption{Снятие ротатора четвертьволновой пластины.}
\label{ass027}
\end{pict}

\nxt Открутить винты, стягивающие пластину и ротатор. Снять ротатор фазовой пластины. Открутить фиксатор и
извлечь фазовую пластину. Выкрутить винты, крепящие С-образный кронштейн к подшипниковым узлам транслятора и
отделить кронштейн \look{ass029}.

\begin{pict}
\includegraphics[width=0.49\textwidth]{ass-029}\hfil
\includegraphics[width=0.49\textwidth]{ass-030}
\caption{Отсоединение ротатора от пластины, съем кронштейна.}
\label{ass029}
\end{pict}

\nxt Снять направляющие линейного транслятора фазовой пластины. Ослабить крепление винта подачи в
соединительной муфте шагового двигателя. Снять винтовой узел. Снять шаговый двигатель. Отсоединить от
скоб и снять узлы концевиков. Снять с фланца скобы крепления концевиков \look{ass031}.

\begin{pict}
\includegraphics[width=0.49\textwidth]{ass-031}\hfil
\includegraphics[width=0.49\textwidth]{ass-032}
\caption{Освобождение поверхности фланца.}
\label{ass031}
\end{pict}

\nxt Со стойки с диагональными откосами ребер жесткости снять крышку доступа к турелям. Открутить откосы и
элементы транслятора анализатора поляризации (см.~рис.~\ref{ass033} слева). Со второй стойки снять
цилиндрическую направляющую с узлами ее крепления и отсоединить проводку.

\begin{pict}
\includegraphics[width=0.49\textwidth]{ass-033}\hfil
\includegraphics[width=0.49\textwidth]{ass-034}
\caption{Разборка узлов линейного транслятора анализатора поляризации.}
\label{ass033}
\end{pict}

\nxt Ослабить в муфте шагового двигателя крепление винта подачи. Снять винт с креплениями. Снять
контроллер шаговых двигателей и узлы концевиков. Снять шаговый двигатель \look{ass035}.

\begin{pict}
\includegraphics[width=0.49\textwidth]{ass-035}\hfil
\includegraphics[width=0.49\textwidth]{ass-036}
\caption{Разборка узлов линейного транслятора анализатора поляризации.}
\label{ass035}
\end{pict}

\nxt Отсоединить от панели ребра жесткости (см.~рис.~\ref{ass037}). При необходимости разобрать оставшиеся
мелкие узлы прибора.

\begin{pict}
\includegraphics[width=0.49\textwidth]{ass-037}\hfil
\includegraphics[width=0.49\textwidth]{ass-039}
\caption{Прибор в разобранном виде.}
\label{ass037}
\end{pict}

\if0
\begin{pict}
\includegraphics[width=0.49\textwidth]{ass-000}\hfil
\includegraphics[width=0.49\textwidth]{ass-000}
\caption{.}
\label{ass000}
\end{pict}
\fi


\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, скорость задана в конфигурации, по умолчанию
9600\,бод). Команды передаются в строковом режиме: признаком окончания команды является символ новой строки.
Микроконтроллер не обрабатывает принимаемые данные до формирования валидной строки. Символы пробела или
табуляции внутри строки игнорируются. Первым в строке следует номер контроллера (16-битное беззнаковое
целое). Данный номер сохраняется во флеш памяти МК во время его инициализации. Каждый модуль обрабатывает лишь
те команды, которые адресованы ему, либо же имеют широковещательную адресацию (в этом случае в качестве адреса
указывается -1). Так как вывод данных микроконтроллером при получении широковещательного идентификатора не
блокируется, не рекомендуется использовать широковещательные посылки при наличии более одного устройства на
линии связи (кроме посылок экстренного останова, сброса и т.п.).

После идентификатора контроллера следует текст команды и (опционально) ее аргументы. В случае, если команда
валидна, контроллер возвращает строку <<ALLOK>>. Если команда не распознана, возвращается маркер ошибки
<<BADCMD>>. В случае же ошибок в аргументах команды возвращается маркер ошибки <<ERR>>. Если команда
возвращает какую-либо информацию, она следует сразу за маркером <<ALLOK>>. Данные, занимающие более одной
строки текста, завершаются маркером <<DATAEND>>. Если команда лишь требует выполнения определенного действия,
маркер <<ALLOK>> возвращается после установления возможности выполнения данного действия. В силу синхронного
характера интерфейса связи, команды, требующие длительного времени на исполнение (например, перемещение
объекта) не выводят в случае ошибки или достижения заданного положения никаких данных, процесс их исполнения
необходимо контролировать периодическим запросом состояния модуля.

Первым символом в строке команды должен быть один из следующих:

\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=2
V12NUM=605
V12DEN=94
I12NUM=3
I12DEN=4
V33NUM=1
V33DEN=1
ESWTHR=500
MOT0SPD=3
MOT1SPD=2
MAXSTEPS0=50000
MAXSTEPS1=50000
USARTSPD=9600
INTPULLUP=1
REVERSE0=0
REVERSE1=1
USTEPS=16
ACCDECSTEPS=50
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]=189
ADC[1]=2317
ADC[2]=4088
ADC[3]=4090
ADC[4]=1703
ADC[5]=1525
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{A num}] установка количества шагов (\verb'ACCDECSTEPS'), в течение которого движение будет
        производиться с ускорением (на старте) или замедлением (на финише); в случае, если требуется
        переместить двигатель на меньшее количество шагов, движение будет производиться с минимальной
        скоростью (равной произведению \verb'MOTxSPD' на значение макроса \verb'LOWEST_SPEED_DIV');
\item[\itm{C\#num}] изменение значения текущей скорости двигателя с номером \textbf{\#} на \textbf{num}
        (данное изменение действует лишь до окончания движения двигателя);
\item[\itm{Dvnum}] установка знаменателя (\textbf{d}enominator, \verb'xxxDEN') величины \textbf{v} (D, I или
        M~-- в соответствии с геттером значения измерений АЦП) в \textbf{num};
\item[\itm{Evnum}] установка числителя (num\textbf{e}rator, \verb'xxxNUM') (аналогично \textbf{Dvnum});
\item[\itm{I num}] изменение значения идентификатора (\verb'DEVID', целое число) контроллера;
\item[\itm{M\#num}] установка максимального диапазона (\verb'MAXSTEPS#', \textbf{num} от~1 до~65535) шагового
        двигателя \textbf{\#};
\item[\itm{P num}] (\verb'INTPULLUP') включение (\textbf{num} равно нулю) или отключение (\textbf{num}
        отсутствует или любое, кроме нуля) внутренней подтяжки на UART Tx;
\item[\itm{R\#num}] (\verb'REVERSE#') реверсивное движение двигателя \textbf{\#} (\textbf{num} равное нулю
        отключает реверс), в режиме реверса меняется только направление вращения двигателя, но не
        обрабатываемые концевики;
\item[\itm{S\#num}] изменение значения максимальной скорости (\verb'MOT#SPD') двигателя с номером
        \textbf{\#} на \textbf{num} (максимальная скорость устанавливается после окончания движения с
        ускорением и не зависит от текущей скорости, \textbf{C\#num});
\item[\itm{T num}] изменение пороговых величин (\verb'ESWTHR', \textbf{num} в ADU) для градации состояний
        концевика двигателя~0 (0..num~-- датчик Холла, 2048-num..2048+num~-- пользовательская кнопка,
        4096-num..4095~-- свободное состояние);
\item[\itm{U num}] изменение скорости UART (\verb'USARTSPD');
\item[\itm{u num}] установка количества микрошагов (\verb'USTEPS') в одном шаге; это число должно быть
        степенью двойки (до~32 включительно).
\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}.

В <<тихом>> режиме, задаваемом флагом \t{-q},состояние устройства отображается как перечень параметров и их
значений. Например,
\begin{lstlisting}
POLMOTOR0=MOVE
POLSTEPSLEFT0=742
POLPOS0=4558
POLESW00=RLSD
POLESW01=RLSD
POLMOTOR1=MOVE
POLSTEPSLEFT1=7289
POLPOS1=32411
POLESW10=RLSD
POLESW11=RLSD
L4MOTOR0=MOVE
L4STEPSLEFT0=642
L4POS0=4358
L4ESW00=RLSD
L4ESW01=RLSD
L4MOTOR1=MOVE
L4STEPSLEFT1=1542
L4POS1=6458
L4ESW10=RLSD
L4ESW11=RLSD
\end{lstlisting}
Т.е. в данном случае просто копируются значения всех переменных, выдаваемых контроллерами по запросу текущего
состояния, с добавлением префикса \t{POL} для контроллера поляроида и \t{L4} для контроллера фазовой пластины.

\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
USARTSPD=9600
INTPULLUP=1
REVERSE0=1
REVERSE1=0
USTEPS=16
ACCDECSTEPS=50
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
USARTSPD=9600
INTPULLUP=1
REVERSE0=0
REVERSE1=1
USTEPS=16
ACCDECSTEPS=50
DATAEND
\end{lstlisting}

В случае замены контроллера необходимо записать в новый чип конфигурацию, соответствующую заменяемому.
Важными параметрами являются \verb'DEVID' (идентификатор устройства), \verb'ESWTHR' (порог реакции на
изменение уровня на концевиках двигателя~0, \verb'MOTxSPD' (предельные скорости соответствующих двигателей),
\verb'MAXSTEPSx' (максимальное количество шагов данного двигателя), \verb'INTPULLUP' (при отсутствии внешней
подтяжки шины~Tx контроллеров отключенная подтяжка приведет к неработоспособности), \verb'USARTSPD' (скорость
шины UART), \verb'REVERSEx' (направление вращения двигателя) и \verb'ACCDECSTEPS' (количество шагов для
ускорения\slash замедления движения).

\paragraph{Значения предельных токов DRV8825.} \label{MotCurrents}
Предельные токи определяются по уровню напряжения на подстроечных резисторах DRV8825.
Анализатор поляризации: M0 (подвижка) 0.5\,В, M1 (ротатор) 3.1\,В.
Фазовая пластина: M0 (подвижка) 0.9\,В, M1 (ротатор) 0.25\,В.

\comment[ФОТО!]{добавить табличку со значениями напряжений + фотографию, как настраивать}
\end{document}
