Avr частотомер t0 подсчет импульсов. Самодельный частотомер на ATTINY2313. Технические характеристики частотомера

26.04.2024

Построенный . Он позволяет измерять частоты до 10 МГц в четырех автоматически переключаемых диапазонах. Наименьший диапазон имеет разрешение 1 Гц.

Технические характеристики частотомера

  • Диапазон 1: 9,999 кГц, разрешение 1 Гц.
  • Диапазон 2: 99,99 кГц, разрешение до 10 Гц.
  • Диапазон 3: 999.9 кГц, разрешение до 100 Гц.
  • Диапазон 4: 9999 кГц, разрешение до 1 кГц.

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

Микроконтроллер Attiny2313 работает от внешнего кварцевого генератора с тактовой частотой 20 МГц (это максимально допустимая частота). Точность измерения частотомера определяется точностью данного кварца. Минимальная длина полупериода измеряемого сигнала должна быть больше, чем период кварцевого генератора (это связано с ограничениями архитектуры микроконтроллера ATtiny2313). Следовательно, 50 процентов от тактовой частоты генератора составляет 10 МГц (это максимальное значение измеряемой частоты).

Установка фьюзов (в PonyProg):

В одной из предыдущих статей, посвященных изучению микроконтроллеров AVR, на примере мы рассмотрели использование 16-ти разрядного таймера/счетчика Т1 и прерывания по событию захват. В качестве дополнения к этому материалу, предлагаю улучшенную версию частотомера. В этом проекте тоже используется блок захвата и дополнительно еще задействован тактовый вход 8-ми разрядного таймера.

Недостатки старого проекта заключались в маленьком диапазоне измеряемых частот (~сотни киллогерц), что было связано со способом измерения периода сигнала.

Вы, наверное, помните, что в прерывании по событию захват счетный регистр 16-ти разрядного таймера обнулялся, а захваченное значение, соответствующее количеству импульсов тактового генератора микроконтроллера, укладывающихся в один период входного сигнала, сохранялось в переменной. На основе этого значения и выполнялись расчеты.

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

В новом проекте вычисление частоты выполняется по нескольким периодам входного сигнала и без постоянного использования прерывания по событию захват. Это уменьшает накладные расходы микроконтроллера и позволяет измерять значительно большие частоты - в идеале до 1/2 Fcpu (частоты тактирования микроконтроллера).

Итак, перейдем к описанию нового проекта частотомера.

Схема

Входной сигнал подается на вход схемы захвата таймера Т1 и счетный вход таймера Т0. Для того чтобы таймер Т0 тактировался от внешнего сигнала, он должен быть соответствующим образом настроен.

Структура проекта

Проект состоит из 4-ех программных модулей.

bcd.c – содержит функцию для вывода двоичных чисел на дисплей

timer.c – содержит функцию инициализации таймеров T0 и Т1, обработчики прерываний, функцию захвата значений счетных регистров таймеров и программных счетчиков и, наконец, функцию вычисления частоты.

lcd_lib.c – это библиотека для работы с символьным дисплеем.

main.c - основная программа.

Метод измерения частоты

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

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

Интервал времени, в течение которого выполняются подсчеты импульсов, отмеряется с помощью схемы захвата аппаратного таймера Т1 и программной задержки.

Формула для расчета частоты по методу временных ворот такая:

Fx = Fo * (M/N),

где Fx – частота входного сигнала, Fo – частота опорного сигнала, M – количество импульсов входного сигнала за время измерения, N – количество импульсов опорного сигнала за время измерения.

Алгоритм программы

В проекте используются два таймера - 8-ми разрядный таймер/счетчик Т0 и 16-ти разрядный Т1. Таймер T1 подсчитывает количество тактовых импульсов микроконтроллера (baseImp), укладывающихся в определенный временной интервал, а таймер Т0 считает импульсы измеряемого сигнала (mesurImp).

Временной интервал, в течение которого выполняются подсчеты импульсов, порядка одной секунды. Поскольку за это время оба таймера успевают много раз переполнится, в программе используются дополнительные программные счетчики (timer0, timer1). Это 16-ти разрядные переменные, которые инкрементируются в прерываниях таймеров Т0 и Т1.

