1

Тема: Частотомер ардуино

На вход D5 подается частота 2 МГц с другой платы ардуино

2 Мгц

http://forum.rcl-radio.ru/uploads/images/2021/05/f7a6354e2353a0ac768b3ff28ee4f322.png


volatile byte x;
unsigned long f;
 
void setup(){
    DDRD  = 0b00000000; // весь порт D как вход
    PORTD = 0b00100000; // подтягивающий резистор на PD5 (вход T1)
    Serial.begin(9600);
 
    cli();  
    TCCR1A = 0;
    TCCR1B = 0;
    TCCR1B &= ~(1 << CS12)|(1 << CS11)|(1 << CS10); //Внешний тактовый источник на выводе T1. Тактирование по фронту
    TIMSK1 |= (1 << TOIE1); // бит TOIE1 в регистре TIMSK1 взывает прерывание когда таймер переполняется
    sei(); 
}
 
void loop(){
  x=0; // обнулить переменную х
  TCNT1 = 0; // обнулить счетный регистр
  TCCR1B |= (1 << CS12)|(1 << CS11)|(1 << CS10); // разрешить прерывания
  delay(993);delayMicroseconds(105); // ждем 1 секунду пока таймер считает импульсы  
  TCCR1B &= ~(1 << CS12)|(1 << CS11)|(1 << CS10); // запретить прерывания
  f = x * 65535 + TCNT1; // подсчет частоты
  Serial.println(f);
  }
 
ISR (TIMER1_OVF_vect){x++;}// при переполнении увеличить переменную х на 1

2

Re: Частотомер ардуино

Доработаем частотомер, для измерения 1 секунды будем использовать таймер 2

Измерение частоты 10 кГц
http://forum.rcl-radio.ru/uploads/images/2021/05/fa4ab3886fe6f6a99461786bb828c070.png

Измерение частоты 2 МГц
http://forum.rcl-radio.ru/uploads/images/2021/05/33bd3a5955ed14b69f5fa5d8bc1f4290.png

volatile byte x;
unsigned long f,times;
int timer2;
float k = 0.989147567; // устраним погрешность кварца

 
void setup(){

    DDRD  = 0b00000000; // весь порт D как вход
    PORTD = 0b00100000; // подтягивающий резистор на PD5 (вход T1)
    Serial.begin(9600);
 
    cli();  
    TCCR1A = 0;
    TCCR1B = 0;
    TCCR1B &= ~(1 << CS12)|(1 << CS11)|(1 << CS10); //Внешний тактовый источник на выводе T1. Тактирование по фронту
    TIMSK1 |= (1 << TOIE1); // бит TOIE1 в регистре TIMSK1 взывает прерывание когда таймер переполняется

  TCCR2A = 0;   
  TCCR2B = 0;   
  OCR2A = 250; // 0.001 s 
  TCCR2A |= (1 << WGM21); 
  TCCR2B |= (1 << CS22);// | (1 << CS20);  // 64  
  TIMSK2 |= (1 << OCIE2A); 
    sei(); 
}
 
void loop(){}
 
ISR (TIMER1_OVF_vect){x++;}// при переполнении увеличить переменную х на 1

ISR(TIMER2_COMPA_vect){
  
     timer2++;
     if(timer2==1){
    // times=millis(); 
     x = 0;TCNT1 = 0; 
     TCCR1B |= (1 << CS12)|(1 << CS11)|(1 << CS10);}
     if(timer2==1001){
   //  times=millis()-times; 
     TCCR1B &= ~(1 << CS12)|(1 << CS11)|(1 << CS10);
     f = ((x*65535) + TCNT1);
     Serial.println((f*k),0);timer2=0;}
}