\documentclass[a4paper,12pt]{extarticle}
\usepackage{listings}
\usepackage{/home/eddy/ed}
\lstset{basicstyle=\small,breaklines=true,language=Octave,
	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},
	numbers=left,numberstyle=\tiny,stepnumber=2,
	keywordstyle=\bfseries\color[rgb]{0,0.1,0.5},
	frameround=tttt,frame=trBL,tabsize=4,backgroundcolor=\color[rgb]{.9,.9,1}}
\lstloadlanguages{Octave}
\def\lstlistingname{Листинг}
\def\lstref#1{(см.~листинг~\ref{#1})}
\graphicspath{{./pic/}}
\nocolon
\title{Краткое описание и протокол команд системы управления ИК-спектрометром БТА}
\begin{document}
\maketitle
\section{Краткое описание}
\subsection{Назначение и возможности системы}
Система управления ИК-спектрометром разработана на основе ARM~--~микроконтроллера
STM32F103VET6 (или аналогичного с объемом флеш-памяти не меньше 32\,Кб).

В базовом режиме система управления способна выполнять следующие \textbf{функции}:
\begin{itemize}
\item \textit{Управление затвором}: программное, ручное (при помощи тумблера) и по сигналу с системы
сбора (подтяжка сигнального контакта к земле). Наименьший приоритет имеет ручное управление затвором
(чтобы избежать блокировки управления затвором при включении прибора с положением тумблера в позиции
<<затвор открыт>>). Электрический импульс на затвор подается лишь в том случае, если
конденсатор в цепи управления затвором заряжен до напряжения не меньше~$20\,$В, в противном случае
накопленного конденсатором заряда будет недостаточно для активации затвора. Постоянная времени
$3RC=0.66\,$с определяет максимальное время полного заряда конденсатора (соответственно, заряд до
напряжения~$20\,$В составит не более~$0.5\,$с), внося ограничение на минимальную экспозицию.
В случае поступления запроса на изменение состояния затвора, когда конденсатор еще недостаточно
заряжен, система управления отложит исполнение запроса до момента зарядки конденсатора.

Открытие\slash закрытие затвора осуществляется путем коммутации его обмоток к заряженному
конденсатору емкостью~2200\,мкФ посредством H-моста TLE5205. При этом анализируется состояние флага
ошибки моста: при инициализации проверяется, подключен ли затвор (проверка на обрыв); при
управлении затвором анализируется отсутствие короткого замыкания. В случае выявления ошибки
система управления один раз в секунду делает попытку реинициализации затвора, при этом индикатор
открытия затвора мигает, а в консоль управления (если она находится в символьном режиме) выдается
сообщение об ошибке. Как только проблема устранена и затвор успешно инициализирован, индикатор
затвора гаснет.

Положение затвора контролируется посредством геркона, контакты которого замыкаются миниатюрным
магнитом в полностью открытом состоянии затвора. Если состояние геркона не соответствует состоянию
затвора, система сообщает об ошибке и устанавливает состояние затвора в <<неинициализированный>>.


\item \textit{Условное измерение времени работы} (т.к. система управления не имеет в своем составе
часов реального времени, возможно лишь измерение количества тактов, прошедших с момента последнего
сброса). Система имеет два беззнаковых 32-битных счетчика: один служит для измерения количества
условных миллисекунд, прошедших с момента последнего сброса, второй~--- для измерения количества
переполнений первого счетчика (принципиально же это событие маловероятно, т.к. переполнение
счетчика возникнет не раньше, чем через $49.7\,$суток работы системы).


\item \textit{Опрос до восьми платиновых терморезисторов} HEL-705 (сопротивление при $0\degr$C
1\,кОм) с выдачей измеренного встроенным 12-битным АЦП сопротивления для последующего преобразования
согласно формуле из	руководства (либо экспериментальному калибровочному графику) на персональном
компьютере.
Итоговая точность измерения температуры не хуже $\pm1.5\degr$C.
Преобразование измеренного значения ADU~($v$) в сопротивление в сотых долях Ома~($R$) выполняется
целочисленно по формуле
$$ R_i = \frac{v_i\cdot m_i}{(2^{12} - v_i)\cdot d_i},$$
где $i$~-- номер канала измерения, $m$~и~$d$~-- калибровочные коэффициенты (вычисляются по
калибровке каждого канала из разложения полученных значений с плавающей точкой в цепные дроби).
По умолчанию (в соответствии с тем, что сопротивление опорного резистора составляет~1\,кОм, по
умолчанию все $m=100000$, $d=1$).

