Me encanta la programación del microcontrolador Arduino, y regularmente lo utilizo en la investigación aeroespacial, así como en proyectos de viviendas. Como trabajo en mi casa muchos proyectos, sin embargo, con frecuencia encuentro yo que necesitan un temporizador muy preciso. Esto es porque mi enfoque de proyectos de viviendas alrededor de aviones de Radio Control (RC), manía del RC comunicación señales y señales de sincronización. Estas señales de comunicación de RC se llaman PWM (Pulse Width Modulation) y PPM (modulación de posición de pulso). En las señales, una desviación de palo completo en una sola dirección, de un transmisor de radio portátil, generalmente corresponde a ~ 1000us (microsegundos), y una desviación de palo completo en la dirección opuesta corresponde a ~ 2000us.
Para medir el tiempo en estas señales, primero utilicé la función micros()de Arduino, en conjunto con interrupciones externas. La función incorporada de micros() de Arduino es bueno, pero no lo suficientemente bueno para mis necesidades. Tiene una precisión de 4 (ver aquí). Esto significa que si estoy leyendo en una señal PWM que conozco es exactamente 1500us (posición centro-stick de un transmisor hand-held), que vería las lecturas de 1496 1504, 1500 e incluso a veces 1492 o 1508us. Esto es demasiada desviación.
So... Miré y miré y busqué una solución. La única solución que pude encontrar utiliza Timer1 del microcontrolador Atmega328, que es inaceptable para mis necesidades, porque entonces pierdo el uso de la biblioteca de servodel Arduino. Por lo tanto, decidí hacer una tonelada de la lectura y bajar a las entrañas del microcontrolador, directo a temporizadores de Atmel y escribir mi propia función de temporizador.
De este esfuerzo nace mi Timer2_Counter "biblioteca", que proporciona funciones que puede usarse en lugar de la función micros(), y que proporcionan una precisión de 0.5us, que es mejor que la función de micros() 8 x!
Para obtener información más detallada en mi código, así como la última versión del código, incluyendo una lista completa de sus funciones, consulte mi artículo aquí:
Función de micros() de Arduino con 0.5us precisión - con mi Timer2_Counter "Biblioteca".