Частотомер

         

Частотомер


Частотомер.

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

Собираясь сделать частотомер на PIC-контроллере, автор проверил схемы и программы, опубликованные в журналах. Оказалось, что только одна схема и программа были рабочими: это «Частотомер на PIC-контроллере» Д. Яблоков и В. Ульрих [1]. Но этот частотомер имеет 3 разряда индикации с указанием их порядка. Такой точности в повседневной практике радиолюбителей явно недостаточно.

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

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

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

Алгоритм работы программы частотомера показан на рис. 1, а расширенный алгоритм работы блоков: проверка кнопок, пуск измерения, досчитывание показан на рис. 1.1, 1.2, 1.3 соответственно.





После пуска и инициализации регистров микроконтроллера программа переходит к поразрядному выводу значений регистров  индикации. После загрузки значения любого регистра индикации в порт выдерживается пауза в 2 миллисекунды. В каждом цикле отработки паузы декрементируется регистр паузы и проверяется значение флага 1 секунды. Если флаг равен единице, т.е. 1 секунда прошла, выполняется проверка состояния кнопок (рис. 1.1). При этом сбрасывается флаг 1 секунды. Далее проверяется состояние кнопки «Пуск». Если кнопка нажата, то проверяется флаг пуска. Если флаг пуска включен, т.е. пуск уже был, то он сбрасывается (запрещается счет). Если флаг пуска нулевой, то он устанавливается в единицу (разрешается счет). В этом цикле отработки паузы проверка кнопок прекращается. В следующих циклах, если кнопка «Пуск» не нажата, проверяется состояние кнопки времени измерения. Если кнопка времени измерения нажата, то изменяется флаг времени измерения на противоположный (1 сек. или 10 сек.).

После проверки кнопок проверяется значение флага пуска. Если частотомер в состоянии пуска, то проверяется флаг измерения. Если флаг единичный, то начался отсчет времени измерения, и программа переходит к пуску измерения (рис. 1.2). Но если пуск уже был выполнен и установлен флаг счета, то включение нового счета не производится. Если же счет не начат, то устанавливается флаг счета, обнуляются регистры досчета, разрешаются прерывания по переполнению TMR0 и открывается счетный вход. Счетный вход открывается установкой единицы на выходе RA5. От команды, открывающей счетный вход, и до команды, которая его закрывает, должно пройти время, равное времени измерения.


Это время в зависимости от частоты выбранного кварцевого резонатора подбирается предварительной установкой регистров таймера TMR1.

В последующих циклах отработки паузы постоянно проверяется состояние флага счета. Как только флаг счета станет равным нулю, что говорит о прекращении времени измерения, начинается процесс извлечения значения предделителя таймера TMR0 (досчитывание, рис. 1.3). Дело в том, что непосредственная запись и считывание значения предделителя невозможно, но легко реализуется программно. Для этого на вход RA4 с выхода RA5 подаются импульсы, которые сформированы программно. При каждом импульсе значение предделителя увеличивается на единицу и одновременно с этим увеличивается значение младшего регистра счета L_B. Предварительно младший регистр  счета обнуляется. Значение таймера TMR0 непосредственно переписывается в старший регистр счета H_B. После каждого сформированного программно импульса на предделитель проверяется изменение значения таймера. Если значение таймера изменилось, то досчитывание заканчивается. Таким образом осуществляется досчитывание значений предделителя до нуля, тем самым определяется значение предделителя, которое было после окончания прохождения измеряемых импульсов. Значение предделителя будет равно инвертированному значению младшего регистра счета L_B.

Программа переходит к перекодировке 32 разрядов двоичного числа в 9 разрядов двоично–десятичного числа. Девять разрядов для индикации не используются, но желательны для правильного отображения старшего разряда в режиме времени измерения 10 секунд. Например, если в режиме измерения 1 секунда три старших разряда будут равны 278, то в режиме 10 секунд двойка уйдет за пределы индикатора, а число 78 будет высвечиваться в старших разрядах индикатора. Таким образом можно точнее определить значение измеряемой частоты.

После окончания перекодировки сбрасываются все флаги. На время досчитывания запрещаются прерывания по переполнению таймера TMR1, а после окончания досчитывания выполняется новая установка регистров таймера, и разрешаются прерывания.


После заполнения регистров индикации программа начинает новый цикл индикации с нулевого разряда.

Как было сказано выше, прерывания по переполнению таймера TMR1 происходят через 0,1 секунду и используются для формирования интервалов времени измерения. Алгоритм работы прерывания показан на рисунке 1.4.

