Частотомер на atmega8 своими руками

Обновлено: 07.07.2024

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

Вроде бы схема простая но что то не сходится


код тоже простой. на си

Частотомер-Тахометр на Atmega8
Доброго времени суток дорогие посетители форума ! Возникла идея сделать электронное управление.

Частотомер.
Делаю частотомер для струнного датчика с автогенератором, сигнал на выходе 0,3 В прямоугольный от 2.

Частотомер
Привет всем, есть программа таймера ( частотомера) написана на ассемблере, в протеусе проверил сам.

Я стесняюсь спросить, разве можно так использовать РВВ, состоящий из двух восьмибитных? Может надо сперва что то типа “count = (TCNT1H 0

1. Глобальные переменные изменяемые в прерываниях надо декларировать как volatile.
2. Переменную i прерывание может изменить в самый не подходящий момент, например перед вызовом PORTB = num[str[i]];.

Универсальный цифровой частотомер на процессоре AT89C2051. Д. Hечитайлов (UU9JDR).

Малогабаритный частотомер - цифровая шкала с ЖКИ дисплеем. И. Максимов

Универсальная цифровая шкала - частотомер с функцией ЦАПЧ. И. Максимов

Частотомер-цифровая шкала 100 кГц - 1500 МГц. И. Максимов

Частотомер - цифровая шкала. Ю. Савельев (RA3RUP)

Частотомер с использованием метода досчета.

Частотомер – цифровая шкала 10КГц –150МГц. Ю. Савельев (RA3RUP)

Частотомер 30/1200 MHz.

Цифровая шкала на PIC. P. Hotycky (OM3CPH)

Цифровая шкала c ЦАПЧ. И.А. Доброхотов (UN7GM)

ЦАПЧ для трансивера Л.Вербицкий (UR5LAK)

Цифровая шкала "ГЕРАНЬ" В. Тищенко (UR1MI).

Цифровой частотомер. В. Гвоздев (RU3AEP)

Цифровая шкала - частотомер на PIC16F84. А. Денисов (RA3RBE)

Цифровая шкала / частотомер на процессоре pic16f84(a) Аникин Днитрий (RW4LED)

Доработка цифровой шкалы – частотомера А.Денисова. И. Часовский (UR6HCP).

Цифровая шкала - частотомер с ЖК индикатором. А. Денисов (RA3RBE)

Цифровая шкала - частотомер с ЖК индикатором и автоподстройкой частоты. А. Денисов

Цифровая шкала-частотомер Сергей Сапотько (EW2AH).

Частотомер - цифровая шкала на PIC16CE625 (PIC16F84). Н. Хлюпин (RA4NAL).

Цифровой частотомер на микроконтроллере КР1830ВЕ31. Н. Хлюпин (RA4NAL).

Частотомер до 450 МГц

Частотомер - цифровая шкала с жидкокристаллическим индикатором.
Н. Хлюпин (RA4NAL).

Частотомер шкала для UW3DI. Э.Ю. Дергаев (UA4NX)

Гы. индикатор перевернутый, эт специально. или нечайно.

Универсальный цифровой частотомер на процессоре AT89C2051. Д. Hечитайлов (UU9JDR).

Малогабаритный частотомер - цифровая шкала с ЖКИ дисплеем. И. Максимов

Универсальная цифровая шкала - частотомер с функцией ЦАПЧ. И. Максимов

Частотомер-цифровая шкала 100 кГц - 1500 МГц. И. Максимов

Частотомер - цифровая шкала. Ю. Савельев (RA3RUP)

Частотомер с использованием метода досчета.

Частотомер – цифровая шкала 10КГц –150МГц. Ю. Савельев (RA3RUP)

Частотомер 30/1200 MHz.

Цифровая шкала на PIC. P. Hotycky (OM3CPH)

Цифровая шкала c ЦАПЧ. И.А. Доброхотов (UN7GM)

ЦАПЧ для трансивера Л.Вербицкий (UR5LAK)

Цифровая шкала "ГЕРАНЬ" В. Тищенко (UR1MI).

Цифровой частотомер. В. Гвоздев (RU3AEP)

Цифровая шкала - частотомер на PIC16F84. А. Денисов (RA3RBE)

Цифровая шкала / частотомер на процессоре pic16f84(a) Аникин Днитрий (RW4LED)

Доработка цифровой шкалы – частотомера А.Денисова. И. Часовский (UR6HCP).

Цифровая шкала - частотомер с ЖК индикатором. А. Денисов (RA3RBE)

Цифровая шкала - частотомер с ЖК индикатором и автоподстройкой частоты. А. Денисов

Цифровая шкала-частотомер Сергей Сапотько (EW2AH).

Частотомер - цифровая шкала на PIC16CE625 (PIC16F84). Н. Хлюпин (RA4NAL).

Цифровой частотомер на микроконтроллере КР1830ВЕ31. Н. Хлюпин (RA4NAL).

Частотомер до 450 МГц

Частотомер - цифровая шкала с жидкокристаллическим индикатором.
Н. Хлюпин (RA4NAL).

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

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

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

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


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

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

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

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

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

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

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

Циклограмма работы таймеров Т0 и Т1

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

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

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

f-meter-1

Частотомер с хорошими характеристиками, позволяющий измерять частоты от 1Гц до 10 МГц (9,999,999) с разрешением в 1 Гц во всем диапазоне. Идеален для функиональных генераторов, цифровых шкал или как отдельное устройство. Дешев и легок в изготовлении, собран из доступных деталей, имет небольшой размер и может быть смонтирован на панели многих устройств.

Разрешение и точность:
Точность зависит от тактового генератора. Кварц должен быть хорошего качества и иметь как можно меньший ppm (допуск). Будет лучше, если частота будет кратна 1024, например, 16 МГц или 22.1184 МГц. Для измерения частоты до 10 МГц, надо использовать кварц не меньше, чем на 21 МГц, например, 22.1184 МГц. Частотомер может измерять частоту до 47% от частоты собственного кварца. Если есть хороший промышленный частотомер, то можно откалибровать схему добавлением подстроечного конденсатора (1пФ-10пФ) между одним из выводов кварца и землей, и подстроить частоту в соответствии с показаниями промушленного частотомера.

В архиве с исходниками есть несколько вариантов под разные кварцы, но вы можете скомпилировать свой вариант.

Форма сигнала:
В принципе, устройство понимает любую форму сигнала от 0 до 5V, не только прямоугольные импульсы . Синусоида и теугольные импульсы сичтаются по заднему фрону при переходе его ниже 0.8V.

В устройстве нет защиты от превышения входного напряжения выше 5 вольт.

Устройство имеет высокоомный вход и не нагружает тестируемую схему – вы даже можете измерить частоту переменного тока в сети 220 вольт, прикоснувшись ко входу пальцем. Частотомер может быть переделан для измерения частоты до 100 МГц с шагом 10 Гц путем добавления на вход быстродействующего делителя.

Дисплей:
Использовано семь семисегментных индикаторов с общим анодом в режиме динамической индикации. Если яркость получается недостаточной, можно уменьшить значения токоограничивающих резисторов, но нужно помнить, что максимальный импульсный ток каждого вывода микроконтроллера составляет 40 мA . По умолчанию сопротивление резисторов 100 Ом. Незначащие нули гасятся програмно. Значения обновляются каждую секунду.

f-meter-5

Печатная плата:
Двусторонняя печатная плата размером 109mm x 23mm – к сожалению, 7 индикаторов не влезли в рабочее пространство бесплатной версии Eagle, поэтому они нарисованы от руки. На плате нужно сделать 3 соединения проводом - первое - соединение питания и вывода VCC контроллера – это соединение показано на слое silkscreen. Два других соединяют десятичные точки индикаторов с резисторами на 330 Ом расположенными на слое bottom. Сверху платы расположен коннектор Atmel ISP-6. Контакт 1 первый со стороны кварца. Этот коннектор необязателен и нужен только для программирования контроллера. Индикаторы должны припаиваться на некотором расстоянии от платы, чтобы можно было подлезть паяльником к выводам, припаиваемым с верхней стороны платы.

f-meter-3

f-meter-4

СКАЧАТЬ – .BAS исходник и скомпилированная версия 1.1; Проект Eagle 6.4.0 и PDF версия 1.1

F meter 7 1

СКАЧАТЬ – .BAS исходник и скомпилированная версия 1.1 для ЖК индикатора; Проект Eagle 6.4.0 и PDF версия 1.1 для ЖК индикатора

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

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

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

Количество ножек, отведенных для внешних прерываний, зависит от типа микроконтроллера, например у atmega8 их 2, у atmega16 их 3. Называются они INT0, INT1 и т.п.

13-2

Срабатывать прерывание может по нарастанию сигнала Rise edge, по спаду Falling edge, по любому изменению Any change, Low level по низкому уровню. В визарде выглядит так:

13-3

Теперь рассмотрим, как пример, необычное использование внешнего прерывания — частотомер.

13-4

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

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

Читайте также: