Самодельный частотомер на ATTINY2313. Самодельный частотомер на ATTINY2313 Разрешение и точность измерений

В данной статье я хотел бы вас познакомить с "самоделкой выходного дня" - частотомером на уже "легендарном" микроконтроллере ATmega8. Данный прибор не позиционируется как "лучший" по параметрам, да и схемотехника не претендует на оригинальность. Единственное его отличие от большинства конструкций, которое можно найти в сети - повышенная точность в диапазоне низких частот (1 - 1000Гц). Это достигается за счет различного подхода при измерении НЧ и СЧ с ВЧ. При измерении НЧ производится подсчет количества тактов микроконтроллера за некоторое количество импульсов на входе прибора. А при измерении СЧ и ВЧ, традиционно считается количество импульсов за определенный промежуток времени.

Характеристики частотомера:

  • Диапазон частот с погрешностью измерения +/- 1Гц: 1000Гц - 1МГц (при погрешности +/- 20-200Гц, [> частота, > погрешность] возможно измерение частот до 10МГц без предделителя).
  • Напряжение питания: 5В
  • Потребляемый ток: <50мА
  • Время измерения: 1с (1кГц - 1МГц) и до 10с (1Гц - 1кГц).
  • Точность: 4 знака после запятой (1 - 10Гц), 3 знака после запятой (10 - 100Гц), 2 знака после запятой (100 - 1000Гц), целое число (> 1кГц).
  • Время индикации: 3с

Проект был собран и протестирован в , а после и "в живую". Для создания прошивки использовался компилятор avr-gcc (он же ).

Основа схемы, как уже говорилось, микроконтроллер ATmega8. Отображение данных производится на семисегментном светодиодным (не обязательно) индикаторе на 8 знакомест с общим анодом. В моем случае был использован малогабаритный индикатор, соответственно и печатная плата была разработана небольших размеров. На схеме, как вы видите, есть контакты для подключения кнопки (J7, J8), но это "на будущее", и в данным момент они не используются. Для тактирования микроконтроллера применен кварцевый резонатор на 16МГц. Светодиод D1 отображает действия прибора - при цикле измерения он включается. Измерение длится 1 секунду. После пауза в 3 секунды, а потом снова измерение и т.д.

Для индикаторов с общим катодом необходимо следующим образом изменить транзисторные ключи:

Кроме этого, потребуется подправить программу.

В заголовочном файле "display7seg_lib.h " необходимо эту строку:

#define OK

Заменить на

#define OA

А затем рекомпилировать проект.

К слову, библиотеку для семисегментного индикатора я делал не только для этого проекта, и возможно она вам пригодится, так как имеет несколько полезных функций (к примеру, вывод строки).

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

Порядок измерения следующий:

  1. Производится измерение частоты посредством счета импульсов на ходе
  2. Если количество импульсов более тысячи (частота более одного килогерца), то результат выводится на дисплей а устройство ожидает 1 секунду и повторяет измерение
  3. Если же количество импульсов менее тысячи, то происходит дополнительно сравнение. В том случае, когда частота менее 10Гц, производится счет тактов на протяжении 20 импульсов на входе (10 < 100Гц - 10 импульсов и 100 < 1000Гц - 2 импульса). За счет этого и удается получить маленькую погрешность при измерении.

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

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

Лицевая сторона:

Обратная сторона:

Расположение элементов:

Варианты замены деталей

Резисторы R1 - R8, R14 желательно использовать в диапазоне 220 - 680 Ом. Меньшего номинала брать очень нежелательно (у микроконтроллера не такая высокая нагрузочная способность на портах), а больше нет смысла так как яркость индикатора и светодиода будет крайне низкой. Конденсаторы C2 и C3 можно взять 18 - 33пФ. Конденсатор для предотвращения помех по питанию, под номером C1, желательно использовать емкостью 0,068 - 0,47мкФ. Резисторы R9 - R16 можно взять 1 - 4.7кОм.Транзисторы Q1 - Q8 заменяются на КТ315 или КТ3102, но подойдут и любые другие маломощные кремниевые структуры n-p-n. Микроконтроллер можно применить и в DIP корпусе, но придется заново разводить плату.

Небольшое послесловие

В данном приборе мной было решено вынести блок формирователя импульсов за пределы основной платы (к примеру, в виде выносного пробника).