Общий вид циклограммы работы таймеров представлен на рисунке ниже.

Алгоритм программы выглядит следующим образом.

1. Выполняется инициализация таймеров и дисплея

2. Микроконтроллер ожидает установки флага схемы захвата таймера Т1, или, выражаясь простым языком, ловит передний фронт измеряемого сигнала.

3. Дождавшись установки флага (момент Capture1 на рисунке), микроконтроллер сохраняет значения счетных регистров таймеров Т0 и Т1, а также значения программных счетчиков.

4. Вызывается программная задержка длительностью в одну секунду. Оба таймера продолжают работать.

5. По окончанию задержки микроконтроллер ожидает установки флага схемы захвата

6. Дождавшись установки флага (момент Capture2 на рисунке), микроконтроллер сохраняет значения счетных регистров Т0 и Т1 и значения программных счетчиков.

7. Вычисляется значение частоты и выводится на дисплей

8. Возврат на шаг номер 2.

Несколько слов о вычислении частоты.

Для расчета количества импульсов опорного сигнала используется следующая формула.

//количество переполнений программного счетчика

saveTimer12 = saveTimer12 – saveTimer11;

//количество импульсов опорного сигнала

baseImp = (icr12 + (unsigned long )saveTimer12*65536) – icr11;

где saveTimer12, saveTimer11 - значение программного счетчика timer1 в моменты Capture2, Capture1 соответственно; icr12, icr12 - значение счетного регистра TCNT1 таймера Т1 в моменты Capture2, Capture1 соответственно; 65536 - емкость счетчика Т1

Последнее время мне очень часто требуется измерять частоту, уж очень много электронных проектов я делаю и поэтому появилось нужда в измерительном приборе - частотомере. Покупать данный прибор - я ещё школьник в 8 классе учусь а такая техника очень дорогая для меня. Сильно большие частоты мне измерять пока нет необходимости, хотя в скором времени возможно будет нужно. И поэтому я решил сделать свой частотомер своими руками! Стремясь к минимализму за основу взял AVR микроконтроллер ATtiny2313 и ЖКИ 16*1. Набросал проект в , написал прошивку и нарисовал принципиальную схему:

Собственно ничего сложного, всё очень просто. Собрал всё на бредборде, кто не знает это - макетная плата с механическими контактами. Проверил, работает! Вот фото отчёт:

Ну теперь надо реализовать прибор, сделать печатную плату и поместить в корпус.

И так, теперь когда все детальки собраны, пора делать печатную плату. Её я сделал универсальной, добавил контактные площадки, мало-ли захочется что нибудь добавить. Чертил печатную плату я программе , найти чертёж можно в файлах к статье. Плату я делал , вот что получилось:

Самое главное это хорошо и качественно припаять микроконтроллер, ведь он в SOIC корпусе.

Не проблема, и мельче паяли! Главное не переборщить припоя и не жалеть канифоли.

Запаиваем остальные детальки, вот что получилось:

Кстати, от лишнего канифоля на плате можно избавиться с помощью технического спирта. Так намного лучше:

После сборки прошиваем микроконтроллер, я прошивал с помощью программы программатором . Вот фьюз биты:

Подключить программатор к микроконтроллеру можно проводками, подключить их к разъёму для ЖКИ:

А reset припаять:

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

Заработало, отлично! Теперь устанавливаем устройство в корпус:

Как вы видите я свой частотомер сделал на базе своего , дело в том что я себе собрал более навороченный велокомпьютер (с большим дисплеем на Atmega32, скоро про него напишу статью) а из этого и решил сделать частотомер, только плату переделал. И конечно видео работы устройства:

На видео видно что в качестве генератора я использую компьютер и программу .

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
IC1 МК AVR 8-бит

ATtiny2313-20PU

1 В блокнот
C1, C2 Конденсатор 22 пФ 2 В блокнот
С3 Конденсатор 0.1 мкФ 1 В блокнот
R1 Резистор

1 кОм

1 В блокнот
R2 Резистор

4.7 кОм

1 В блокнот
R3 Резистор

20 Ом

1 В блокнот
LCD ЖК индикатор 16*1 WH1601A 1 С совместимым HD44780 контроллером В блокнот
Z1 Кварц 16 МГц 1 В блокнот
Вход Разьём PBS-40 1

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

