В своей жизни почти каждый радиолюбитель сталкивается с ситуацией, когда необходимо измерить частоту колебаний, генерируемых каким-нибудь электронными устройством. Для этой цели можно было бы задействовать осциллограф, но он есть не у всех. Другие устройства для измерения частоты колебаний также стоят недешево. Поэтому мы в данной статье рассмотрим создание простейшего измерителя частоты (частотомера) на основе платы Arduino Uno и триггера Шмитта.
Чтобы протестировать наш частотомер, мы создадим и самодельный генератор сигналов на основе таймера 555 (555 timer chip), который будет формировать прямоугольную волну, подаваемую на плату Arduino Uno.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Микросхема таймера 555 (555 timer IC) (купить на AliExpress).
- Триггер Шмитта 74LS14 (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Потенциометр 47 кОм (купить на AliExpress).
- Резистор 1 кОм (2 шт.) (купить на AliExpress).
- Резистор 100 Ом (купить на AliExpress).
- Конденсатор 100 нФ (2 шт.) (купить на AliExpress).
- Конденсатор 1000 мкФ (купить на AliExpress).
- Источник питания.
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Работа схемы
Схема устройства представлена на следующем рисунке.
ЖК дисплей в схеме предназначен для отображения измеренной частоты. Ко входу ‘Wave Input’ будет подсоединяться наш генератор сигналов. Триггер Шмитта (микросхема 74LS14) нужен для того, чтобы на вход платы Arduino Uno поступала строго прямоугольная волна. Для фильтрации нежелательных помех в схему добавлены два конденсатора, включенных по питанию. Наш частотомер будет способен измерять частоты до 1 МГц.
Схема используемого нами генератора сигналов на основе таймера 555 представлена на следующем рисунке.
Этот генератор представляет собой так называемый несинхронизованный мультивибратор. Данный генератор будет необходим нам для того, чтобы проверить корректность работы нашего проектируемого частотомера – то есть нам будет необходимо устройство, частота колебаний которого нам будет известна. С его помощью мы и будем тестировать наш частотомер. Внешний вид собранного на макетной плате генератора прямоугольных колебаний показан на следующем рисунке.
Типовая же схема несинхронизованного мультивибратора на основе таймера 555, которую мы использовали для создания нужного нам генератора колебаний, выглядит следующим образом:
Частота выходного сигнала данного генератора зависит от резисторов RA, RB, конденсатора C и может быть рассчитана по формуле:
Frequency (F) = 1/ (Time period) = 1.44/ ((RA+RB*2)*C).
Подставляя в данную формулу значения номиналов резисторов и емкости конденсатора, мы можем рассчитать частоту колебаний на выходе представленной схемы.
Мы в данной схеме заменили резистор RB на потенциометр для того, чтобы можно было изменять частоту колебаний генератора. Для простоты эксперимента вы можете заменить его на обычный резистор – тогда частоту на выходе схемы вы изменять не сможете.
Триггер Шмитта
Кроме прямоугольных в электронике встречается и много других видов сигналов, частоту которых необходимо измерять: треугольные волны, зубчатые волны, синусоидальные волны и т.д. Но плата Arduino Uno может измерять характеристики только прямоугольных волн, поэтому перед подачей сигнала, частоту которого необходимо измерить, на вход платы Arduino Uno, нам необходимо использовать устройство, которое преобразовывало бы все виды колебаний (волн) в прямоугольные. Этим устройством в нашей схеме будет триггер Шмитта.
Уровень сигнала на его выходе зависит от сигнала на его входе. Триггер Шмитта имеет определенную границу (порог) напряжения – если напряжение на входе триггера больше этой границы, то на выходе триггера сигнал высокого уровня, а если напряжение на входе триггера меньше этой границы, то на выходе триггера будет сигнал низкого уровня. Триггер Шмитта чаще всего используется совместно с логической схемой НЕТ (NOT) на его выходе.
Мы в нашем проекте будем использовать микросхему 74LS14, которая имеет в своем составе 6 триггеров Шмитта. Схема соединений этих триггеров с контактами микросхемы приведена на следующем рисунке.
Таблица истинности триггера Шмитта с инверсным выходом показана на рисунке ниже, поэтому в программе для Arduino Uno нам следует инвертировать сигнал с выхода триггера.
Таким образом, мы подаем сигнал с выхода таймера 555 на вход триггера Шмитта, на выходе которого получаем инвертированную прямоугольную волну, которая пригодна для подачи на вход Arduino Uno.
Исходный код программы
Плата Arduino Uno имеет специальную функцию pulseIn, с помощью которой можно измерить длительности положительной и отрицательной части прямоугольной волны.
Htime = pulseIn(8,HIGH);
Ltime = pulseIn(8, LOW);
Данная функция измеряет время наличия сигнала высокого (High) или низкого (Low) уровня на контакте PIN8 платы Arduino Uno. Таким образом, для одного периода (цикла) волны мы определим продолжительности этих состояний в микросекундах. Сложив эти две длительности (Htime + Ltime) мы получим длительность периода волны, инвертировав эту величину мы получим значение частоты.
Далее представлен полный текст программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#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); } |