Согласно документации на используемые платиновые терморезистивные датчики, их сопротивление имеет
следующую зависимость от температуры:
$$
R = R_0(1+A\cdot T+B\cdot T^2-100C\cdot T^3+C\cdot T^4),
$$
где
\begin{description}
\item $R_0 = 1000\,$Ом~-- сопротивление датчика при~$0\degr$C;
\item $A=3.81\cdot10^{-3}$;
\item $B = -6.02\cdot10^{-7}$;
\item $C = \begin{cases}
            -6.0\cdot10^{-12}&\text{при $T<0\degr C$};\\
            0&\text{в остальных случаях.}
           \end{cases}
$
\end{description}

Вычисление температуры можно выполнить путем аппроксимации обратной зависимости, например, таким
скриптом Octave:
\begin{lstlisting}
function Tout = H705(Rin)
% Converts resistance of TRD into T (degrC)
  _alpha = 0.00375;
  _beta = 0.16;
  _delta = 1.605;
  T = [-200:0.1:50];
  _A = _alpha + _alpha*_delta/100.;
  _B = -_alpha*_delta/1e4;
  _C = zeros(size(T));
  _C(find(T<0.)) = -_alpha*_beta/1e8;
  rT = 1000.*(1 + _A*T + _B*T.^2 - _C.*T.^3*100. + _C.*T.^4);
  Tout = interp1(rT, T, Rin, 'spline')
endfunction
\end{lstlisting}


\item \textit{Измерение температуры внешних элементов} криостата спектрометра и системы управления
при помощи цифровых 1-wire термодатчиков DS18B20 или~DS18S20.
Системой поддерживается до восьми термодатчиков, размещенных на общей шине. Идентификаторы датчиков
хранятся во флеш-памяти микроконтроллера. При работе в символьном режиме возможна процедура замены
сохраненных идентификаторов на новые.

По умолчанию при включении система начинает производить мониторинг датчиков: автоматически один раз
в секунду запускается считывание температуры с очередного датчика. После опроса всех датчиков
выдается широковещательная команда, запускающая очередное измерение температуры, и процесс
повторяется. Управлять мониторингом (включение \slash отключение) можно как из символьного,
так и из строкового режимов управления.

В случае, если мониторинг включен, по команде опроса состояния терморезисторов выдаются также
температуры <<горячих>> датчиков (в таком же формате, как сопротивление, но в десятых долях
$\degr C$).

\item \textit{Измерение напряжения} на конденсаторе, управляющем затвором, и напряжения
питания~$10\div12\,$В. Напряжение измеряется в сотых долях Вольта, преобразование также выполняется
целочисленным делением, исходя из значений сопротивлений в плечах резисторных делителей, с которых
снимается измеряемое напряжение. Напряжения измеряются по формуле:
$$U_i = v_i\cdot\frac{m_i}{d_i},$$
где $U_i$~-- измеряемое напряжение в сотых долях Вольта, остальные коэффициенты аналогичны
измерению сопротивления терморезисторов.

По умолчанию коэффициенты являются наилучшим (через цепные дроби) приближением коэффициентов:
$\frac{4700}{56000}\approx\frac{26}{25}$ для напряжения на конденсаторе затвора (резисторы в плечах
имеют сопротивление $4.7\,$кОм и~$56\,$кОм) и $\frac{4700}{12000}\approx\frac{2}{7}$ для напряжения
питания (соответственно, $4.7\,$кОм и~$12\,$кОм).


\item \textit{Смену калибровочных коэффициентов} (коэффициенты хранятся в перезаписываемом блоке
флеш-памяти микроконтроллера). Для измерения коэффициентов рекомендуется произвести измерение
реальных значений сопротивления в каждом канале измерения температуры, а также напряжений на
конденсаторе затвора и питания, вычислить поправочный множитель, определить значения новых
коэффициентов на основе текущих значений (система управления позволяет отобразить все величины,
хранящиеся в перезаписываемом блоке флеш-памяти микроконтроллера).


