Главная

Материал взят из книги


Скачать оригинал КНИГИ в хорошем качестве

Обработка сигналов с датчика поворота антенны

Как уже говорилось, датчик поворота антенны представляет собой гер-кон — пара герметичных контактов с магнитным управлением, который установлен в поворотном механизме антенны (актюаторе) на выходе первичного редуктора. На оси редуктора закреплен постоянный магнит, который вращается вместе с осью и при каждом обороте вызывает замыкание контактов датчика, сигнал с датчика через схему гальванической развязки поступает на линию 1§ег (Р1.4) микроконтроллера. Используя этот сигнал, процессор должен постоянно отслеживать положение антенны. Главная проблема, с которой мы сталкиваемся при разработке подобной программы — это дребезг контактов датчика. О том, что такое дребезг, мы уже подробно говорили в главе 1.

Так как датчик поворота антенны состоит всего из одной пары контактов, то единственный способ борьбы с дребезгом контактов — это фильтрация паразитных импульсов при помощи интегрирующих цепочек. Однако в схеме позиционера интегрирующих цепочек не предусмотрено. Та же задача решается на программном уровне. Поэтому, первое, что делает рассматриваемая в настоящем разделе подпрограмма, реализует алгоритм программной интеграции входных импульсов. Для надежности применен двухэтапный антидребезговый алгоритм. Прежде, чем рассматривать его подробнее, я хотел бы остановиться на некоторых теоретических моментах.

Срабатывание датчика поворота — это достаточно медленный процесс. Он лишь немного быстрее, чем процесс нажатия кнопок клавиатуры. Поэтому управляющая программа за время между двумя срабатываниями датчика также успевает пройти по основному циклу несколько тысяч раз. Столько же раз будет вызвана рассматриваемая подпрограмма 1вегк. Поэтому процесс интеграции придется сделать распределенным. Это значит, что обработка одного импульса с датчика положения будет происходить не за один, а за несколько циклов обращения к подпрограмме igerk. Причем распределенным является лишь второй этап алгоритма.

Первый этап антидребезговой обработки — это десятикратное чтение сигнала с датчика. Такое чтение происходит в каждом цикле обращения к подпрограмме igerk, в самом ее начале. Просто производится десять последовательных считываний сигнала с линии igeг. Весь процесс десятикратного считывания выполняется всего за 20 микросекунд при длительности сигнала с датчика порядка 50... 100 мс. При считывании реального сигнала, часть считанных значений будут отличаться от действительного состояния датчика. Различия вызваны влиянием дребезга контактов и сигналами помехи. Затем происходит усреднение считанного результата. Все десять полученных значений складываются, а затем производится оценка того, каких значений было больше — нулей или единиц. Если полученная сумма окажется больше либо равна пяти, то программа считает, что реальное состояние геркона в момент считывания соответствует единичному сигналу (геркон разомкнут). Если сумма меньше пяти, то это означает, что состояние геркона соответствует нулю (геркон замкнут). Первый этап позволяет избавиться лишь от высокочастотных помех. Для фильтрации всех остальных помех и повышения надежности распознавания сигналов с датчика положения антенны введен второй этап программной интеграции.

Второй этап имитирует работу накопительного конденсатора. Роль этого конденсатора выполняет специально отведенный для этой цели регистр процессора. В программе этот регистр обозначен меткой 5ге|. Работает программный имитатор накопительного конденсатора следующим образом. При каждом обращении к подпрограмме обработки сигнала с геркона, происходит либо увеличение, либо уменьшение содержимого регистра вгец, в зависимости от того, какое значение входного сигнала было получено после первого этапа антидребезгового алгоритма. Если после первого этапа получена единица, то содержимое ячейки увеличивается. Если ноль, то уменьшается. Изменение значения регистра ограничено, как сверху, так и снизу. Если значение регистра достигнет нуля, то операция по уменьшению содержимого ячейки блокируется. При нулевом значении вгец возможно только увеличение его значения. Второе ограничение наступает при достижении верхнего предела. Значение верхнего предела равно tger. Если в процессе интеграции значение регистра достигнет величины tger, операция увеличения блокируется. В этом случае возможно только уменьшение.

