Цифровой частотомер на микроконтроллере PIC16F84. Частотомер на PIC16F628

💖 Нравится? Поделись с друзьями ссылкой

Принципиальная схема частотомера

Микроконтроллер PIC16F628A служит для того, чтобы выполнить всю работу без каких-либо дополнительных микросхем. На 16F628A 16 I/O выводов, два из которых используются для кварцевого генератора, один предназначен для ввода сигнала, а другой может быть использован только для ввода, что дает нам только 12 полезных I/O контактов. Решение - поставить транзистор, который открывается при выключении всех других цифр.

Светодиодный 7-сегментный дисплей, используемый здесь, с общим катодом типа BC56-12SRWA. Когда все сигналы находятся на высоком уровне, транзистор Q1 открывается и переключается на первой цифре. Ток для каждого сегмента составляет около 7 мА.

Вся схема частотомера потребляет тока порядка 30 мА в среднем. Микроконтроллер использует свой внутренний 4 MHz генератор для тактирования CPU. А внешний кварцевый генератор с частотой 32768 Hz нужен для установки 1 второго временного интервала. Tmr0 используется для подсчета входного сигнала на выводе RA4.

В качестве входного сигнала нужно будет 5 вольт прямоугольного вида. Сам частотомер может измерять до 1 мегагерца, что более чем достаточно для любительских проектов. Это сделано для удобства, так как счетчик может достигать показаний 999999 Гц - и ничего переключать не нужно. Меряем хоть 11 герц, хоть 139,622 килогерц.

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

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

Как обычно идею для будущей конструкции я искал в интернете. Оригинальная идея пришла от этого проекта: Частотомер на PIC16F628A и ЖК индикаторе . Как вы можете заметить – схема очень простая и в то же время элегантная. Но я хотел использовать 7-сегментный светодиодный дисплей, а не жидкокристаллический, так что я нашел еще один интересный проект: Простой 100MHz счетчик частоты , в котором применен 6-разрядный светодиодный дисплей.

Описание частотомера

Конечно же, объединение двух проектов в один не простая задача. Прежде всего, я хотел чтобы это был частотомер на микроконтроллере, и не имел дополнительных микросхем. Помимо этого я выбрал 16F628A, и потому один из выводов (порта RA5) может быть использованы только в качестве входа.

Для мультиплексного управление 6 цифрами 7-сегментного дисплея требуется 7 + 6 = 13 выходов. Микроконтроллер16F628A имеет 16 выводов, два из которых используются для кварцевого генератора, один для входного сигнала и еще один может быть использован только для входа. Так что у нас остается только 12 свободных выводов. Решение — управление одним из общих катодов с помощью транзистора, который открывается, в момент, когда все другие цифры выключены.

В схеме частотомера применено два 3-разрядных 7-сегментных дисплея с общим катодом типа BC56-12SRWA . Цифры 2..5 включаются, когда соответствующие выводы устанавливаются на низком уровне. Когда на всех этих выводах находится высокий уровень, транзистор Q1 открывается и загорается первая цифра. Ток потребления для каждого сегмента составляет около 6-7mA.

Следует отметить, что выводы, связанные с общими катодами теоретически могут потреблять до 50 мА, если все сегменты светятся. Это, конечно же, немного выше характеристик микроконтроллера. Но так как каждая цифра включается на очень короткое время, то это безопасно. Вся схема частотомера потребляет в среднем около 30-40 мА.

Микроконтроллер тактируется от внутреннего 4 МГц генератора. Таймер1 использует внешний кварцевый генератор с частотой 32768Hz для установки односекундного интервала. Timer0 используется для подсчета входного сигнал на выводе RA4. И, наконец, Таймер2 используется для обновлений цифры. Частотомер может измерять частоту от 920 до 930 кГц, что для любительских целей вполне достаточно. В качестве источника питания используется стабилизатор напряжения 78L05.

(скачено: 1 182)

Частотомер на PIC16F84A , с изменением времени измерения (0,1; 1 и 10 с),

После собранного мной простого частотомера на PIC 16F628A . Попалась мне на глаза схема еще одного частотомера на PIC16F84A (спасибо пользователю Seal с радиокота) . По своим параметрам этот частотомер гораздо интересней, при этом он также очень простой.

