Печать

Частотомер на PIC16F873 и семисегментных индикаторах

Опубликовано . Опубликовано в Устройства на PIC

Рейтинг:   / 6
ПлохоОтлично 

Этот восьмиразрядный прибор может измерять частоту синусоидального и импульсного сигнала от 1 Гц до 50 МГц. Время измерения — 1 и 10 с. Дисплей частотомера выполнен на семисегментных светодиодных индикаторах с общим катодом. Особенностью данного частотомера является то, что в нем может быть использован любой кварцевый резонатор на частоту в диапазоне 10...20 МГц.

В разработанном частотомере применен микроконтроллер PIC16F873, который имеет 28 выводов. Это позволило использовать 16 выходов для непосредственного управления сегментами и разрядами светодиодных индикаторов. Кроме того, этот микроконтроллер имеет три таймера с предделителями. Восьмиразрядный таймер TMR0 и его восьмиразрядный предделитель вместе с двумя дополнительными регистрами используются для подсчета измеряемой частоты. Извлечение значения предделителя выполняется известным способом, заключающимся в досчитывании до нуля с одновременным подсчетом числа импульсов досчета. Таким образом, максимальная разрешающая способность счетчика составляет 32 двоичных разряда.

Таймер TMR1 имеет 16 разрядов и трехразрядный предделитель. Этот таймер используется для формирования интервалов времени 0,1 с, а два последующих регистра-делителя на 10 формируют время измерения в 1 и 10 с. При использовании кварцевых резонаторов на любую частоту достаточно сделать программную предварительную установку двух регистров таймера TMR1. При этом отпадает необходимость в точной подстройке частоты самого резонатора.

Поскольку эти два таймера могут работать одновременно без участия АЛУ микроконтроллера, появилась возможность обеспечить динамический запуск индикаторов. На время прерываний по переполнению таймеров программа прекращает индикацию. Время, за которое выполняется прерывание, незначительно, поэтому визуально не отслеживается (видно только при частотах резонатора ниже 5 МГц).

Схема частотомера приведена на рис. 1. Выходы порта В микроконтроллера используются для управления сегментами индикаторов, а выходы порта С — для коммутации их катодов. Выводы порта A RA0 и RA1 управляются кнопками SB1 и SB2 (соответственно «Время измерения» и «Пуск»). Вывод RA5 соединен непосредственно со счетным входом RA4. С выхода RA5 на счетный вход подается лог. О, закрывающий вход для прохождения счетных импульсов, и импульсы досчитывания.

Частотомер на PIC16F873 и семисегментных индикаторах

Для превращения этого частотомера в полноценный измерительный прибор его необходимо снабдить широкополосным формирователем импульсов. В частотомере применены две матрицы семисегментных индикаторов с общим катодом фирмы Kingbright CC56-12GMR. Каждая матрица содержит четыре индикатора, их одноименные сегменты соединены между собой внутри блока. Первый вывод матрицы маркируется единичкой, которую видно под слоем герметика. Эти индикаторы желто-зеленого цвета свечения имеют большие размеры цифр (высота цифры 15 мм) и малый ток потребления, что обеспечивает потребляемый частотомером ток менее 50 мА. Естественно, можно использовать любые цифровые индикаторы с общим катодом, но тогда, возможно, потребуется подстройка яркости свечения подбором резисторов R8—R15.

Если сделать небольшие изменения в программе, то можно использовать и светодиоды с общим анодом. Для этого в третьем блоке подпрограмм «Таблица сегментов для общего катода» необходимо заменить данные для «Катода» данными для «Анода», которые расположены как комментарии через точку с запятой. В следующей, четвертой подпрограмме индикации метка ZIKL должна выглядеть так:

CLRF KATOD ;обнуляем регистр катодов
BSF KATOD, 0 ;устанавливаем нулевой бит

В метке INDZIKL перед сдвигом регистра KATOD необходимо установить нулевой бит переноса/заема:

BCF STATUS, 0 ;установим в 0 бит заема
RLF KATOD, 1

После этих замен разряды индикаторов будут переключаться высоким уровнем.

Микроконтроллер PIC16F873 можно заменить на PIC16F876, который также имеет 28 выводов и отличается увеличенной до 8 К памятью программ. При этом, если вы пользуетесь программатором PonyProg, необходимо правильно установить тип микроконтроллера. В программе никаких изменений делать не нужно. Следует заметить, что микроконтроллер PIC16F873 требует более аккуратного обращения, чем PIC16F84. Вставлять и вынимать микроконтроллер в программатор и плату частотомера необходимо при выключенном питании. При плохом контакте с микросхемной панелькой микроконтроллер тоже может выйти из строя. Для того, чтобы легче было вставлять и вынимать микросхему в программатор, необходимо удалить неиспользуемые контакты микросхемной панельки.