После сохранения значений регистров инкрементируется регистр секунды и включается флаг выполнения измерения. Если регистр секунды еще не равен десяти, то выполняется установка регистров таймера и завершается прерывание. Установка младшего и старшего регистров таймера выполняется так, чтобы время досчитывания таймера TMR1 до нуля машинными циклами равнялось 0,1 секунды.

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

Во время счета измеряемой частоты прерывания по переполнению таймера TMR0 (рис. 1.5) возможны с любой точки программы. Если во время прерывания от TMR0 произошло прерывание по переполнению TMR1, то будет выполнено прерывание от TMR1, а после этого будет продолжаться выполнение прерывания от TMR0. Это необходимо для того, чтобы не увеличивать длительность времени измерения, следовательно, и погрешность счета.

Схема частотомера приведена на рис. 2.



Выходы порта В микроконтроллера используются для вывода значений сегментов светодиодов, а выходы порта С – для коммутации катодов разрядов.


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

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

В частотомере применены две матрицы светодиодов с общим катодом фирмы «Kingbright» СС56–12GMR. Каждая матрица содержит четыре светодиода, предназначенных для динамической индикации. То есть, все одноименные сегменты светодиодов соединены между собой внутри блока. Первый вывод матрицы маркируется единичкой, которую видно под слоем герметика. Эти светодиоды приятного желто-зеленого цвета свечения имеют малый ток потребления (потребляемый ток частотомера менее 50 мA) и большие размеры цифр (высота цифры 15 мм). Естественно, можно использовать любые цифровые светодиоды с общим катодом, но тогда, возможно, потребуется подстройка яркости свечения резисторами R8–R15.

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

        CLRF    KATOD     ;ОБНУЛЯЕМ РЕГИСТР КАТОДОВ.

         BSF       KATOD,0   ;УСТАНАВЛИВАЕМ НУЛЕВОЙ БИТ.

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

        BCF     STATUS,0  ;УСТАНОВИМ В 0 БИТ ЗАЕМА.

          RLF     KATOD,1   ;



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

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

Печатная плата частотомера показана на рис. 3, а расположение элементов на ней —  на  рис. 4.





Со стороны установки элементов на верхней части платы до выводов микросхемы фольга не удаляется. Она является экраном для усилителя и соединяется с минусом питания пайкой в местах обозначенных черными точками. Все остальные отверстия над экраном раззенковываются. Поскольку четвертый вывод микроконтроллера не используется, то отверстие под него не сверлится, а четвертый контакт из микросхемной панельки удаляется. Размеры печатной платы определены размерами платы светодиодов, которая показана на рис. 5. Плата частотомера располагается за платой светодиодов.



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


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

Калибровка частотомера.

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

CEK0

        MOVLW   0x54          ;ПРЕДУСТАНОВКА РЕГИСТРОВ

        MOVWF   TMR1H      ;ТАЙМЕРА ДО ЗНАЧЕНИЯ 0,1 СЕК. (500 000 ПРИ 20 МГц).

        MOVLW   0x07          ;(ПРИ ТОЧНОМ КВАРЦЕ 14 МГц

        MOVWF   TMR1L      ;УСТАНОВКА ДОЛЖНА БЫТЬ 55 45).

        RETURN

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


Следовательно, необходимо найти дополнение этого числа до нуля: FF FF-AA BA=55 45. Именно это число должно быть установлено в регистрах таймера 1. Но если установить это число, то прерывания будут происходить ровно через 0,1 секунды, а нам необходимо, чтобы счетный вход RA4 открывался и закрывался через 1 или 10 секунд. А если учесть, что частота резонатора редко соответствует номинальной, то становится ясно, что это число нуждается в коррекции.

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

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

СЕКХ

      ;  NOP

      ;  MOVLW   .1        ;ЭТИ 4 СТРОЧКИ НУЖНЫ ДЛЯ ТОЧНОЙ

      ;  ADDLW   -1        ;ПОДГОНКИ ВРЕМЕНИ ИЗМЕРЕНИЯ.

      ;  BTFSS   STATUS,2  ;ДЛЯ 1 СЕКУНДЫ.

      ;  GOTO    $-2       ;

Изменением числа в второй строчке и подстановкой «пустых» команд NOP, производят подгонку измеряемой частоты в пределах единиц герц.


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

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

Работа с частотомером.

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

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

Файлы: xamer73.asm и xamer73.hex, рисунки, описание можно скачать ЗДЕСЬ (zip 114 кБ).

Николай Заец,

saes@mail.ru.

Литература:

1. Д. Яблоков, В. Ульрих. Частотомер на PIC-контроллере.– Радио, 2001, № 1, с. 21, 22.