\item \textit{Управление шаговыми двигателями} линейных трансляторов и турелей спектрометра.
Аппаратно заложено ограничение на движение линейных трансляторов (при нахождении на концевом
выключателе транслятор можно перемещать лишь в противоположную от концевика сторону). Все шаговые
двигатели можно вращать на определенное количество шагов относительно текущей позиции. После
останова шагового двигателя система сообщает его текущее условное положение в количестве шагов (шаги
отсчитываются в условном положительном направлении вращения шаговых двигателей, для турелей от
позиции~\No\,1, для линейных трансляторов~--- от концевика <<минус>>). Для однозначного сброса
счетчиков позиций шаговых двигателей необходимо перед началом работы установить все турели в
позиции~\No\,1, а все линейные трансляторы сместить в <<минусовую>> область до упора в концевик.

В связи со схемотехническими ошибками реализации текущей версии системы управления во избежании
возгорания драйверов шаговых двигателей программно запрещено управление более чем двумя двигателями
одновременно, причем, оба двигателя не могут находиться в одной и той же группе (первая группа~---
турели, вторая группа~--- линейные трансляторы). При длительной работе двигателей их драйверы
нагреваются, поэтому желательно установить радиаторы на драйверы шаговых двигателей.

По умолчанию скорости работы двигателей первой группы устанавливаются в значение~333\,шага в
секунду, а двигателей второй группы~--- в~500 шагов в секунду. Это соответствует одному обороту
турели за 6~секунд и движению линейных трансляторов со скоростью $1.25\,$мм/с (полное перемещение
транслятора дифракционных решеток и маски зрачка за 2~минуты, полное перемещение фокусировочного
транслятора за 8 секунд). Однако, т.к. при старте шаговых двигателей используется разгон (для
увеличения стартового момента силы в течение первых 64~шагов двигатель линейно ускоряется от
$1/16\,$базовой скорости), а также турели приостанавливаются на 50\,мс в каждой фиксированной
позиции (для точного определения положения), полные перемещения занимают несколько большее время.

Для ускорения времени вращения турелей из одного положения в другое система управления выбирает
кратчайшую траекторию (т.е. турель с шестью позициями при переводе из позиции~<<1>> в позицию~<<2>>
будет вращаться по направлению $1\arr2$, а при переводе из позиции~<<1>> в позицию~<<6>>~--- в
направлении $1\arr6$). <<Положительные>> направления вращения турелей не совпадают, а определяются
расположением кодирующих магнитов.

\item \textit{Световую индикацию}. Зеленый светодиод в верхней части стенки корпуса системы
управления со стороны тумблеров отображает готовность системы к работе (прошла вся инициализация и
система ожидает ввода команд), красный светодиод отображает открытое состояние затвора (в случае
обрыва или короткого замыкания этот индикатор мигает). Также в нижней части панели размещены три
светодиода для пассивной индикации наличия питающих напряжений (зеленый~--- наличие напряжения
$+12\,$В, желтый~--- наличие напряжения $+36\,$В) и подключению этих напряжений к силовому
коммутационному разъему микроконтроллера (красный светодиод).
\end{itemize}




В \textbf{расширенном режиме} (часть функций еще не реализована) система способна также:
\begin{itemize}
\item \textit{Проводить мониторинг температур} с точностью не хуже~$\pm0.3\degr$C при помощи
внешнего блока АЦП (AD7794) с 16-канальными аналоговыми коммутаторами (ADG506A либо NX3L4051; вторая
система, позволяющая повысить точность измерений до~$\pm0.05\degr$C, находится в стадии разработки).
Повышение точности измерений достигается в данном случае за счет использования 24-битного
внешнего АЦП и использования алгоритма измерения со сменой полярности опорного тока\footnote{Henry
He, Minimizing Errors in Multiplexed 3-Wire RTD Data-Acquisition Systems.// Analog Dialogue~--
47-09,~-- September~2013.}.

Так как данный функционал необходим лишь для тестирования температурных режимов криостата, в
повседневном рабочем режиме он использоваться не будет.

\item \textit{Управлять тремя внешними нагрузками} (потребляемый ток не более 2А при продолжительном
подключении) посредством двух нижних ключей и одного верхнего ключа (с контролем ошибок). Данный
функционал зарезервирован для случая необходимости подогрева корпуса системы управления или
управления прочими силовыми нагрузками.
\end{itemize}