Основные технические характеристи-ки частотомера следую-щие: диапазон измерения частоты - 0,1 Гц.. .60 МГц (реально верхняя граница выше); порог чувствительности по вход-ному напряжению - 0,08...0,15 В (амп-литудное значение); минимальное на-дежно фиксируемое прибором значение частоты синусоидального сигнала - 2 Гц (амплитудой 0,15 В); максимальная амп-литуда входного сигнала - 3 В. Питается прибор от батареи типа "Крона" (воз-можно использование внешнего источ-ника напряжением 7... 16 В), потребляе-мый ток - 10...12 мА. Предусмотрено изменение времени измерения (0,1; 1 и 10 с), умножение показаний на 1000 (при применении внешнего делителя ча-стоты), удержание показаний, запись од-ного значения частоты в энергонезави-симую память и возможность последую-щего считывания.

Цена младшего разряда - 10,1 или 0,1 Гц соответственно. При вре-мени измерения 0,1; 1 и 10 с макси-мально на ЖКИ может отображаться семь, восемь или девять разрядов, т. е. максимальное отображаемое значение равно соответственно 99,999.99, 99,999.999 или 99,999.999.9 МГц.

После сборки схемы остается только откалибровать по образцовому генератору, частоту кварцевого генератора конденсатором С10 (рис.1)