Принципиальная схема частотомера изображена на рисунке 1.

Рис.1. Принципиальная схема прибора

Частотомер собран на макетной плате, основой является микроконтроллер ATmega16 компании Atmel, источником тактовой частоты является внутренний RC осциллятор 8 МГц (это необходимо помнить при программировании микроконтроллера). Дополнительно, во входной части используется 4-битный счетчик 74HC191 в качестве делителя измеряемой частоты на 16 до подачи ее на вход микроконтроллера. Как видно, используется только выход Q3 счетчика, частота на этом выходе будет равна входной частоте деленной на 16.

Вход прибора (щуп) – точка W1, которая напрямую подключена к порту микроконтроллера PB0 и, через делитель, к порту PB1.

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

Схема расположения и назначение выводов примененного индикатора изображена на рисунке 2.


Рис.2. Расположение и назначение выводов примененного 4 разрядного светодиодного индикатора .

Выводы E1…E4 используются для включения соответствующих разрядов (E1 – для включения правого младшего разряда).

Каждая линия ввода/вывода микроконтроллера ATmega16 может обеспечить выходной ток до 40 мА, поэтому нам нет необходимости использовать транзисторы и сигналы управления дисплеем (E1…E4) подключены непосредственно к порту микроконтроллера.

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

Алгоритм измерения частоты

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

Максимальная частота, которая может быть обработана счетчиком микроконтроллера ATmega16, не может превышать тактовую частоту, деленную на 2.5. Обозначим максимальную частоту – F max . Тактовая частота для нашего микроконтроллера – 8 МГц, следовательно напрямую мы можем измерять сигналы с частотой до 3.2 МГц. Для измерения частоты выше этого уровня мы используем 4-битный счетчик в качестве делителя входной частоты. Теперь мы можем измерять частоты в 16 раз превышающие F max , но здесь накладывается ограничение со стороны счетчика 74191 и фактическая максимальная измеряемая частота не превышает 40 МГц.

Алгоритм, который был разработан, проводит измерение оригинальной (входной) частоты (обозначимF o ) и частоты получаемой с делителя (обозначим F d ). Пока соблюдается условие, что частота меньшеF max выполняется условие:

F o = 16 × F d ;

Но по мере приближении F o к F max , все больше импульсов должны быть обработаны и выражение выше примет вид:

F o < 16 × F d ;

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

Частотомер начинает делать измерение оригинальной частоты (обработка и отображение значений на дисплее), и как только обнаруживает приближение к максимальной частоте F max (с использованием указанного выше метода), выбирает для измерения частоту после делителя.

Алгоритм суммарно изображен на диаграмме (рис. 3)

Рис.3 Алгоритм работы частотомера на микроконтроллере

Программное обеспечение микроконтроллера

Исходный код программы микроконтроллера снабжен подробными комментариями, но некоторые моменты требуют отдельного разъяснения:

  • код разработан так, что измеренное значение отображается на индикаторе в «кГц». Например, если Вы видите на дисплее значение «325.8» – это означает 325.8 кГц, значение «3983» – это 3983 кГц (или 3.983 МГц).
  • Таймер/счетчик 0 микроконтроллера используется для подсчета входных импульсов напрямую;
  • Таймер/счетчик 1 микроконтроллера используется для подсчета входных импульсов после делителя на 16;
  • Таймер/счетчик 2 сконфигурирован как таймер с предварительным делителем на 1024 (частота CPU делится на 1024). Используется для вызова алгоритма вычисления и выбора частоты каждый период T таймера. В нашем проекте Т = 1024 × 256/F cpu .
  • Константа «factor», определенная в начале программы значением «31.78581», должна быть откалибрована измерением эталонной частоты. Вычисляется по выражению:

factor = F cpu /(1024 × 256)=8.E6/(1024×256)=30.51757

Функция Anti-Flickering (устранение мерцания индикатора) довольна сложна, но очень эффективна, особенно при измерении непостоянных частот. Данная функция полностью избавляет индикатор от быстрого переключения между различными значениями, продолжая отображать точное значение, и быстро изменяет показания, если измеренная частота действительно изменилась.

