Частотомер для измерения низких частот
- Войдите на сайт для отправки комментариев
Вс, 11/08/2019 - 11:13
Предлагаем вашему вниманию частотомер для измерения низких частот. Диапазон измерения от 2Гц до 180 кГц. В качестве платы используется ARDUINO NANO. Информация выводится на ЖК дисплей 16x2. подключенный по шине I2C.
Входная частота подается на выв 2 arduino.
Выв SCL соединен с выв А5 arduino.
Выв SDA соединен с выв А4 arduino.
//Максимальная измеряемая частота 180000 Гц. Пин 2 вход измерителя частоты.
//-------------------------------------------------------------------------
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Для экрана 16х2
//-------------------------------------------------------------------------
unsigned int interval_izm = 1000; //Время между измерениями частоты в mS.
unsigned long freq_gen = 16000000;//Тактовая частота кварцевого генератора
//--------------------------------------------------------------------------
boolean start_timer_1,stop_timer_1,flag_LED=1;
unsigned int ovf_tik_timer_1;
unsigned long ovf_tik_int_0,tik_timer_1;
float f,t1;
//--------------------------------------------------------------------------
void setup() {
//--------------------------------------------------------------------------
pinMode (2, INPUT); //Назначаем вывод 2 в режим ввода
digitalWrite(2, HIGH); //Включаем подтягивающий резистор
lcd.init(); //Задаем размерность LCD дисплея
lcd.backlight(); //Включаем подсветку экрана
//---Настройка прерывания int 0---------------------------------------------
EIMSK = (1<<INT0); //разрешение прерываний int 0
EICRA = (1<<ISC01) | (1<<ISC00); //настройка прерывания int 0 по фронту
//---Настройка таймера 0---------------------------------------------------
TCCR0B=0;TIMSK0=0; //Отключаем таймер 0
//---Настройка таймера 1---------------------------------------------------
TCCR1A = 0; TCCR1B = 0; TCNT1 = 0;
OCR1A = 15999; //отсчитать 16 000 импульсов до прерывания
TIMSK1 |= (1 << OCIE1A); //enable timer compare interrupt
}
//---Прерывание по int 0---------------------------------------------------
ISR (INT0_vect){
if (start_timer_1==1 && flag_LED==0){TCNT1=0;ovf_tik_timer_1=0;ovf_tik_int_0=0;start_timer_1=0;}
if ( stop_timer_1==1 && flag_LED==0){TCCR1B=0;flag_LED=1;}
if (start_timer_1==0 && stop_timer_1==0 && flag_LED==0){ovf_tik_int_0=ovf_tik_int_0+1;} }
//---Прерывание по таймеру 1-----------------------------------------------
ISR(TIMER1_COMPA_vect) { //Обработка прерывания по совпадению таймера Т1
ovf_tik_timer_1=ovf_tik_timer_1+1; //Считываем количество переполнений таймера 1
if (ovf_tik_timer_1>=interval_izm && flag_LED==0)stop_timer_1=1;}
//-------------------------------------------------------------------------
void loop() {
//---Начало блока вывода показаний на экран--------------------------------
if (ovf_tik_timer_1>=1.25*interval_izm) {flag_LED=1;TCCR1B=0;}
if (flag_LED==1) { //Условия вывода на LCD
//-------------------------------------------------------------------------
tik_timer_1=(unsigned long)ovf_tik_timer_1*16000+TCNT1;
t1=(float)ovf_tik_int_0/tik_timer_1; f=(float)freq_gen*t1;
//---Начало вывода показаний на экран--------------------------------------
lcd.clear(); //Очистка экрана
lcd.setCursor( 0,0);lcd.print(ovf_tik_int_0); //Вывод на экран количества прерываний
lcd.setCursor( 7,0);lcd.print(tik_timer_1); //Вывод на экран количество тактов
lcd.setCursor( 0,1);
//-------------------------------------------------------------------------
if (f >= 0.0 && f < 10.0) {lcd.print(" ");lcd.print(f,6);lcd.print(" Hz");}
if (f >= 10.0 && f < 100.0) {lcd.print(" " );lcd.print(f,5);lcd.print(" Hz");}
if (f >= 100.0 && f < 1000.0) {lcd.print(" " );lcd.print(f,4);lcd.print(" Hz");}
if (f >= 1000.0 && f < 10000.0) {lcd.print(" " );lcd.print(f,3);lcd.print(" Hz");}
if (f >= 10000.0 && f < 100000.0) {lcd.print(" " );lcd.print(f,2);lcd.print(" Hz");}
if (f >= 100000.0 && f <1000000.0) {lcd.print("" );lcd.print(f,1);lcd.print(" Hz");}
//---Конец вывода показаний на экран---------------------------------------
ovf_tik_timer_1=0;ovf_tik_int_0=0;start_timer_1=1;stop_timer_1=0;
TCCR1B=(1<<CS10)|(1<<WGM12); //Запускаем Таймер 1
flag_LED=0; } } //Сигнал об окончании вывода на индикатор