Частотомер на ARDUINO
- Подробности
- Категория: Схемы на Arduino
- Опубликовано: 15.01.2018 15:06
- Просмотров: 7696
Каравкин В.
В статье автора «Ёлочная мигалка на ARDUINO как средство от боязни микроконтроллеров» («Радиоконструктор, №11, 2016 г. стр. 25-30) был дан своеобразный «вводный курс» для людей, желающих освоить микроконтроллеры на примере платы ARDUINO UNO, и пример создания на этой основе программируемого переключателя четырех ёлочных гирлянд, с подробным описанием программы.
Здесь приводится описание частотомера, измеряющего частоту до 1 МГц, так же, построенного на основе платы ARDUINO UNO.
Но, прежде всего, хочу напомнить, что ARDUINO UNO это небольшая печатная плата, на которой расположен микроконтроллер ATMEGA328, а так же вся его «обвязка», необходимая для его работы, включая USB-программатор и источник питания. Стоимость ARDUINO UNO лежит в пределах от 200 до 1000 рублей, в зависимости от места продажи. Конечно, самое дешевое на радиорынке и китайском интернет-посылторге «Aliexpress». Описание платы ARDUINO UNO, а так же программного обеспечения для неё, и подключения к персональному компьютеру приводится
в Л.1, так что, если кто не в курсе, обязательно прочтите сначала статью в Л.1.
Схема частотомера показана на рис. 1.
Как видно из схемы, к цифровым портам D2-D7 платы ARDUINO UNO подключен модуль жидкокристаллического индикатора Н1 типа 1602А. А входной сигнал поступает через вполне понятный усилитель-формирователь на транзисторе VT1 и микросхеме D1 на порт D8. Питается входной усилитель-формирователь и ЖК-индикатор от стабилизатора напряжения 5V, имеющегося на плате ARDUINO UNO.
Но, вернемся к ЖК-индикатору. Индикатор представляет собой плату, на которой установлен собственно ЖК-дисплей и схема для его обслуживания, выполненная на двух безкорпусных микросхемах. Индикатор 1602А стандартный, на основе контроллера HD44780. Обозначение 1602А фактически значит, что он на две строки по 16 символов в строке. Индикатор был куплен на «Aliexpress», найден по запросу «HD44780» (цены от 81 рубля).
Питание +5V на ЖК-индикатор поступает через вывод 2 его платы. Общий минус на выводы 3 и 1. Поскольку в индикатор планируется только передавать информацию от контроллера, а не наоборот, вывод 5 (RW) соединен с нулем. Данные на ЖК-индикатор будут поступать через его выводы 11-14 (выводы 7-10 не используются). Выводы 15 и 16 служат для подключения подсветки ЖК-индикатора. На них подается напряжение 5V.
Таблица 1.
Для управления ЖК-индикатором решено было использовать порты с D2 по D7 платы ARDUINO UNO. В принципе, можно и другие порты, но я вот так, решил использовать именно эти.
ЖК-индикатор подключили. Но просто так он работать не станет. Для того чтобы он взаимодействовал с ARDUINO UNO нужно в программу загрузить подпрограмму для его управления. Такие подпрограммы почему-то называются «библиотеками», и в программном комплекте для ARDUINO UNO есть много разных «библиотек». Для работы с ЖК-индикатором на основе HD44780 нужна библиотека LiquidCrystal. Поэтому программа для нашего частотомера (таблица 1) начинается с загрузки этой библиотеки:
#include <LiquidCrystal.h>
Эта строка дает команду загрузить в ARDUINO UNO данную библиотеку. Затем, нужно назначить порты ARDUINO UNO, которые будут работать с ЖК-индикатором. Как я уже сказал, я выбрал порты с D2 по D7. Эти порты назначены строкой:
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); После чего, программа переходит собственно к работе частотомера.
Среди набора функций языка для программирования ARDUINO UNO есть такая функция: pulseln , перевести это можно как «входной импульс». Эта функция измеряет в микросекундах длительность положительного либо отрицательного перепада входного импульса. Так что измерение частоты здесь будет происходить через предварительное измерение периода. Так как длительность положительного и отрицательного полупериодов в реальном входном сигнале могут различаться, если мы хотим измерить период входных импульсов нам нужно сложить длительность положительного и отрицательного полупериодов.
В программе длительность положительного полупериода обозначена Htime, длительность отрицательного полупериода - Ltime, а длительность всего периода - Ttime.
Измерение полупериодов происходит в строках:
Htime=pulseIn(8,HIGH);
Ltime=pulseln(8,LOW);
Затем, производится вычисление полного периода в строке: Ttime=Htime+Ltime;
Вычисление частоты, учитывая, что значение периода выражено в микросекундах, происходит здесь: frequency=1000000/Ttime;
Затем, указывается строка ЖК-индикатора (нижняя строка, это строка 1), в которую записывается результат: lcd. setCursor (0,1);
И результат записывается в ЖК-индикатор:
lcd.print(frequency);
Далее указывается единица измерения: lcd.print("hz");
Завершается рабочий цикл частотомера индикацией результата в течение одной секунды, вернее, паузой в одну секунду, в течение которой на табло остается
измеренное значение (время выражено в миллисекундах, поэтому 1 сек = 1000): delay(1000);
Таким образом, наш частотомер, в отличие от типового, не занимается подсчетом импульсов за фиксированный временной интервал, а определяет частоту по предварительно измеренному периоду. При этом показания сменяются каждую секунду. Что, впрочем, не обязательно.
Период смены показаний (время индикации) можно установить любой величины, изменив продолжительность паузы в строке:
delay(1000); например, так: delay(2000);
Теперь показания будут сменяться каждые две секунды. Можно выбрать любое другое значение, как меньше 1000, так и больше, но слишком увлекаться его уменьшением не стоит, - чрезмерно частая смена показаний затрудняет зрительное восприятие. На мой взгляд, оптимально -1 секунда.
Теперь о других деталях программы. В строке:
pinMode(8, INPUT);
порт 8 платы ARDUINO UNO назначен как цифровой вход. На него поступают импульсы, частоту которых нужно измерить.
В строке: lcd.begin(16,2);
указано что индикатор двухстрочный, по 16 знаков в строке.
Индикатор у нас двухстрочный. Одна строка остается свободной и в неё можно записать что угодно. Здесь в верхнюю строку (верхняя строка, это строка 0) записано слово «frequency»:
lcd.setCursor(0,0);
lcd.print("frequency");
К сожалению, китайский ЖК-индикатор по-русски не понимает, поэтому писать можно только латинскими буквами. Если попробовать написать кириллицей, например, слово «частота», он начинает гнусно ругаться китайскими иероглифами.
Если на вход (порт D8 ARDUINO UNO) сигнал не поступает, на ЖК-индикаторе будет мигать: «infhz».
Работу частотомера можно ускорить или замедлить, изменив время индикации, как это сказано выше.
Точность частотомера весьма высокая, потому что тактовая частота микроконтроллера стабилизирована кварцевым резонатором, установленным на плате ARDUINO UNO. Однако, учитывая специфику прибора, в частности то, что он фактически измеряет период, а не частоту, а частоту только вычисляет, при сильно искаженном входном сигнале показания могут плавать.
Этот частотомер предназначен для измерения частоты входного сигнала. Но бывают и другие частотомеры, например, тахометры, спидометры, и др. которые импульсы получают от неких датчиков, а результат должны выдавать не в герцах, а в оборотах в минуту или метрах в секунду, километрах в час или других единицах.
В таком случае, изменить закон перевода измеренного периода в результат можно в этой строке:
frequency=1000000/Ttime;
подставив вместо 1000000 другое значение, или вообще изменив формулу вычисления результата, соответственно той, которая необходима для конкретного случая применения прибора.
Соответственно, нужно будет изменить и единицу измерения, заменив её в строке: lcd.print("hz");
И изменить заголовок в верхней строке ЖК-индикатора, изменив его в строке: lcd.print("frequency");
Напряжение питания частотомера может быть от 7 до 12V. Питание подается на соответствующее гнездо на плате ARDUINO UNO. Напряжение может быть нестабилизированным (на плате есть собственный стабилизатор на 5V), но
обязательно хорошо отфильтрованным (пульсации должны быть минимальными). Питание возможно и от источника напряжением 5V через USB-порт, но в этом случае, напряжение должно быть не только хорошо отфильтрованным, но и стабилизированным.
Схема входного усилителя состоит из собственно входного усилителя на транзисторе VT1 и триггера Шмитта на элементах микросхемы D1. Кстати, микросхему К561ЛЕ5 или К561ЛА7 можно заменить любой КМОП-микросхемой, в которой есть не менее трех инверторов, соответственно, изменив схему.
Схему входного усилителя можно выполнить и иначе, применив другие схемные решения. Но, в любом случае, там должен быть триггер Шмитта, на выходе которого должны быть прямоу-угольные импульсы размахом не менее 3V и не более 5V.
При питании от гальванической батареи, например, «Кроны» или её аналога напряжением 9V, с целью экономии источника питания можно отключить подсветку ЖК-индикатора. Для этого нужно в разрыв его вывода 15 или 16 включить выключатель, которым включать подсветку, если она нужна. Если же подсветка вообще не требуется, выводы 15 и 16 ЖК-индикатора можно вообще не подключать.
В стационарном же режиме, когда прибор питается от сетевого источника питания, подсветку можно сделать подключенной постоянно, как это показано в схеме на рисунке 1.
Набирая программу (таблица 1) совсем не обязательно набирать то, что в строках после знака « ; » (точка с запятой). Потому что это комментарии и пояснения, никак не влияющие на работу программы.
Литература:
1. Каравкин В. «Ёлочная мигалка на ARDUINO как средство от боязни микроконтроллеров», ж. Радиоконструктор, №11, 2016 г. стр. 25-30.
Радиокoнструктор 12-2016