//Оптический датчик представляет собой два отражательных оптрона, размещенных
//под крыльчаткой с количеством лопастей BLADES. На выходе датчика формируются
//квадратурные сигналы F1 и F2, которые подаются на порты PB0 и PB1.
//Обработка сигналов датчика ведется в прерывании Opto_Handler по изменению
//состояний линий порта. В прерывании на основе анализа текущего и предыдущего
//состояний сигналов F1 и F2 принимается решение о инкременте или декременте
//счетчика Count. На каждую лопасть крыльчатки приходится 4 события инкремента
//или декремента, т.е. реализован 4X-квадратурный декодер. На каждый оборот
//ролика приходится EV_PER_REV = BLADES * DECODER = 5 * 4 = 20 событий.
//Максимальная частота прерываний для максимальной скорости ленты на перемотке
//Vmax = 10 м/с, диаметра ролика Diameter = 37.9 мм и количества лопастей
//BLADES = 5 составляет Fmax = Vmax / (Diameter * PI) * BLADES * DECODER =
//10000 мм/с / (37.9 мм * 3.14159) * 5 * 4 = 1680 Гц
//Счетчик Count всего 8-разрядный, его задача - не переполниться между опросами
//основной программой, период которых задает программный таймер PollTimer.
//Чтение счетчика Count выполняется при запрещенных прерываниях, после
//чтения он обнуляется. Фактически, этот счетчик содержит значение приращения
//количества событий Delta между двумя опросами. Основная программа на основе
//значения Delta осуществляет счет событий оптического датчика в 32-разрядной
//переменной Events.
//На основе переменной Events вычисляется значение метража:
//Metrage = Events * Diameter * PI / EV_PER_REV.
//Вычисления проводятся в целочисленной математике, для предотвращения ошибки
//величина Metrage вычисляется в микрометрах.
//Значение диаметра ролика Diameter не является константой, а вычисляется
//в процессе процедуры калибровки.
//На основе переменной Metrage вычисляется значение реального времени
//для выбранной скорости ленты:
//Time = Metrage / Speed.
//Скорость ленты выбирается с помощью логического сигнала 9/19.
//Если используются скорости 19/38, необходимо установить перемычку JMP3.
//Для предотвращения переполнения величину Events надо ограничить.
//Информационная емкость дисплея ±9999.9 м или ±9 часов, 59 минут, 59 секунд,
//что составляет ±35999 секунд. На скорости 38.1 см/с это сответствует примерно
//±13716 м, на скорости 19.05 см/с ±6858 м, на скорости 9.525 см/с
//±3429 м. Как видно, наиболее жесткое ограничение дает индикация
//реального времени на самой низкой скорости. Чтобы избежать переполнения,
//диапазон метража ограничен величиной ±2999.9 м, что достаточно для катушек
//любого размера с любой толщиной ленты.
//В результате реальное время ограничено до:
//на скорости 9.525 см/с до ±31496 секунд (±8 часов, 44 минут, 56 секунд),
//на скорости 19.05 см/с до ±15748 секунд (±4 часа, 22 минут, 28 секунд),
//на скорости 38.1 см/с до ±7874 секунд (±2 часа, 11 минут, 14 секунд).
//Реализованы два независимых счетчика - реального времени TimeCounter и
//времени звучания фрагмента LapTimeCounter.
//Для вычисления реальной скорости ленты используется измеритель на базе
//аппаратного таймера 1. Измеритель использует прерывание по захвату -
//на вывод ICP подается один из сигналов оптического сенсора.
//При старте измерителя запускается программный таймер с интервалом M_PRE_TM.
//Если в течение этого времени с выхода сенсора импульс не приходит, скорость
//считается нулевой. Минимальная измеряемая скорость с данными значениями
//констант составляет примерно 5 cm/s.
//Когда приходит импульс с оптического датчика, производится захват значения
//таймера в переменную CapBeg, запускается измерительный интервал M_RUN_TM,
//и начинается счет импульсов. Когда интервал заканчивается, делается попытка
//досчета импульсов до целого числа оборотов ролика (иначе погрешность
//изготовления крыльчатки приведет к ошибке измерения). На досчет отводится
//время M_FIN_TM. Если за это время не приходит ни один импульс, скорость
//считается нулевой. Если не приходит нужное количество для досчета до целых
//оборотов крыльчатки, расчет производится по нецелому количеству оборотов.
//Вычисляется длительность одного оборота ролика:
//TurnTime = T_timer * (CapEnd - CapBeg) / Turns
//Затем на основе этой длительности и диаметра ролика вычисляется скорость:
//Speed = Diameter * PI / TurnTime;
//Процедура калибровки диаметра ролика использует данные измерителя скорости.
//Чтобы в вычислениях не участвовал старый диаметр ролика (который
//может иметь большую ошибку), значение измеренной скорости не используется.
//Вместо этого используется длительность оборота. Для повышения точности
//калибровки измерение проводится CAL_CYCLES раз, при этом вычисляется
//суммарное время TimeSum. Затем вычисляется диаметр ролика:
//D = (TimeSum * SPEED_19) / (PI * CAL_CYCLES / T_timer)
//С данными значениями констант длительность калибровки составляет примерно
//14 сек., измерение проводится 10 раз, каждое из них длится 2 оборота ролика.
//Если вычисленное значение диаметра ролика не укладывается в диапазон
//от 30 до 70 мм, то возникает ошибка калибровки.
[свернуть]
Социальные закладки