Микроконтроллеры

Частотомер на микроконтроллере

Привет всем радиоэлектроникам! В данной статье хочу поделиться с вами опытом измерения частоты на микроконтроллере. Хочу сразу сказать, что это не единственный метод измерения частоты. Это мое видение этого процесса, основываясь на своем не большом опыте в программировании микроконтроллеров и радиоэлектронике.

Итак, что мы имеем:

  • микроконтроллерatmega8;
  • монтажная плата с проводами;
  • программатор USBasp;
  • cветодиоды, 1 синий и 4 красных.

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

Добавить комментарий


Защитный код
Обновить

Последние комментарии

Последнии темы форума

  • Нет сообщений для показа