Подключение к управляющему компьютеру производится посредством:
\begin{itemize}
\item \textit{USB}-соединения (<<виртуальный последовательный порт>>), используемого также для
вывода диагностических сообщений при отладке;
\item соединения через преобразователь \textit{USB$\leftrightarrow$TTL}, используемый для
перепрограммирования микроконтроллера (параметры соединения задаются подключением по USB, по
умолчанию это 115200/8-N-1);
\item соединения через последовательный порт \textit{RS-232} (115200/8-N-1). Система управления
имеет два разъема RS-232: slave (для подключения к компьютеру) и master (для подключения
дополнительных устройств).
\end{itemize}
За исключением соединения по USB (с отладочными возможностями), все остальные порты являются
равнозначными и позволяют управлять спектрометром при помощи одного и того же набора команд.
Возможна реализация проксирования команд между портами master/slave с их перекодированием из одного
формата в другой.

\subsection{Внешний вид и средства управления и коммутации}
\begin{pict}
\includegraphics[width=0.8\textwidth]{sysboard}
\label{sysboard}
\caption{Печатная плата системы управления}
\end{pict}

На рис.~\ref{sysboard} изображена печатная плата системы управления, устанавливаемая на стойках в
металлический двухъярусный корпус (в нижнем ярусе размещены блоки питания 12\,В и~36\,В, в
верхнем~--- печатная плата). Для коммутации с внешними управляющими устройставми используются
последовательный порт (справа вверху, на схеме обозначен как \textbf{RS-232 (комп.)}) и USB (в
правой нижней части рисунка). Подключение вторичного исполнительного устройства (например,
калибровочной платформы) выполняется при помощи второго последовательного порта (справа внизу, на
схеме обозначен как \textbf{RS-232 (slave)}).

Остальные разъемы предназначены для подключения индикаторов, датчиков и исполнительных устройств:
\begin{description}
\item[Разъем затвора] --- управление затвором, а также двумя нагрузками, коммутируемыми нижними
силовыми ключами;
\item[SPI] --- подключение внешнего АЦП;
\item[Разъем ТРД] --- подключение восьми платиновых терморезистивных датчиков, установленных
	внутри криостата;
\item[Служебный разъем] --- подключение преобразователя \textit{USB$\leftrightarrow$TTL} для
программирования	микроконтроллера, а также подключение аналогового мультиплексора при работе с
внешним АЦП;
\item[Разъем передней панели] --- подключение средств индикации и управления затвором,
	расположенных на лицевой панели прибора;
\item[Силовой разъем] --- подключение концевых выключателей, датчиков Холла, шаговых двигателей,
	источников питания и возможность подключения нагрузки, коммутируемой верхним силовым ключом. 
\end{description}

\begin{pict}
\includegraphics[width=0.8\textwidth]{sisupr_front}
\label{sisuprfront}
\caption{Лицевая панель корпуса системы управления}
\end{pict}

На рис.~\ref{sisuprfront} изображена лицевая панель системы управления. На ней размещаются (по
обозначению на изображении):
\begin{description}
\item[Питание] --- силовой разъем (220\,В) питания и выключатель (<<включено>> при правом положении
	тумблера);
\item[0.75А] --- входной плавкий предохранитель на 0.75\,А, 220\,В;
\item[5А] --- плавкий предохранитель, установленный после блока питания, 5\,А, 12\,В;
\item[+12\,В] --- зеленый светодиод, отображающий наличие питающего напряжения~12\,В;
\item[+36\,В] --- желтый светодиод, отображающий наличие питающего напряжения~36\,В;
\item[нагрузка] --- красный светодиод, позволяющий детектировать подключение цепей <<нижнего>> и
	<<верхнего>> ярусов (соединение выходов блоков питания с силовым разъемом системы управления);
\item[Затвор] --- разъем для подключения затвора;
\item[Затвор ручн.] --- тумблер ручного управления затвором (<<открыто>> при правом положении
	тумблера);
\item[От системы сбора] --- управляющий сигнал закрытия\slash открытия затвора от системы сбора
(замыкание контактов вызывает закрытие затвора, размыкание~--- открытие);
\item[Система готова] --- зеленый светодиод, отображающий готовность системы управления к работе;
\item[Затвор открыт] --- красный светодиод, светящийся в случае, когда затвор находится в открытом
состоянии; при ошибке затвора (короткое замыкание или обрыв) этот светодиод мигает.
\end{description}


\section{Символьный режим управления}
\subsection{Описание}
В символьном режиме управления обработка команд производится посимвольно, символ конца строки не
имеет никакого значения и может быть использован для завершения введенных числовых
последовательностей.

После реакции на команду система управления (далее~--- СУ) производит эхо введенной команды. Если
введена неправильная команда, вместо эха возвращается вопросительный знак.