Самый простой вариант - использовать компаратор или ОУ в режиме масштабного усиления (показано ниже) . Выгодная сторона - малый порог по напряжению. Недостаток же данной схемы - очень скромный предел по частоте. При использовании популярного ОУ LM358, максимальная частота не превышает 100кГц. Но для наладки, к примеру, звуковой аппаратуры и различных устройств, работающих на небольших частотах вполне сгодится.

Еще один вариант - использование транзистора и логического элемента, к примеру, КТ3102 + 74LS13 (шустрый аналог нашей К155ТЛ1). Этот вариант вполне жизнеспособен и на высоких частотах.

Так же схемы формирователей можно найти в интернете, главный критерий - комплиментарность с высоким и низким логическим уровнем КМОП-логики.

В архиве, прикрепленном к статье, есть файлы прошивки и для схемы с ОА так и с ОК. В прочем, как и сами схемы и печатные платы (смотрите в проектах Proteus).

Удачи вам в сборке ваших устройств

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

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

ATmega8A-AU

1 TQFP-32 В блокнот
Q1-Q8 Биполярный транзистор

BC547

8 или КТ312/315/3102 В блокнот
R1-R8, R17 Резистор

220 Ом

9 В блокнот
R9-R16 Резистор

1 кОм

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

10 кОм

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

100 кОм

1 В блокнот
C1 Конденсатор 100 нФ 1 В блокнот
C2-C3 Конденсатор 22 пФ 2

Особенностью первой схемы частотомера на микроконтроллере AVR является то, что она работает вместе с компьютером и подсоединена к материнской плате через разъем IRDA. От этого же разъема конструкция получает питание. Вторая схема частотомера базируется на микроконтроллере Attiny2313 и способна измерять частоту до 10 мГц. Третья рассмотренная конструкция частотомера построена на базе легендарной платы Arduino, основа которой также микроконтроллер AVR.

Схема частотомера состоит из микропроцессора Attiny2313 и двоичного счетчика 74AC161. Входящий сигнал для усиления следует на транзистор VT1, затем с его коллекторного вывода он поступает на вход «С» двоичного счётчика. Контроль за работой счетчика закреплен за МК Attiny2313, который осуществляет обнуление, останавливает или запускает счет путем подачи управляющего сигнала на десятый вывод.


Непродолжительной подачей логического нуля на вход сброса двоичного счётчика, МК обнуляет его, а после этого, отправляет уровень логической единицы на входе ЕР, запускает его работу. Затем, он считает импульсы с выхода старшего разряда счетчика в течение полусекунды.

Частотомер на микроконтроллере AVR. Сигналы данных на компьютер идут с порта PD6 Attiny2313. Линия порта РВ1 используется для сигналов синхронизации следующие от компьютера.

В начальный момент времени МК генерирует стартовый импульс продолжительностью около 1,6 мкс после чего идет пауза. Программа время от времени обращается к порту 2F8H и при регистрации байта, инициирует передачу синхроимпульсов. Данные синхроимпульсы пойдут при отправке числа ноль в инфракрасный порт компьютера. Состав импульсов: Первый бит стартовый и 8 бит число ноль.

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

Так как скорости передачи и приёма одинаковы, это позволяет получить независимость от заданной скорости ИК порта компьютера.

Фъюзы для программы Ponyprog и сама прошивка доступна по зеленой ссылке чуть выше.

В этом простом проекте частотомера, контроллер Arduino считывает напряжение, затем высчитывает его частоту и посылает данные через USB UART в компьютер, на котором необходимо установить программу считывания и визуализации данных, приложение и скетч в архиве для скачки.

Плата Arduino генерирует точную односекундную временную основу для счетчика с помощью каскадирования двух таймеров timer0 и timer2. Связь между цифровыми входами 3 и 4 соединяет выход таймера 2 (250 Гц) со входом таймера 0. Программный код ожидает, когда выход таймера 0 станет положительным, и начинает отсчет частоты входного сигнала таймером 1. Timer1 – это 16-разрядный таймер, он переполняется при достижении значения 2 16 , после этого, изменяется значение регистра переполнения overF. В конце первой секунды записывается 16-разрядный регистр. Затем Arduino отправляет на ПК 6 байтов данных. Схема подключения к Arduino простая, и ее можно,посмотреть на фото ниже.