Входной формирователь имеет низкое входное сопротивление, что является его небольшим недостатком.
Для повышения входного сопротивления частотомера, между входом частотомера и входом формирователя, необходимо включить некое буферное устройство с высоким входным и низким выходным сопротивлением.
На транзисторах VT1 и VT2 собрано буферное устройство, а на транзисторе VT3 - входной формирователь. Входное сопротивление буферного устройства - около 500 ком .
Схема буферного устройства приведена на рисунке:(подробней на http://progcode.narod.ru )


Соедините правый по схеме вывод резистора R11 с точкой соединения 2-го и 3-го выводов ПИКа, и Вы получите ЧМ/ЦШ с входным сопротивлением около 500 ком.

Источник материала Радио, 2002, №10,

Печатная плата с буферным устройством без автоотключения.

Печатная плата от пользователя Seal с автоотключением.

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

В архив добавлены: Правленные Исходник (ASM) и Прошивка (HEX), комилятор (PIC-MPASM), кодовые таблицы контроллеров HD44780 (En-Ru) и ST7066U (En-Jp), фото дисплея с английским шрифтом.
Размер архива ~1.3M

Этот цифровой частотомер разработан на основе моей старой конструкции Частотомер - цифровая шкала с LCD (ЖКИ) . Прототип был изготовлен в далеком 2001 г., с тех пор его повторили и до сих пор используют многие радиолюбители. Несмотря на то, что за прошедшие годы появилось много новых разработок, прибор ничуть не устарел и по совокупности параметров вполне может конкурировать с любым современным частотомером своего класса.

А вернулся я к нему по одной простой причине. Дело в том, что LCD индикатор KO-4B, который я использовал, в настоящее время снят с производства и приобрести его очень сложно. А у меня возникла необходимость изготовить еще один экземпляр этого частотомера. Можно, конечно, собрать аналог индикатора на LED и AVR, но это как-то очень уж нерационально.

В общем, появилась новая разработка. В частотомере я использовал самый распространенный в настоящее время символьный индикатор WH1601A - 16 символов в 1 строке производства фирмы Winstar, но можно использовать и LCD индикатор 16 символов в 2 строки. Графические возможности этого индикатора гораздо больше, чем у KO-4B, было бы неразумно их не использовать.

Кроме того, за прошедшие годы радиотехника существенно продвинулась в сторону высоких частот. Поэтому я увеличил разрядность математики в программе, что позволило поднять верхнюю границу измеряемых частот до аппаратного предела, определяемого быстродействием PIC и внешнего СВЧ делителя. Быстродействие PIC, кстати, тоже выросло. Если внутренний счетчик PIC16F84 работал до частот, не более 40...45 МГц, то в современном PIC16F628A он уверенно считает до 90...95 МГц. Если использовать внешний СВЧ делитель на 256, верхняя измеряемая частота может быть более 20 ГГц!

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

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

В частотомере предусмотрена возможность программной калибровки, что позволяет использовать любые кварцевые резонаторы в диапазоне 2...20 МГц. Значения всех промежуточных частот, коэффициенты деления используемых внешних делителей, а также калибровочные константы могут изменяться пользователем без применения каких-либо дополнительных устройств. Принцип действия частотомера классический: измерение количества импульсов входного сигнала за определенный интервал времени.

Принципиальная схема прибора показана на рис.1. При использовании указанных на схеме деталей входной формирователь имеет полосу пропускания 1 Гц...100 МГц, входное сопротивление 500 ком и чувствительность около 100 МВ.

Управление частотомером - цифровой шкалой осуществляется с помощью 3-х кнопок SB1 ... SB3, размещенных на передней панели. Они служат для переключения времени измерения. При нажатии на SB1 включается предел 0,1 сек, а при нажатии на SB2 или SB3 - 1 cек или 10 сек соответственно.

С помощью этих же кнопок можно ввести коэффициенты деления до 3-х используемых с прибором делителей. Это может оказаться полезным при проведении измерений в широком диапазоне частот. Например, первый делитель работает в диапазоне 500 МГц...2 ГГц, а второй - 30 МГц...500 МГц и они имеют разный коэффициент деления. При смене делителя прибор автоматически будет учитывать смену его коэффициента деления при расчете показаний.

Для калибровки прибора достаточно просто ввести истинную частоту генерации кварца. В любительских условиях наибольшей точности можно добиться, если измерить ее с помощью SDR приемника . Достаточно поднести антенну приемника к кварцу. При этом влияние на частоту генерации кварца минимально, и точность измерения может достигать +/- 1 Гц, если приемник предварительно откалибровать по сигналам радиостанций, вещающих на эталонных частотах.

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

Более подробно особенности наладки и работы с прибором, а также методика калибровки описаны в подробном описании.

В этой статье описано как подключить жидкокристаллический индикатор со знакогенератором к микроконтроллеру. Рассмотренные здесь методы и схемы подходят для подключения ЖКИ со встроенными контроллерами HD44780 (Hitachi), KS0070, KS0066 (Samsung), LC7985 (Sanyo), SED1278 (Epson) или с другими аналогичными. Эти, или совместимые с ними, контроллеры используются в большинстве выпускаемых в настоящий момент знакосинтезирующих ЖКИ, например, в таких, как ACM0802, ACM1601, ACM1602, ACM1604, ACM2002, ACM2004, ACM2402, ACM4002, ACM4004 фирмы Displaytronic, MT-10S1, MT-16S2D фирмы МЭЛТ, DV-0802, DV-16100, DV-16110, DV-16120, DV-16210, DV-16230, DV-16235, DV-16236, DV-16244, DV-16252, DV-16257, DV-16275, DV-16276, DV-20100, DV-20200, DV-20210, DV-20211, DV-20220, DV-24200, DV-40200 фирмы Data Vision, AC082A, AC161, AC162, AC164, AC202, AD202, AC204, AC242, AD242, AC402 фирмы Ampire.

Вообще, данная задача сводится к организации обмена данными между подключаемым контроллером и встроенным контроллером ЖКИ, потому что самой матрицей управляет именно встроенный контроллер. В дальнейшем, когда мы будем говорить о подключении к ЖКИ, следует понимать, что речь идет о подключении к встроенному контроллеру. Перечисленные выше контроллеры ЖКИ имеют аналогичные интерфейсы, наборы команд и распределение памяти, хотя размер встроенной ROM-памяти, последовательность команд инициализации, время выполнения команд и некоторые другие параметры могут несколько отличаться.

Итак, для начала, давайте разберемся с работой ЖКИ.

1) Интерфейс .

Обычно ЖКИ имеет 14 или 16 выводов, назначение которых представлено в таблице 1:

ТАБЛИЦА 1