Описанный выше алгоритм приводит к тому, что наш программный «конденсатор» от каждого единичного импульса «подзаряжается», а от каждого нулевого в такой же мере «разряжается». Однако это еще не все. После программного конденсатора стоит программный триггер Шмитта.

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

Рис. 47 отражает весь процесс работы триггера. Вначале входное напряжение триггера равно нулю. На выходе низкий логический уровень (левая нижняя точка графика). Входное напряжение повышается. Выходное напряжение, при этом, остается без изменений. Такая ситуация сохраняется до тех пор, пока уровень входного напряжения не достигнет верхнего порога срабатывания (и„2). При достижении порога, триггер моментально переключается, и на его выходе устанавливается высокий логический уровень. При дальнейшем росте входного напряжения, выходной уровень уже не меняется. Весь описанный процесс обозначен на рис. 47 стрелками и помечен буквой Ь.

При уменьшении входного напряжения на выходе сохраняется высокий логический уровень. Переключение триггера в пулевое положение произойдет только при достижении нижнего порога срабатывания (ип]). Этот процесс отражает часть характеристики, обозначенная буквой а. Применение триггера Шмитта позволяет значительно повысить помехозащищенность любой системы. Слабый сигнал помехи не сможет переключить триггер. К тому же триггер Шмитта повышает крутизну фронта поступающих на него импульсов.

Но вернемся к нашей программе. Программный триггер Шмитта служит для той же цели, что и его физический аналог. Для реализации алгоритма триггера Шмитта в программу введен флаг гистерезиса Agis. Состояние этого флага имитирует выходной сигнал триггера. Входным «сигналом» является текущее значение накопительного регистра sreg. Верхний и нижний пороги срабатывания триггера — это те же самые пороги, которые ограничивают диапазон значений регистра sreg. Для реализации триггерного режима используется специальная программа, алгоритм работы которой сводится к следующему:

■ Флаг Agis устанавливается в единицу только в том случае, когда значение накопительного регистра sreg достигнет верхнего порога.

■ Сброс флага Agis в нулевое состояние происходит лишь в тот момент, когда значение регистра sreg станет равно нулю.

■ В промежутке же между двумя этими событиями, когда наш «конденсатор» «заряжается» или «разряжается», состояние флага гистерезиса остается неизменным.

На этом антидребезговая процедура заканчивается. В результате ее работы переключения флага можно считать импульсами от датчика поворота антенны свободными от помех. Состояние флага будет повторять состояние датчика поворота с небольшой задержкой по фазе, вызванной процессом интеграции. Далее программа приступает к выполнению основного действия: изменяет значение счетчика поворота антенны. Это изменение происходит по переднему фронту сигнала, то есть в момент установки флага Яців в единичное состояние. В зависимости от направления вращения двигателя содержимое счетчика либо увеличивается, либо уменьшается. Для этого производится оценка содержимого буфера управления мотором. Если на мотор подана команда,«прямой ход», то содержимое счетчика положения антенны увеличивается на единицу. Если на мотор подана команда «реверс», то показания счетчика уменьшаются на единицу.

Ниже приведен фрагмент №7 управляющей программы позиционера. Он представляет собой полный текст подпрограммы обработки сигнала с геркона.

Первая команда подпрограммы — это команда установки линии подключения геркона ^ег) в единичное состояние. Вместо имени Р1.4 используется Команда введена для перестраховки, чтобы гарантировать работу этой линии в режиме ввода. Для установка разряда используется оператор зеф.

