Привет всем радиоэлектроникам! В данной статье хочу поделиться с вами опытом измерения частоты на микроконтроллере. Хочу сразу сказать, что это не единственный метод измерения частоты. Это мое видение этого процесса, основываясь на своем не большом опыте в программировании микроконтроллеров и радиоэлектронике.
Итак, что мы имеем:
Всего этого хватит нам, чтобы понять принцип действия частотомера на микроконтроллере. Красные светодиоды будем использовать для индикации цифрового значения регистра АЦП. А синий будет моргать с частотой 1 секунда, за которую у нас происходит подсчет импульсов на входе в микроконтроллер.
Мы будем измерять частоту входного сигнала на входе INT0, полученное значение частоты мы будем записывать в порт С микроконтроллера. Частота, измеренная контроллером у нас будет иметь цифровое значение и иметь тип INTEGER. Частота измеряется один раз в секунду, т.е. за одну секунду мы считаем количество импульсов пришедших на вход INT0. Когда подсчет окончен мы выводим это значение в порт.
Как подключить светодиоды к портам я рисовать не буду, тут ничего сложно. 4 светодиода на порт С и один светодиод на порт B. Также нужно будет подключить провод к выводу INT0. В данном примере на этот вход я ничего не подключал. А контроллер считал наведенные в этом проводе «шумы» - незначительные ЭДС который контроллер воспринимал как изменения состояния на входе INT0.
Как настроить таймер и выдержать интервал в 1 секунду я описал в предыдущих статьях. Для того чтобы настроить МК для работы с внешним прерыванием нам необходимо настроить регистры. Это делается с помощью следующей конструкции:
MCUCR |=(1<<ISC10); GICR |=(1<<INT0);
#include <avr/io.h> #include <avr/interrupt.h> unsigned char count=0; unsigned int int0_count=0; unsigned int freq; ISR (TIMER0_OVF_vect) { count++; if (count==61) { PORTB=~PORTB; freq=int0_count; PORTC=freq; count=0; int0_count=0; } } ISR (INT0_vect) { int0_count++; } int main(void) { // Настраиваем порт С и B на выход DDRC=0xff; DDRB=0xff; // Настраиваем порт вводы INT0 и INT1 на вход DDRD=0b11110011; // Обнуляем порт С PORTC=0x00; //Настройка внешнего прерывания MCUCR |=(1<<ISC10); GICR |=(1<<INT0); //Настройка таймера TCCR0 |=(1<<0)|(1<<1); //Настраиваем предделитель TIMSK |=(1<<TOIE0); // Запускаем таймер //Разрешаем прерывания asm("sei"); while(1) { asm("nop"); } }