номер контакта наименование описание
1 Vss GND — общий провод (земля)
2 Vdd Power supply — питание +5В
3 Vo контраст
4 RS Register select — выбор регистра
5 R/W Read/write — чтение/запись
6 E Enable — вкл/выкл передачи
7 DB0 Data bit 0
8 DB1 Data bit 1
9 DB2 Data bit 2
10 DB3 Data bit 3
11 DB4 Data bit 4
12 DB5 Data bit 5
13 DB6 Data bit 6
14 DB7 Data bit 7
15 BL+ питание подсветки
16 BL- общий провод подсветки

Таким образом, интерфейс имеет восемь информационных линий: DB7..DB0 и три управляющих: RS, R/W, E.

Линия RS определяет к какому регистру контроллера ЖКИ мы хотим обратиться, то есть какую информацию мы передаем — данные или команды.

Линия R/W определяет направление передачи данных — запись в ЖКИ или чтение из ЖКИ.

Линия E включает (когда на линии высокий уровень) или выключает (когда на линии низкий уровень) передачу информации, сформированной на остальных интерфейсных линиях.

Интерфейс работает следующим образом: сначала на интерфейсных линиях DB7…DB0, RS, R/W формируется информация, которую нужно передать, потом на некоторое время (>500 нс для f 0 =270 кГц) подается высокий уровень на линию E (в это время ЖКИ считывает информацию), после чего сигнал E переводится опять в состояние низкого уровня. f 0 — частота, на которой работает контроллер ЖКИ. Вообще, контроллеры ЖКИ могут работать на разных частотах (у них есть выводы для подключения внешнего резонатора), но обычно используется внутренний генератор на 270 кГц.

После получения каждой порции информации контроллеру ЖКИ требуется некоторое время для ее обработки, поэтому передавать информацию подряд нельзя. После каждой посылки требуется подождать некоторое время, чтобы контроллер ЖКИ освободился. Обычно в даташите указано, какой команде сколько времени требуется для выполнения. Также, в контроллере ЖКИ предусмотрена возможность сообщить внешнему устройству о своем состоянии (BUSY/READY). То есть, при передаче данных, можно либо анализировать состояние контроллера ЖКИ и посылать следующую порцию данных, как только контроллер ЖКИ освободится, либо просто выждать время, большее, чем время выполнения операции по даташиту, после чего посылать следующую порцию данных.

Для уменьшения количества проводов от ЖКИ к внешнему устройству можно использовать не 8, а 4 информационных сигнала (DB7…DB4). Все рассматриваемые контроллеры ЖКИ допускают такую возможность. В этом случае данные передаются в два этапа (кроме первой команды инициализации): 1) передаются управляющие биты и старший полубайт посылки 2) передаются управляющие биты и младший полубайт посылки.

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

Во время инициализации лучше не анализировать флаг BUSY, а тупо ждать положенное время перед посылкой следующей команды, так как флаг начинает выставляться не сразу, а после какой-то команды (смотрите даташит).

Инициализация для восьмибитного интерфейса (f 0 =270 кГц)

1) включение питания

2) пауза >30 мс

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 1 1 N F X X

4) пауза >39 мкс

5) DISPLAY ON/OFF CONTROL

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 1 D C B

6) пауза >39 мкс

7) DISPLAY CLEAR

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 0 0 1

8) Пауза >1.53 мс

9) ENTRY MODE SET

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 0 0 0 0 1 I/D SH

Инициализация для четырехбитного интерфейса (f 0 =270 кГц)

1) включение питания

2) пауза >30 мс

RS R/W DB7 DB6 DB5 DB4
0 0 0 0 1 0
0 0 0 0 1 0
0 0 N F X X

N=0 — однострочный дисплей, N=1 — двустрочный дисплей

F=0 — шрифт 5х8, F=1 — шрифт 5х11

4) пауза >39 мкс

5) DISPLAY ON/OFF CONTROL

RS R/W DB7 DB6 DB5 DB4
0 0 0 0 0 0
0 0 1 D C B

D=0 — дисплей выключен, D=1 — дисплей включен

C=0 — курсор выключен, C=1 — курсор включен

B=0 — мерцание выключено, B=1 — мерцание включено

6) пауза >39 мкс

7) DISPLAY CLEAR

RS R/W DB7 DB6 DB5 DB4
0 0 0 0 0 0
0 0 0 0 0 1