Сначала Arduino необходимо подсоединить к компьютеру, а только потом запустить приложение на Visual Basc 6. Приложение ищет Com-порт, отправляя байты и ожидает их обратное принятие. Это занимает пару секунд. Приложение должно быть обязательно отключено, в тот момент когда вы прошиваете плату через Arduino IDE. Частотный вход платы Ардуино представляет собой уровни сигнала TTL, при слабом сигнале необходимо добавить усилитель.

Представленный в данной статье частотомер позволяет измерять частоту от 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

В одной из предыдущих статей, посвященных изучению микроконтроллеров 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



Данный прибор предназначен для измерения частоты в пределах 0-9999 Гц, но при использовании делителя частоты на входе этот диапазон соответствующим образом расширяется. Максимальное входное напряжение – 3V, при условии, что отсутствует дополнительный делитель напряжения, минимальное 0,15V, так же при условии что он отсутствует. Максимальную частоту измерения можно расширить посредством изменения программного кода, но об этом позже.

Схема прибора относительно простая и изображена ниже:

В основе схемы – 8-ми битный микроконтроллер производства фирмы Atmel , Atmega8A-PU. Для тактирования ядра микроконтроллера применен генератор с внешним кварцевым резонатором. Выбор такого генератора обусловлен требованиями к стабильности частоты последнего. В качестве индикатора применен семисегментный четырехразрядный LED индикатор с общим анодом и динамической индикацией. Ток сегментов индикатора не ограничивается резисторами, так как применена динамическая индикация, и естественно ток импульсный, который сегменты индикатора с успехом выдерживают, так как и порт микроконтроллера. Входной узел выполнен на элементах R2, D1, D2, C3, R3, R4, R1, Q1. Этот узел обеспечивает усиление/ограничение сигналов, поступающих на его вход (резистор и диоды на входе частотомера ограничивают входной сигнал, транзистор отвечает за усиление сигнала до ТТЛ уровня). Печатная плата устройства так же не сложная. Она изготавливается из одностороннего фольгированного материала (изначально планировалось сделать из двухстороннего, но в наличии его не нашлось, поэтому остановился на односторонней). Топология платы представлена ниже.

Что касается программы для микроконтроллера, то она была разработана в среде Flowcode (файл проекта прилагается). Для подсчета импульсов я использовал прерывания по входу INT0 микроконтроллера, а для ограничения времени счета – прерывания таймера TMR0. Так как на этом таймере стоит предделитель с коэффициентом деления 1/256 (в силу того что он восьмиразрядный), то расчет частоты прерываний производится так:Fпрер.=F ген.÷256÷поргр. дел. В своей конструкции я выбрал частоту прерываний в 200 Гц. Как я уже писал выше, частоту измерения можно увеличить. Для этого нужно лишь ограничить время измерения. Это делается посредством изменения числа 200 на 2(время измерения не 1с а 10мс, граничная частота 99 999Гц), в коде, как показано на рисунке в исходнике на С.

Для программирования микроконтроллера я использовал параллельный программатор. Как видите, в моей конструкции вывод внешнего сброса используется как обычный порт. Если у вас нет параллельного программатора, то вот вариант схемы, где используется порт D микроконтроллера, и необходимость в использовании пина RESET как обычного порта вывода отпадает.

Вот пример выставления фузов в программе PonyProg2000 :

Вот схема варианта частотомера с использование RESET по прямому назначению:

А так же вот топология платы для второго варианта схемы:

Для питания схемы используется стабилизированный источник питания на напряжения 5V (я использовал компьютерный БП, поэтому никаких стабилизирующих элементов в схеме нет).

В данной схеме нет дефицитных деталей, но список замен и аналогов все же перечислю. Так микроконтроллер Atmega8A-PU можно заменить на аналогичный Atmega8-16PU (кстати, последний более предпочтителен). Резисторы можно взять на мощность 0,125 Вт, за исключением R2, его лучше взять на 0,5 Вт. Конденсаторы – для генератора дисковые, керамические, а для входного блока – любой, подходящий по параметрам. Транзистор можно заменить на отечественный КТ3102 (как показали опыты у КТ315 слишком мал коэффициент передачи тока h21Э). Светодиодный индикатор можно взять любой, подходящий по размерам (а они не критичны). Кварцевый резонатор использован на частоту 3267800Гц (3,2768МГц).

Фотографии готового устройства показаны ниже.

На первом фото видно резистор, который подключен к питу RESET МК (остался с проверки второй прошивки, со сбросом).