Примечание

Микроконтроллер ATmega16 поставляется с заводскими установками, при которых настроен на работу от внутреннего RC осциллятора 1 МГц. Необходимо с помощью последовательного программатора установить Fuse-биты CKSEL3..0 в значение «0100», что соответствует включению внутреннего RC осциллятора 8 МГц.

ПРИЛОЖЕНИЯ:

- Исходный код программы микроконтроллера

Перевод: Vadim

Представленный в данной статье частотомер позволяет измерять частоту от 10 Гц до 60 МГц с точностью 10 Гц. Это позволяет использовать данный прибор для самого широкого применения, например измерять частоту задающего генератора, радио приёмника и передатчика, функционального генератора, кварцевого резонатора и др. Частотомер обеспечивает хорошие параметры и обладает хорошей входной чувствительностью, благодаря наличию усилителя и TTL-преобразователя. Это позволяет измерять частоту кварцевых резонаторов. Если использовать дополнительный делитель частоты, максимальная частота измерения может достигать 1 ГГц и выше.

Идея частотомера на микроконтроллере PIC, возникла у меня после прочтения апнота AN592 фирмы Microchip, где описывается измерение частоты на PIC и представлена программа. Я разработал схему и написал программу, в которой улучшил точность измерения, а значение частоты отображается на LCD-экранчике. Получился довольно простой и эффективный частотомер.

Схема частотомера довольно простая, большинство функций выполняет микроконтроллер. Единственное, для микроконтроллера необходим усилительный каскад, чтобы увеличить входное напряжения с 200-300 мВ до 3 В. Транзистор, включенный по схеме с общим эмиттером, обеспечивает псевдо-TTL сигнал, поступающий на вход микроконтроллера.

В качестве транзистора необходим какой-нибудь "быстрый" транзистор, я применил BFR91 (отечественный аналог КТ3198В).

Напряжение V кэ устанавливается на уровне 1.8-2.2 вольта резистором R3* на схеме. У меня это 10 кОм, однако может потребоваться корректировка. Напряжение с коллектора транзистора прикладывается к входу счетчика/таймера микроконтроллера PIC, через последовательное сопротивление 470 Ом. Для выключения измерения, в PIC задействываются встроенные pull-down резисторы.

В PIC реализован 32-битный счетчик, частично аппаратно, частично софтово. Подсчет начинается после того, как выключаются встроенные pull-down резисторы микроконтроллера, продолжительность составляет точно 0.4 секунды. По истечении этого времени, PIC делит полученное число на 4, после чего прибавляет или отнимает соответствующую промежуточную частоту, для получения реальной частоты. Полученная частота конвертируется для отображения на дисплее.

Калибровка

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

Если данный метод не подходит, то можно воспользоваться "грубой калибровкой". Для этого, выключите питание прибора, а 10 ножку микроконтроллера подсоедините на GND. Затем, включите питание. МК будет измерять и отображать внутреннюю частоту. Если вы не можете подстроить отображаемую частоту (путем подстройки конденсатора 33 пФ), то кратковременно подсоедините вывод 12 или 13 МК к GND. Возможно, что это нужно будет сделать несколько раз, т.к. программа проверяет эти выводы только один раз за каждое измерение (0.4 сек). После калибровки, отключите 10 ногу микроконтроллера от GND, не выключая при этом питания прибора, чтобы сохранить данные в энергонезависимой памяти МК.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
МК PIC 8-бит

PIC18F84J11

1 В блокнот
Линейный регулятор

LM7805

1 В блокнот
Транзистор BFR91 1 В блокнот
Выпрямительный диод

1N4007

1 В блокнот
Конденсатор 1 мкФ 1 В блокнот
10 мкФ 1 В блокнот
Электролитический конденсатор 1 мкФ 1 В блокнот
Конденсатор 0.1 мкФ 1 В блокнот
Конденсатор 33 пФ 1 В блокнот
Конденсатор подстроечный 33 пФ 1 В блокнот
Резистор

470 Ом

2 В блокнот
Резистор

10 кОм

1 Подбор В блокнот
Резистор

10 кОм

1 В блокнот
Переменный резистор 10 кОм 2