8) Пауза >1.53 мс

9) ENTRY MODE SET

RS R/W DB7 DB6 DB5 DB4
0 0 0 0 0 0
0 0 0 1 I/D SH

I/D=0 — уменьшение указателя при операции с памятью, I/D=1 — увеличение указателя при операции с памятью

SH=0 — сдвигание дисплея выключено, SH=1 — сдвигание дисплея включено

2) Память

В ЖКИ есть 2 вида памяти: DDRAM, CGRAM (CGROM).

DDRAM — display data RAM (память дисплея) — то, что записано в этой памяти, — непосредственно отображается на дисплее. Эта память имеет следующее адресное пространство и соответственное отображение на дисплее (для дисплея 24х2):

Первая строка

Display position 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
DDRAM address 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch 0Dh 0Eh 0Fh 10h 11h 12h 13h 14h 15h 16h 17h

Вторая строка

Display position 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
DDRAM address 40h 41h 42h 43h 44h 45h 46h 47h 48h 49h 4Ah 4Bh 4Ch 4Dh 4Eh 4Fh 50h 51h 52h 53h 54h 55h 56h 57h

То есть, то, что записано в DDRAM по адресу, например, 42h, будет отображаться в третьей позиции на второй строке дисплея. Для дисплеев других размеров доступное адресное пространство DDRAM будет другим (обычно первые 40h адресов — первая строка, вторые 40h адресов — вторая строка и т.д.)

CGRAM (CGROM) — character generator RAM (ROM) — память знакогенератора. Память знакогенератора разделена на CGRAM — доступна для записи/чтения, сюда можно залить 8 своих собственных символов и CGROM — доступна только для чтения, заранее прошитые шрифты. В разных ЖКИ могут быть прошиты разные шрифты, это надо смотреть по доке или можно определить самому, организовав вывод на дисплей последовательно всех прошитых символов.

При обращении к первым шестнадцати символам знакогенератора происходит обращение к CGRAM, при обращении к символам, с номерами старше шестнадцатого — обращение к CGROM. Причем, пользовательских символов ведь всего 8, поэтому первые восемь символов знакогенератора указывают на те же области CGRAM, что и вторые восемь символов.

Иногда, в CGROM могут быть прошиты не все символы, начиная с семнадцатого, а, например, начиная с номера 21h, а при обращении к символам от 10h до 21h на дисплей выводится всякий мусор. Это зависит от прошивки.

Для вывода на экран какого-либо символа, необходимо выполнить следующие действия:

1) установить курсор командой "set DDRAM address" в ту позицию, куда мы хотели бы вывести символ (информационные биты указывают адрес DDRAM, соответствующий выбранной позиции)

SET DDRAM ADDRESS (AC6…AC0 — адрес устанавливаемой позиции курсора в памяти дисплея)

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0

2) вывести символ на экран командой "write data to RAM", при этом информационные биты указывают на номер символа, выводимого из CGRAM/CGROM.

WRITE DATA TO RAM (A7..A0 — номер символа, выводимого из памяти знакогенератора)

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 0 A7 A6 A5 A4 A3 A2 A1 A0

Полный список команд для работы с ЖКИ и время их выполнения можно узнать, скачав даташит на любой из рассматриваемых ЖКИ-контроллеров (все они имеют одинаковые наборы команд).

Разобравшись с работой ЖКИ, вернемся к вопросу его подключения к микроконтроллеру. В качестве примера возьмем контроллер PIC16F628A. Ниже показаны примеры схем подключения для восьмибитного и четырехбитного интерфейсов. Подключение подсветки на схемах не показано, поскольку полярность подключения подсветки, иногда, определяется перемычками на плате ЖКИ.

Вот и всё! Для того, чтобы схемы заработали, осталось только залить в микроконтроллер программу, реализующую обмен данными с ЖК-индикатором.

Пример готового девайса (8-битный интерфейс, ЖКИ — PM1623):

Примеры программ и готовые прошивки:

Скачать печатную плату (AutoCAD2000i) Эта плата разведена под использование SMD компонентов. Если вы будете использовать другие компоненты, то плату придется переделывать.

Рассказать друзьям