Краткую справку по командам при подключении в терминале можно узнать, нажав \verb'H'.

Некоторые команды требуют ввода числового значения (в этом случае в списке после команды записано:
\textbf{(число)}), либо даже двух числовых значений (записано \textbf{(число1) (число2)}).
Ввод числа выполняется без эха, для окончания ввода необходимо поместить во входной поток символ,
не являющийся цифрой (например, символ конца строки). После этого введенное число
выводится на экран и микроконтроллер ожидает подтверждения введенного числа (командой \verb'+')
либо отклонением его (командой \verb'-'). Прервать ввод числа можно вводом символа \verb'-' во
время ввода числа, либо вводом любого символа кроме знака <<минус>> или цифры сразу после запроса
на ввод числа. Команды с отметкой \textbf{(служ)} используются лишь в служебных режимах
(калибровка, градуировка и т.п.).

В случае получения неопознанных команд система управления возвращает символ вопросительного знака.

\subsection{Список команд символьного режима}
\begin{description}
\item[A] отображение сопротивлений терморезисторов по всем восьми каналам, а также отображение
	температур 1-wire термодатчиков;
\item[B] останов всех двигателей (может также использоваться для получения информации о
	текущем положении двигателей в шагах от условного нуля);
%\item[C] 
\item[D (служ)] переключение внешнего АЦП в режим двойного преобразования (по умолчанию);
\item[E (число)] состояние концевиков двигателя с указанным номером (если <<число>> выходит за
пределы значения $0\div4$, отображается состояние всех концевиков);
\item[F] отображение всех данных, сохраненных в перезаписываемой области флеш-памяти (калибровочные
	коэффициенты);
\item[G] отображение текущего периода тактового генератора шаговых двигателей (в миллисекундах на
	шаг);
\item[H (служ)] отображение справки по командам микроконтроллера;
\item[I (служ)] отключение флага инициализации внешнего АЦП;
\item[J (число)] установить турель щелей в указанную позицию (от 1 до 8);
\item[K (число)] установить турель фильтров~\No\,1 в указанную позицию (от 1 до 6);
\item[L (число)] установить турель фильтров~\No\,2 в указанную позицию (от 1 до 6);
\item[M (служ)] включить/выключить мониторинг температур;
%\item[N]
\item[O] включить мониторинг 1-wire термодатчиков;
\item[P (служ)] добавить в систему 1-wire термодатчик (не более восьми), добавление производится
	поочередно (нельзя вызывать эту команду, если к шине подключено больше одного датчика); для
	того, чтобы провести заново нумерацию датчиков, необходимо удалить сведения о предыдущих при
	помощи команды~\textbf{R}, а затем поочередно <<знакомить>> систему с каждым следующим
	датчиком; после перенумерации не забудьте сохранить данные во флеш-память командой~\textbf{f};
\item[Q] отключить мониторинг 1-wire термодатчиков;
\item[R (служ)] сбросить содержащиеся в ОЗУ микроконтроллера сведения об идентификаторах
	термодатчиков для выполнения процедуры перенумерации датчиков;
\item[S (служ)] переключение внешнего АЦП в режим одинарного преобразования (снижение точности,
	повышение скорости);
\item[T] отображение условного времени (в миллисекундах) с момента последнего перезапуска;
%\item[U]
%\item[V]
%\item[W]
\item[X (число)] установить период шаговых двигателей приводов линейных трансляторов в заданное
	число микросекунд;
%\item[Y]
\item[Z] отображение текущей позиции (в шагах от <<минусового>> концевика или первой
позиции турели) всех шаговых двигателей;
%\item[a]
%\item[b]
\item[c] закрыть затвор;
\item[d (служ) (число1) (число2)] изменить значение коэффициента~$d_i$ ($i={0..7}$~---
	терморезисторы, $i=8$~--- напряжение затвора, $i=9$~--- напряжение питания);
%\item[e]
\item[f] сохранить во флеш-память значения измененных коэффициентов преобразования АЦП и
	идентификаторов 1-wire термодатчиков;
\item[g (служ) (число)] коэффициент усиления внешнего АЦП;
\item[h] отобразить значение напряжения (в сотых долях Вольта) на конденсаторе затвора;
\item[i (служ)] инициализация внешнего АЦП;
%\item[j]
%\item[k]
%\item[l]
\item[m (служ) (число1) (число2)] изменить значение коэффициента~$m_i$ ($i={0..7}$~---
	терморезисторы, $i=8$~--- напряжение затвора, $i=9$~--- напряжение питания);
