Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Эрни Каспер Программирование на языке Ассемблер...doc
Скачиваний:
120
Добавлен:
09.11.2019
Размер:
954.88 Кб
Скачать

7.4.Программирование приема информации от датчиков

Счетчик микроконтроллера позволяет осуществить ввод информации в случае ее представления частотой импульсов. Простейшим примером является измерение угловой скорости ротора электродвигателя при помощи обтюратора, прерывающего световой поток в оптронной паре. Пусть светодиод оптронной пары включен, и накопление импульсов осуществляется в течение 0,1 с, а обтюратор содержит 24 щели. Тогда угловой скорости 1000 об/мин соответствует частота импульсов 400 Гц. Из-за отсутствия синхронизации и из-за погрешностей изготовления обтюратора в разных циклах счета при этой скорости может накопиться от 39 до 41 импульсов. Абсолютная погрешность единичного измерения, обусловленная квантованием входного сигнала, в этом случае не превышает 25 об/мин, что вполне допустимо для многих приложений. Для уменьшения этой погрешности можно увеличить время накопления, но тогда увеличивается погрешность измерения, обусловленная измене­ниями угловой скорости ротора (например, угловым ускорением). Если угловая скорость ротора не превышает 10000 об/мин, то в микроконтрол­лере она представляется числом не более 400. В этом случае для ее хра­нения нужно отвести два байта. Пусть измеренное значение скорости надо записать в ячейки omgl (младший байт) и omgh (старший байт).

При инициализации счетчика в старшую половину байта регистра управления режимами нужно записать Dh. Если частота прерывания равна 100 Гц, то ввод угловой скорости должен осуществляться на каж­дом десятом цикле. Измерение угловой скорости относится к срочным задачам, поэтому приведенный ниже пример должен располагаться в основной части программы:

DEC ten ; счетчик для перехода от 100 Гц к 10 Гц

MOV A, ten ; для проверки содержимого счетчика

JNZ nomes ; переход в 9 циклах из 10

CLR TR1 ; остановка счетчика 1

MOV omgl, TL1 ; чтение мл. байта скорости

MOV omgh, TH1 ; чтение ст. байта скорости

MOV ТL1, #0 ; очистка мл. байта счетчика

MOV TH1, #0 ; очистка ст. байта счетчика

SETB TR1 ; запуск счетчика 1

MOV ten, #10 ; запись 10 для следующего измерения

nomes: NOP ; для записи метки

К приведенному примеру следует сделать следующие разъяснения. Команды, относящиеся к переходу от 100 Гц к 10 Гц следует использо­вать для обслуживания всех блоков, которые должны работать с частотой 10 Гц. В случае необходимости оптимизации программы по времени работы нужно выполнять различные блоки при разных значениях пере­менной ten, передавая им управление по сравнению накопителя с соот­ветствующими константами. Команды остановки и запуска счетчика 1 в данной программе нужны потому, что из-за задержки между моментами чтения содержимого младшего и старшего байтов счетчика может поя­виться ошибка.

Впрочем исключение ошибки считывания содержимого счетчика при помощи его остановки может привести к погрешности измерения за счет потери входных импульсов. Ниже приведен пример чтения обоих байтов счетчика без его остановки, что необходимо для повышения точности измерений (в особенности при использовании накапливающего фильтра). Для разрешения неопределенности результатов чтения старший байт читается дважды. Между двумя чтениями содержимого старшего байта счетчика производится чтение младшего байта. Интервал между этими событиями при заданной тактовой частоте составляет всего 2 мкс, тем не менее существует вероятность несовпадения значений при первом и втором чтении старшего байта счетчика. Она тем больше, чем выше измеряемая частота. При несовпадении необходимо определить, какое из двух значений старшего байта соответствует прочитанному значению младшего байта. Изменение значения старшего байта возможно только в результате переноса из младшего. Следовательно, если при несовпадении старших байтов старший бит младшего байта равен 1, то нужно использо­вать результат первого чтения, а в случае 0 нужно использовать результат второго чтения.

MOV A, TH1 ; 1-ое чтение ст. байта счетчика

MOV R2, ТL1 ; чтение мл. байта счетчика

MOV R3, ТН1 ; 2-ое чтение ст. байта счетчика

XRL A, R3 ; проверка двух значений на совпадение

JZ tlok ; переход по совпадению значений

MOV A, R2

JNB А.7, tlok ; переход по переполнению мл. байта

DEC R3 ; уменьшение ст. байта

tlok: CLR С

MOV A, R2 ; новое значение мл. байта счетчика

SUBB A, tlold ; вычитание старого значения мл. байта

MOV tlold, R2 ; запоминание мл. байта счетчика

MOV omgl, А ; мл. байт измерения

MOV A, R3 ; новое значение ст. байта счетчика

SUBB A, thold ; вычитание старого значения ст. байта

MOV thold, R3 ; запоминание ст. байта счетчика

MOV omgh, А ; ст. байт измерения

После получения корректного значения содержимого счетчика измерение получается, как разность нового и старого значений, а новое значение запоминается для следующего цикла. Отметим, что вычитание дает правильный результат даже в случае однократного переполнения 16 разрядов счетчика между двумя обращениями к приведенной программе. Кстати, стоит обратить внимание на то, что значение масштаба для представления измеренной скорости продиктовано характеристиками аппаратуры (обтюратор) и длительностью интервала накопления. Если нужно выводить измеренную скорость в об/мин на цифровую индикацию, то возможны два подхода. При первом подходе можно умножить изме­ренное значение на 25. Но в этом случае усложняется перевод двоичного кода в десятичный, да и две последние цифры будут недостоверными. При втором подходе можно разделить измеренное значение на 4 посред­ством двух сдвигов вправо. В этом случае перевод двоичного кода в десятичный получается одной операцией деления, а в младших разрядах скорости можно вывести на индикацию нули.