Далее идет группа команд первого этапа антидребезга (десятикратного считывания). Регистр гО используется в качестве счетчика циклов считывания. Поэтому в этот регистр помещается число 10. Именно столько циклов считывания нам нужно произвести. Обратите внимание на то, что в данном случае число 10 записано в десятичном формате. Регистр а (аккумулятор) используется в данном случае для подсчета суммы всех принятых битов. Поэтому, перед началом цикла программа записывает туда ноль. Цикл десятикратного чтения организуется при помощи команды фпг. В теле цикла всего две команды. Первая производит чтение разряда iger и запись его значения в ячейку признака переноса. Вторая команда в теле цикла (асМс) — это команда сложения содержимого аккумулятора с константой с учетом признака переноса. Так как в качестве константы применяется ноль, то в каждом цикле считывания к текущему значению аккумулятора прибавляется лишь значение признака переноса. После окончания всех десяти циклов считывания там окажется число, равное сумме всех считанных разрядов.

Остановимся подробнее на операторе djnz. Это оператор организации цикла. Он имеет два параметра. Первый параметр (в нашем случае это гО) всегда указывает на один из регистров общего назначения. Этот регистр используется в качестве счетчика цикла. Второй параметр — это адрес перехода. Оператор djnz действует следующим образом:

■ Сначала программа выполняет команды, входящие в гело цикла. Сразу после тела располагается оператор djnz.

■ Этот оператор уменьшает содержимое регистра счетчика цикла на единицу и затем проверяет его на равенство нулю.

■ Если значение счетчика не равно нулю, то выполняется переход на начало цикла и цикл повторяется снова.

■ Когда содержимое счетчика цикла достигнет нуля, перехода на начало цикла не произойдет, пикт закончится, и программа продолжит свое выполнение с оператора, непосредственно следующего за djnz.

После окончания цикла происходит проверка полученной суммы, которая к этому моменту находится в аккумуляторе. Для проверки при помощи команды subb производится вычитание из содержимого накопителя числа 5. В результате вычитания признак переноса будет содержать нужную нам информацию. Если число в накопителе меньше пяти, то в результате вычитания получится отрицательное число, а значит, признак переноса с установится в единицу. Если число в накопителе больше или равно пяти, то результат будет положительный, либо ноль. В этом случае признак переноса окажется сброшенным в ноль.

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

Ветвь уменьшения (метка ingl) начинается с проверки регистра sreg на равенство нулю. Проверка производится при помощи оператора cjne. Если sreg оказался равен нулю, то это значит, что мы имеем дело с нижним порогом программного «конденсатора». А по сему, никакого уменьшения не происходит, флаг гистерезиса сбрасывается в ноль, и затем происходит выход из подпрограммы. В том случае, если содержимое sreg не равно нулю, происходит переход к метке ingl, где и происходит уменьшение значения sreg. Уменьшение выполняется при помощи команды dec. Команда получила название от слова «декремент», которое и означает «уменьшение». В нашем случае команда dec уменьшает значение интегрирующего регистра sreg. На этом данная ветвь заканчивается. Так как достижение нижнего предела не должно вызывать дальнейших действий, в копне этой ветви программы стоит команда ret, которая осуществляет выход из подпрограммы.

Ветвь увеличения интегрирующего регистра sreg выполняет те же действия, что и ветвь уменьшения, но с точностью до наоборот. Переход к этой ветви программы происходит в том случае, если после первого этапа антидребезга сумма битов оказалась больше 5. Начинается эта ветвь с метки ing2. И первое, что делает программа в этом случае — проверяет текущее значение интегрирующего регистра sreg. Для этого, сначала в аккумулятор загружается константа, равная максимальному его значению (treg). Значение этой константы определяет постоянную времени интегрирования. Далее происходит сравнение текущего значения sreg с константой.

Сравнение происходит по уже знакомой схеме. Оператор subb вычитает из значения константы текущее значение интегрирующего регистра. В результате признак переноса установится в единицу в том случае, если заданный предел еще не достигнут и останется равным нулю в противном случае. Далее, в зависимости от результата сравнения, принимается решение: увеличивать интегрирующий регистр или нет. Если верхний предел не достигнут, программа увеличивает содержимое sreg и заканчивает на этом свою работу. Увеличение значения регистра выполняется при помощи оператора inc (инкремент). Его действие обратно действию оператора dec.

