Официальный сайт компании Arduino по адресу arduino.cc
Частотомер для измерения низких частот
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вс, 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; } } //Сигнал об окончании вывода на индикатор