Измеритель частоты (частотомер) на Arduino Uno

В своей жизни почти каждый радиолюбитель сталкивается с ситуацией, когда необходимо измерить частоту колебаний, генерируемых каким-нибудь электронными устройством. Для этой цели можно было бы задействовать осциллограф, но он есть не у всех. Другие устройства для измерения частоты колебаний также стоят недешево. Поэтому мы в данной статье рассмотрим создание простейшего измерителя частоты (частотомера) на основе платы Arduino Uno и триггера Шмидта.

Внешний вид частотомера на Arduino Uno

Чтобы протестировать наш частотомер, мы создадим и самодельный генератор сигналов на основе таймера 555 (555 timer chip), который будет формировать прямоугольную волну, подаваемую на плату Arduino Uno.

Необходимые компоненты

Плата Arduino Uno
Источник питания
Микросхема таймера 555 (555 timer IC) и триггер Шмидта 74LS14
Резистор 1 кОм (2 шт.)
Резистор 100 Ом
Конденсатор 100 нФ (2 шт.)
Конденсатор 1000 мкФ
ЖК дисплей 16х2
Потенциометр 47 кОм
Макетная плата
Соединительные провода

Работа схемы

Схема устройства представлена на следующем рисунке.

Схема частотомера на Arduino Uno

ЖК дисплей в схеме предназначен для отображения измеренной частоты. Ко входу ‘Wave Input’ будет подсоединяться наш генератор сигналов. Триггер Шмидта (микросхема 74LS14) нужен для того, чтобы на вход платы Arduino Uno поступала строго прямоугольная волна. Для фильтрации нежелательных помех в схему добавлены два конденсатора, включенных по питанию. Наш частотомер будет способен измерять частоты до 1 МГц.

Схема используемого нами генератора сигналов на основе таймера 555 представлена на следующем рисунке.

Схема используемого нами генератора сигналов на основе таймера 555

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

Внешний вид собранного на макетной плате генератора прямоугольных колебаний

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

Типовая схема генератора прямоугольных колебаний на основе таймера 555

Частота выходного сигнала данного генератора зависит от резисторов RA, RB, конденсатора C и может быть рассчитана по формуле:

Frequency (F) = 1/ (Time period) = 1.44/ ((RA+RB*2)*C).

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

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

Триггер Шмидта

Кроме прямоугольных в электронике встречается и много других видов сигналов, частоту которых необходимо измерять: треугольные волны, зубчатые волны, синусоидальные волны и т.д. Но плата Arduino Uno может измерять характеристики только прямоугольных волн, поэтому перед подачей сигнала, частоту которого необходимо измерить, на вход платы Arduino Uno, нам необходимо использовать устройство, которое преобразовывало бы все виды колебаний (волн) в прямоугольные. Этим устройством в нашей схеме будет триггер Шмидта.

Уровень сигнала на его выходе зависит от сигнала на его входе. Триггер Шмидта имеет определенную границу (порог) напряжения – если напряжение на входе триггера больше этой границы, то на выходе триггера сигнал высокого уровня, а если напряжение на входе триггера меньше этой границы, то на выходе триггера будет сигнал низкого уровня. Триггер Шмидта чаще всего используется совместно с логической схемой НЕТ (NOT) на его выходе.

Мы в нашем проекте будем использовать микросхему 74LS14, которая имеет в своем составе 6 триггеров Шмидта. Схема соединений этих триггеров с контактами микросхемы приведена на следующем рисунке.

Схема соединений триггеров Шмидта в микросхеме 74HC14

Таблица истинности триггера Шмидта с инверсным выходом показана на рисунке ниже, поэтому в программе для Arduino Uno нам следует инвертировать сигнал с выхода триггера.

Таблица истинности триггера Шмидта с инверсным выходом

Таким образом, мы подаем сигнал с выхода таймера 555 на вход триггера Шмидта, на выходе которого получаем инвертированную прямоугольную волну, которая пригодна для подачи на вход Arduino Uno.

Исходный код программы

Плата Arduino Uno имеет специальную функцию pulseIn, с помощью которой можно измерить длительности положительной и отрицательной части прямоугольной волны.

Htime = pulseIn(8,HIGH);
Ltime = pulseIn(8, LOW);

Данная функция измеряет время наличия сигнала высокого (High) или низкого (Low) уровня на контакте PIN8 платы Arduino Uno. Таким образом, для одного периода (цикла) волны мы определим продолжительности этих состояний в микросекундах. Сложив эти две длительности (Htime + Ltime) мы получим длительность периода волны, инвертировав эту величину мы получим значение частоты.

Далее представлен полный текст программы.

#include <LiquidCrystal.h> // подключаем библиотеку для работы с ЖК дисплеем
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
int Htime; // переменная целого типа для хранения длительности высокого уровня
int Ltime; // переменная целого типа для хранения длительности низкого уровня
float Ttime; // переменная для хранения длительности периода
float frequency; // переменная для хранения значения частоты
void setup()
{
pinMode(8,INPUT); // контакт 8 конфигурируем на ввод данных
lcd.begin(16, 2);
}
void loop()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Frequency of signal");
Htime=pulseIn(8,HIGH); // считываем длительность высокого уровня
Ltime=pulseIn(8,LOW); // считываем длительность низкого уровня

Ttime = Htime+Ltime;
frequency=1000000/Ttime; // вычисляем значение частоты учитывая что время у нас в микросекундах
lcd.setCursor(0,1);
lcd.print(frequency);
lcd.print(" Hz");
delay(500);
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
1 086 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *