AVR Precisión de la medición de frecuencia

0

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)?

    
pregunta d3L

1 respuesta

1

La actualización de un registro o conjunto de registros dentro de una interrupción antes de cualquier otro procesamiento será extremadamente determinista. No sé por qué eso no puede ser exacto.

De hecho, me atrevo a decir que la precisión puede ser significativamente más alta que la precisión del oscilador RC +/- 10% en un antiguo tipo Atmel como ATMega16. A menos que quiera decir "Tengo un cristal bien afinado con los condensadores de carga adecuados" cuando dice NO circuitos externos.

Puede reclamar registros en Atmel Studio (AVR-GCC) usando las palabras clave, si no me equivoco;

volatile register MyRegister asm("R22"); // to claim R22 with name MyRegister

Pero reclamar registros como ese es un negocio riesgoso, e incluso la sobrecarga de RAM de hacer un global volátil si eso se coloca en la RAM es una sobrecarga estática, que se vuelve, de nuevo, completamente determinista al inicio de ISR.

    
respondido por el Asmyldof

Lea otras preguntas en las etiquetas