В случае достижения верхнего предела увеличение содержимого sreg не происходит, зато происходит несколько дополнительных действий. Это установка флага гистерезиса в единичное состояние и обнаружение переднего фронта. Для обнаружения переднего фронта проверяется предыдущее значение флага гистерезиса. Если предыдущее значение флага равно единице, то это значит, что значение флага не изменилось. Это не передний фронт, а середина импульса. В том случае, если предыдущее значение флага равно нулю, то это значит, что мы имеем дело с передним фронтом сигнала. Именно в этом случае программа выполняет изменение содержимого счетчика положения антенны.

Проверка флага гистерезиса начинается с адреса ing3. Сначала значение флага гистерезиса (Agis) сохраняется в ячейке признака переноса с. Следующая команда (setb) устанавливает бит Agis в единицу. Затем происходит проверка старого значения флага (je). Если старое значение флага, находящееся н с, равно единице, выполняется переход в конец подпрограммы (inglO) и выход из нее. Если старое значение флага равно нулю, то программа переходит к процедуре обработки полученного сигнала.

Обработка полученного сигнала начинается с проверки направления вращения двигателя. Для этого в аккумулятор загружается содержимое ячейки ёортоЕ Как уже говорилось ранее, ячейка ёорто! — это дублирующая ячейка для команд управления мотором. Когда в основную ячейку Ьийпо! записываются команды «вращение вперед» (01Н) или «вращение назад» (ЮН), то они же помещаются в ячейку ёортоЕ Когда же в ячейку Ьийпо! помещают команду «стоп» (ООН), то в йорпкП она не дублируется. В результате во время действия команды «стоп», в ячейке ёоршо! находится информация о направлении движения двигателя до его остановки. Это позволяет правильно определять направление вращения в том случае, если после поступления команды остановки антенна продолжает вращаться по инерции.

Следующий оператор (сЦпе) производит сравнение значения управляющего кода с числом 01Н. Если управляющий код равен 01Н, выполняется переход к процедуре увеличения значения счетчика положения антенны (по адресу 1Г^4). В противном случае выполняется процедура уменьшения значения этого счетчика.

Счетчик положения антенны имеет 16 разрядов и хранится в двух ячейках памяти. Старшие разряды счетчика хранятся в ячейке с адресом ра!ек, а младшие — в ячейке ра!ек+1. Поэтому, как увеличение, так и уменьшение его значения проходят в два этапа.

Рассмотрим сначала процедуру уменьшения значения счетчика. Начинается процедура с проверки младшего-и старшего байтов счетчика на равенство нулю. Для осуществления проверки в аккумулятор записывается ноль. Затем, при помощи оператора супе содержимое аккумулятора сравнивается с содержимым ячеек памяти, в которых хранится код счетчика положения антенны. Сначала младший байт счетчика проверяется на равенство нулю. Если он не равен нулю, то программа выполняет переход по адресу н^5, где происходит уменьшение значения младшего байта на единицу и выход из подпрограммы.

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

Процедура увеличения значения счетчика поворота антенны построена аналогично процедуре уменьшения. Отличие в том, что байты счетчика сравниваются не с нулем, а с максимально возможным для них значением — ОРРН, а при увеличении значения старшего байта, младший приравнивается к нулю.

И, наконец,' последняя группа команд. Она начинается с метки ^9. Управление в эту точку программы передается только в том случае, если в результате всех предыдущих преобразований значение счетчика положения антенны было изменено. В этом случае производится запись нового положения антенны во внешнюю флэш-память. Запись производится при помощи подпрограммы wr_fl. Эта подпрограмма работает в паре с подпрограммой гс1_А, описанной ранее. Запись производится сразу по два байта. Для правильной работы подпрограммы в регистр а (аккумулятор) процессора помещается адрес пары ячеек флэш-памяти, где должна храниться записываемая величина. В регистр Ь помещается адрес ячеек ОЗУ, служащих источником информации. В нашем случае источником служат ячейки счетчика положения антенны.

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

Используются технологии uCoz