Necesito medir la frecuencia de conmutación de una salida de colector abierto. La forma de onda tendrá forma cuadrada y el rango de frecuencia se especificará como 0 a 5 kHz. En primer lugar, no quiero contar los pulsos porque también quiero determinar el ciclo de trabajo. Así que aquí viene mi problema:
Para esta tarea, necesito utilizar explícitamente un ATMega16 sin ningún circuito externo (excepto el cristal)
Sé que hay una forma bastante simple de determinar la frecuencia y el ciclo de trabajo, y ya utilicé esta técnica: conecte la señal a una interrupción, combínela con un temporizador asíncrono, ¡haga un poco de matemáticas y listo!
Ahora esto funciona bastante bien con el módulo del temporizador de 16 bits, pero no tan bueno con uno de los temporizadores de 8 bits, ya que se desbordan mucho más rápido.
Ahora siento curiosidad por poder determinar de antemano la precisión de esta técnica, por ejemplo, sin probarlo.
Sé que la lectura de frecuencia dependerá principalmente de la frecuencia de los temporizadores: cuanto más alta, mejor. Un temporizador de 8 bits que se ejecuta a @ 2MHz (precaler 2; desde 16MHz) debería proporcionarme una resolución básica de 0.5us por LSB que se ve bastante bien en el papel. Combinado con un registro de desbordamiento de 16 bits teóricamente podría medir hasta un segundo período de tiempo. Pero sé que esto no funcionará: actualizar el registro de desbordamiento de 16 bits tomaría demasiadas instrucciones en el ISR y efectivamente destruiría mi precisión. Entonces, ¿hay alguna forma de obtener una precisión razonable (+ -5%) de un solo módulo de temporizador de 8 bits en el rango de frecuencia especificado (0 ... 5kHz)?