Ошибка определения частоты входного сигнала

Вот мой код для определения частоты входного прямоугольного сигнала на выводе 8 платы Arduino Uno.

const uint16_t freqPin = PB0;
const uint16_t load = 0;
unsigned long int count=0;
unsigned int value=0;

void setup()
{
Serial.begin(9600);
DDRB = 0x00;
TCCR1A = 0;
TCCR1B = TCCR1B & B11111000 | B00000111;
TCNT1 = load;
TIMSK1 |= (1<<ICIE1);
TIMSK1 |= (1<<TOIE1);
sei();
}

void loop()
{
}

ISR(TIMER1_OVF_vect){

  count++;
}
ISR(TIMER1_CAPT_vect){
  value = TCNT1;
  TCNT1 = load;
  Serial.println(count);
  Serial.println(value);
}

Выход

0  
0  
0  
0  
0  

Почему вывод показывает только нули. Почему это происходит? Может кто-нибудь объяснить?
Заранее спасибо.

, 👍-1

Обсуждение

Вам следует добавить что-то, чтобы различать *какой* ISR печатает какой "0". Это может дать некоторые подсказки., @Majenko

Я отредактировал ISR OVF, где команда Serial.print была написана ошибочно., @Peouse Dutta

Насколько я помню, Serial не работает внутри ISR. Я ошибаюсь?, @chrisl

Какой диапазон частот вы надеетесь измерить?, @MichaelT


1 ответ


1

Есть несколько способов измерить частоту входящего сигнала. Вот идеи, основанные на предположении, что это все, что вам нужно, а не на использовании определенных контактов Arduino:

  • Используйте прерывания таймера и digitalRead(8); (или более быстрый (PINB & _BV(0))) для выборки, когда сигнал высокий или низкий. Перенесите данные с Arduino, например, на ПК, затем выполните преобразование Фурье (Matlab, Mathematica, Excel, что вам нравится). Или же вычислите частоту на плате. Таким образом, можно измерять частоты до нескольких десятков кГц с точностью до нескольких Гц.
  • Используйте attachInterrupt() на цифровых контактах 2 или 3. Подсчитайте количество нарастающих фронтов прямоугольной волны в течение заданного периода времени. Вы можете использовать таймер, если вам нужна точность, но этот метод не будет таким же хорошим, как преобразование Фурье.
,