Частотомер для измерения низких частот

Нет ответов
Buldakov
Offline
Зарегистрирован: 17.01.2016

Предлагаем вашему вниманию частотомер для измерения низких частот. Диапазон измерения от 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;  } }                               //Сигнал об окончании вывода на индикатор