Привет всем радиоэлектроникам! В данной статье хочу поделиться с вами опытом измерения частоты на микроконтроллере. Хочу сразу сказать, что это не единственный метод измерения частоты. Это мое видение этого процесса, основываясь на своем не большом опыте в программировании микроконтроллеров и радиоэлектронике.
Итак, что мы имеем:
Всего этого хватит нам, чтобы понять принцип действия частотомера на микроконтроллере. Красные светодиоды будем использовать для индикации цифрового значения регистра АЦП. А синий будет моргать с частотой 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");
}
}