%\item[n]
\item[o] открыть затвор;
\item[p] отобразить значение основного ($+12\,$В) напряжения питания в сотых долях Вольта;
\item[q] отобразить состояние начальной инициализации линейных трансляторов;
\item[r] повторная инициализация затвора в случае ошибки (обрыв провода, короткое замыкание и т.п.);
\item[s (служ)] отображение значений по восьми каналам внешнего АЦП;
\item[t] отображение текущего состояния затвора (открыт\slash закрыт);
\item[u (служ)] отобразить состояние подключения USB;
%\item[v]
%\item[w]
\item[x (число)] установить период шаговых двигателей приводов турелей в заданное число микросекунд;
%\item[y]
\item[z] принудительная инициализация линейных трансляторов (установка в нуль);
\item[0..4 (число)] вращать шаговый двигатель с указанным номером на заданное число шагов
	(положительное значение числа шагов соответствует вращению в условном положительном направлении,
	отрицательное~--- в условном отрицательном).
\end{description}



\section{Строковый режим управления}
\subsection{Описание}
В строковом режиме система управления помещает входные данные в буфер вплоть до обнаружения во
входном потоке символа перевода строки. Далее строка целиком обрабатывается парсером команд,
выполняя заданные действия (либо отображая сообщение об ошибке формата команды).

Строковый режим предназначен для упрощения ввода команд с более высокого уровня интерфейса системы
управления (отсутствует необходимость подтверждения введенных численных значений, нет возможности
вызвать служебные команды). Данный режим является основным при работе с графическим интерфейсом
системы управления.

Формат команды в строковом режиме имеет вид \textbf{[ команда параметр ]}, где
\textbf{команда}~--- символ команды (аналогично символьному режиму, ниже приведен подробный список
команд, доступных в строковом режиме), \textbf{параметр}~--- параметр этой команды (если имеется).

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

Ответ на введенную команду имеет аналогичный формат. Команда может быть полностью повторена в
ответе, если выполнение действий, заданных этой командой, асинхронно (например, команда <<открыть
затвор>>). В случае возникновения ошибок при исполнении действий, заданных командой, внутри ответа
после символа команды идет слово \textbf{ERR}. Далее расшифровываются возможные ошибки. В случае
неправильного формата команды либо неверно заданных параметров (например, переместить турель
фильтра в позицию~\No\,7 при максимально возможных шести позициях) микроконтроллер не дает никакого
ответа.


\subsection{Список команд строкового режима}
Служебные команды (\textbf{служ}) для работы с внешним АЦП позволяют из графического интерфейса
системы управления выполнять мониторинг температурных режимов с высокой точностью. В основной
работе прибора эти команды не используются.

Режим работы системы управления \textbf{асинхронный}! Это означает, что микроконтроллер отсылает
информацию управляющему компьютеру без запроса от компьютера. Чтобы не пропустить сообщения,
необходимо выполнять неблокирующие операции с портом, к которому подключен микроконтроллер, проводя
периодический поллинг на предмет появления новых сообщений.