Частотомер задумывался для работы с резонатором частотой 20 МГц, но мне не удалось раскачать отечественные резонаторы, все они возбуждались на низких частотах. В фирменной документации при использовании высокочастотных резонаторов (HS) рекомендуется установка последовательно с резонатором от вывода OSC2 резистора номиналом до 10 кОм. Но отечественные резонаторы возбуждаться на собственной частоте не хотели. Аналогичный результат был получен и при подключении высокоомного (10...30 МОм) резистора параллельно входам OSC1 и OSC2. Естественно, при более высокой частоте резонатора частота будет измеряться точнее, но импортный резонатор мне достать не удалось. Для проведения подобного рода экспериментов по возбуждению резонатора на печатной плате имеются дополнительные отверстия.

После изготовления частотомера необходимо выполнить его калибровку. Для этого необходимо в шестом блоке подпрограмм установить значения младшего (TMR1L) и старшего (TMR1H) регистров таймера TMR1, величина которых будет зависеть от значения частоты используемого кварцевого резонатора. Увеличение значений регистров уменьшает время измерения, следовательно, уменьшает значение измеряемой частоты.

CEKO
MONLW 0x54
;предустановка регистров
MOVWF TMR1H ;Таймера до значения 0,1 сек.(500000 при 20МГц)
MOVLW 0x07 ;при точном резонаторе 14МГц
MOVWF TMR1L ;установка должна быть 55 45
RETURN

Определим, для примера, какая должна быть установка регистров для резонатора с частотой F = 14 МГц. Период импульсов равен: Т = 1/F = 7,14 х 10(-8). Один машинный цикл равен 4Т = = 2,86 х 10(-7). Разделим интервал времени 0,1 с на машинный цикл и получим число 349650. Столько машинных циклов «поместится» в 0,1 с. С помощью компьютерного калькулятора переведем это число в двоичный код и получим число 1010101010111010 010. Три младших выделенных бита отбросим, поскольку они попадают на трехразрядный предделитель, а его мы установить не можем. Полученное двоичное число переведем в восьмеричное и получим число АА ВА. Таким числом импульсов должен быть досчитан таймер, чтобы произошло прерывание через 0,1 с. Следовательно, необходимо найти дополнение этого числа до нуля: FF FF - АА ВА = = 55 45. Именно это число должно быть установлено в регистрах таймера 1. Но если установить это число, то прерывания будут происходить ровно через 0,1 с, а нам необходимо, чтобы счетный вход RA4 открывался и закрывался через 1 или 10 с. А если учесть, что частота резонатора редко соответствует номинальной, то становится ясно, что это число нуждается в коррекции.

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

Установка регистров таймера 1 не дает абсолютной точности потому, что мы не учитываем влияние разрядов предделителя. Для учета этих разрядов перед закрытием счетного входа установлены команды коррекции. Для предела «1 с» коррекция выполняется в метке СЕКХ, а для предела «10 с» — СЕКС.

CEKX
; NOP
; MOVLW 1 ;эти 4 строчки нужны для точной подгонки времени измерения
; ADDLW -1
; BTFSS STATUS.2 ;для 1 с.
; GOTO $-2

Изменением числа во второй строчке и подстановкой «пустых» команд NOP производят подгонку измеряемой частоты в пределах единиц герц. Увеличение значения при коррекции увеличивает время индикации. Необходимо помнить, что значение коррекции секунд входит в коррекцию десятков секунд, умноженное на десять. Показания индикатора на обоих пределах должны совпадать. После окончания калибровки желательно проверить его работу по всему диапазону измерения от 1 Гц до 50 МГц.

Если измерить частоту собственного резонатора через конденсатор 68...200пФ, как это показано на рис. 1 штриховой линией, то при любом резонаторе (в авторском варианте программы) получится частота 14007 кГц. Это связано с тем, что на вход пройдет столько импульсов, сколько поместится в сформированном интервале. При резонаторе на большую частоту время измерения будет меньше, значит и импульсов пройдет меньше. Вернее столько, сколько и при резонаторе с частотой в 14 МГц. Изменение частоты в любую сторону вызовет обратно пропорциональное изменение времени измерения, но показания не изменятся. Становится понятным, что измерять частоту собственного резонатора можно только после окончания калибровки, да и то с целью определения точной частоты вашего резонатора.

При подаче напряжения питания на частотомер на индикаторе высветятся нули и запятая в третьем разряде. Эта запятая говорит о том, что установлен режим «1 с», а индикация осуществляется в килогерцах. При нажатии кнопки «Время измерения» запятая переместится в четвертый разряд и частотомер перейдет в режим «10 с».

При нажатии кнопки «Пуск» частотомер начнет измерение. На время измерения в нулевом разряде высвечивается запятая. При замыкании входа на общий провод на индикаторе должны быть нули. Повторное нажатие кнопки «Пуск» остановит процесс измерения, но индикация измеряемой частоты сохранится. Переключение режима времени измерения можно выполнять без остановки измерения.

Автор: Н. Заец

Файлы:
Исходный код программы(Ассемблер), файл прошивки микроконтроллера
Дата 06.06.2012 Размер файла 5.94 KB Закачек 1791

Рекомендуем посмотреть