Estoy tratando de entender cómo configurar una interrupción de desbordamiento en ATmega328 TIMER1 para medir una frecuencia.
Estoy alimentando el pin PD4, que es donde TIMER1 está sincronizado externamente, con una onda cuadrada de 503kHz (4.8Vpp).
Dado que TIMER1 es de 16 bits, asumo que se desbordaría 7 veces por segundo. Mi razonamiento es el siguiente:
$$ number \; of \; overflows = \ frac {f} {TIMER1 \; max \; count} = \ frac {503,000Hz} {65,536} = 7.67 $$
Sin embargo, mi programa cuenta con 988 desbordamientos en su lugar. Eso es 128 veces más de lo que esperaba. ¿Por qué ??
Estoy usando el siguiente código:
volatile unsigned long int running;
ISR(TIMER1_OVF_vect) {
running++;
}
void setup()
{
Serial.begin(9600);
// set up the 16 bit timer as an external frequency counter:
TCCR1B |= (1 << CS10)|(1 << CS11)|(1 << CS12); // External clock, rising edge
TIMSK1 |= (1 << TOIE1); // Enable overflow interrupt
sei(); // enable global interrupts
}
void loop() {
running = 0;
delay(1000); // wait 1000ms
Serial.println(running);
}
A continuación se muestra la señal del reloj externo en el alcance:
Elesquemaqueestoyusandoeselsiguiente.Elinductores220uHenlugarde68uH.