\begin{description}
\item[\hbox{[ A ]}] отображение сопротивлений терморезисторов по всем восьми каналам, а также
отображение температур 1-wire термодатчиков; ответ команды имеет вид \textbf{[ A номер
значение]}, где \textbf{номер}~-- номер датчика (поочередно от~0 до~7 для терморезисторов и от~8
до~15 для 1-wire), \textbf{значение}~-- сопротивление терморезистора (в сотых долях Ома) или
температура 1-wire датчика (в десятых долях~$\degr C$); температуры 1-wire датчиков отображаются
только в режиме мониторинга шины (включается командой \hbox{\textbf{[ O ]}});
\item[\hbox{[ B ]}] останов всех двигателей (может также использоваться для получения информации о
текущем положении двигателей в шагах от условного нуля); ответ имеет вид \textbf{[ B номер
(ERR)  (HEAT) позиция ]}, где \textbf{номер}~-- номер двигателя (поочередно от~0 до~4),
\textbf{позиция}~-- абсолютная позиция (в шагах) от условного нуля (позиция~1 для турели,
<<минусовой>> концевик для транслятора), флаг ошибки \textbf{ERR} может возникнуть для двигателей с
номерами~$0\div2$ (турели) при останове вне фиксированной позиции (это возможно при аварии
двигателя, датчиков Холла или проскальзывании шестерни, когда за один целый оборот турель не будет
установлена в заданную позицию), флаг ошибки
\textbf{HEAT} возникает в случае перегрева драйвера шаговых двигателей или короткого замыкания его
выходов;
\item[\hbox{[ E номер ]}] состояние концевиков двигателя с указанным номером; ответ команды имеет
формат \textbf{[ E номер значение ]}, где \textbf{значение}~-- дешифрованное значение позиции
концевика (для турелей это номер позиции, для линейных трансляторов~-- номер концевика (1~при
движении в положительном направлении, 2~---~при движении в отрицательном); если в качестве номера
двигателя задано число меньше 0 или больше 4, то отображается состояние всех концевиков;
при перемещении линейных трансляторов или турелей система управления асинхронно генерирует
сообщения, в которых указывается текущее значение позиции;
\item[\hbox{[ G ]}] отображение текущего периода тактового генератора шаговых двигателей (в
	миллисекундах на шаг); ответ имеет вид \textbf{[ G T1 T2 ]}, где T1~-- период генератора
	двигателей турелей, а T2~-- период генератора двигателей линейных трансляторов;
\item[\hbox{[ I ]} (служ)] отключение флага инициализации внешнего АЦП; ответом является эхо
команды;
\item[\hbox{[ J позиция ]}] установить турель щелей в указанную позицию (от~1 до~8); в случае
верного ввода команды ответом является эхо команды;
\item[\hbox{[ K позиция ]}] установить турель фильтров~\No\,1 в указанную позицию (от 1 до 6); в
случае верного ввода команды ответом является эхо команды;
\item[\hbox{[ L позиция ]}] установить турель фильтров~\No\,2 в указанную позицию (от 1 до 6); в
случае верного ввода команды ответом является эхо команды;
\item[\hbox{[ M ]} (служ)] включить/выключить мониторинг температур; ответ~--- эхо введенной
команды;
\item[\hbox{[ O ]} (служ)] запуск процесса сканирования 1-wire шины;
\item[\hbox{[ Q ]} (служ)] остановка процесса сканирования 1-wire шины;
\item[\hbox{[ T ]}] отображение условного времени (в миллисекундах) с момента последнего
перезапуска; ответ имеет вид \textbf{[ T ovr cnt ]}, где \textbf{ovr}~-- значение счетчика
переполнения основного таймера, \textbf{cnt}~-- значение основного счетчика (количество условных
миллисекунд с момента последнего рестарта системы); 
\item[\hbox{[ X период ]}] установить период шаговых двигателей приводов линейных трансляторов в
заданное число микросекунд; ответом является эхо команды, если \textbf{период} имеет значение в
диапазоне \verb'uint16_t';
\item[\hbox{[ Z ]}] отображение текущей позиции (в шагах от <<минусового>> концевика или первой
позиции турели) всех шаговых двигателей;
\item[\hbox{[ b ]}] перевести режим ввода в символьный; ответом является эхо команды, после
которого система будет ожидать команды в символьном режиме, перевод в строковый режим будет
выполнен автоматически при первом же появлении знака \verb'[' в начале командной последовательности;
\item[\hbox{[ c ]}] закрыть затвор; ответом является эхо команды, если команда принята (т.е. затвор
инициализирован и находится в противоположном заданному состоянии);
\item[\hbox{[ h ]}] отобразить значение напряжения (в сотых долях Вольта) на конденсаторе затвора;
ответ имеет вид \textbf{[ h напряжение ]};
\item[\hbox{[ i ]} (служ)] инициализация внешнего АЦП; ответом является эхо команды;
\item[\hbox{[ o ]}] открыть затвор; ответом является эхо команды, если команда принята (т.е. затвор
инициализирован и находится в противоположном заданному состоянии);
\item[\hbox{[ p ]}] отобразить значение основного~($+12\,$В) напряжения питания в сотых долях
Вольта; ответ имеет вид \textbf{[ h напряжение ]}; данное сообщение асинхронно генерируется
системой управления в случае снижения пиковой просадки напряжения ниже 9\,В при получении команды
движения или ниже 7.5\,В при работе шаговых двигателей (в этом случае также генерируется команда
останова всех активных двигателей);
\item[\hbox{[ q ]}] запрос состояния процедуры инициализации линейных трансляторов; ответ имеет
форму \textbf{[ q статус ]}, где \textbf{статус}:
	\begin{description}
	 \item[started] начальное состояние, подготовка к установке нуля транслятора фокуса;
	 \item[focus] движение транслятора фокуса в нуль;
	 \item[sin] движение транслятора синусного механизма в нуль;
	 \item[ready] инициализация окончена;
	\end{description}
\item[\hbox{[ r ]}] повторная инициализация затвора в случае ошибки (обрыв провода, короткое
замыкание и т.п.); ответом является эхо команды;
\item[\hbox{[ s ]} (служ)] отображение значений по восьми каналам внешнего АЦП;  ответ зависит от
текущего состояния АЦП: если АЦП не был инициализирован (или отсутствует), будет произведена
попытка инициализации, а в ответ послано эхо команды, если же АЦП был проинициализирован, то в ответ
приходит восемь сообщений вида \textbf{[ s номер ADU]}, где \textbf{номер}~-- номер
датчика (от~0 до~8), а \textbf{ADU}~-- отсчеты АЦП в условных единицах;
\item[\hbox{[ t ]}] отображение текущего состояния затвора; ответ команды имеет вид \textbf{[ t
статус (reed состояние) ]}, где \textbf{статус} может иметь одно из следующих значений:
	\begin{description}
	\item[testing] затвор находится в состоянии проверки на отсутствие обрыва;
	\item[ready] затвор инициализирован и готов выполнять команды;
	\item[opened] затвор был открыт внешней командой (в т.ч. тумблером либо сигналом с системы
		сбора);
	\item[closed] затвор был закрыт внешней командой;
	\item[charged for opening] или \textbf{charged for closing} была получена команда
		открыть или закрыть затвор, но конденсатор еще недостаточно заряжен, команда будет выполнена
		как только напряжение на обкладках конденсатора достигнет 20\,В;
	\item[in process] вам удалось опросить затвор в те миллисекунды, когда он находится в
		состоянии закрывания или открывания;
	\item[error] произошла ошибка: обрыв провода либо короткое замыкание, эту ошибку необходимо
		устранить, а затем опять инициализировать затвор;
	\item[not initialised or broken] затвор не был инициализирован либо конденсатор затвора
		не подключен к источнику~36\,В;
	\end{description}
флаг \textbf{состояние} описывает реальное состояние геркона затвора и имеет значение
\textbf{opened}, если затвор открыт, либо \textbf{closed}, если затвор закрыт;
\item[\hbox{[ x период ]}] установить период шаговых двигателей приводов турелей в заданное число
	микросекунд; ответом является эхо команды, если \textbf{период} имеет значение в диапазоне
	\verb'uint16_t';
\item[\hbox{[ z ]}] принудительная инициализация линейных трансляторов (установка в нуль);
состояние процедуры можно узнать по запросу \textbf{[ q ]};
\item[\hbox{[ 0..4 шаги ]}] вращать шаговый двигатель с указанным номером на заданное число шагов
(положительное значение числа шагов соответствует вращению в условном положительном направлении,
отрицательное~--- в условном отрицательном); ответом является эхо команды.
\end{description}
Команды \textbf{J}, \textbf{K} и \textbf{L} (движение турелей) и \textbf{0..4} (движение
двигателей на заданное количество шагов) не возвращают эха введенной команды в случае, если
данный двигатель или двигатель из общей группы с данным еще находится в движении. После того, как
указанный шаговый двигатель достигнет заданной позиции, а также в случае возникновения ошибки,
микроконтроллер посылает сообщение вида \textbf{[ B номер (ERR) (HEAT) ]} (см.~описание команды
\textbf{[ B ]}).  При попытке движения линейного транслятора, стоящего на концевике, в сторону этого
концевика, вместо эха принятой команды к движению ответ будет иметь вид аналогичный команде
<<стоп>>. Проход турелей через фиксированные позиции (а также наезд линейного транслятора на
концевик) сопровождается отчетом о текущей позиции (ответ команды \textbf{[ E ]}).

В режиме мониторинга температур микроконтроллер один раз в условные 10~секунд отсылает данные,
аналогичные ответу на запрос \textbf{[ A ] [ s ]}.

В случае, когда поведение системы не соответствует ожиданиям, необходимо проверить значение
счетчика условного времени командой \textbf{[ T ]}, позволяющего определить, была ли система
перезапущена из-за какого-то внешнего фактора.

\end{document}
