La documentación de micros () señala que el valor de retorno siempre será un múltiplo de 4.
¿Hay alguna forma de obtener un clic de microsegundos de mayor resolución, preferiblemente hasta el nivel de 1 microsegundo?
Bajar al nivel AVR es aceptable.
Respuestas:
Sí, dependiendo de la frecuencia de reloj básica de su Arduino. Por ejemplo, aquí están las frecuencias de entrada del contador de tiempo y los períodos después del preescalado, para un contador de tiempo ATMega2560 2, y una frecuencia de reloj básica de 16MHz. El temporizador ha incorporado opciones de valor "preescaler" que determinan la frecuencia / período, que se muestran en esta tabla:
Para una mejor resolución de tiempo, utiliza un valor llamado TCNT2. Hay un contador de compilación que va de 0 a 255 porque el temporizador es de 8 bits. Cuando el contador alcanza el valor asignado por TCNT2, desencadena una interrupción. Esta interrupción se llama TIMER2_OVF_vect.
dada esta información, la tasa de interrupción resultante sería: 16MHz / (preescaler * (255 - TCNT2))
Podría hacer que el temporizador funcione a 16MHz (62.5nSec), aunque eso es mucho más rápido de lo que necesita; 2MHz con un conteo inicial de (255-2) le daría una tasa de interrupción de 1MHz. Divide eso entre 2 en tu ISR:
La hoja de datos para su MCU es el recurso básico; Este artículo le dará (¡y me dio a mí!) una buena ventaja.
fuente
Mark, decidí escribir un nuevo conjunto de funciones, basado en el Arduino Atmega328 Timer2, y usando interrupciones de desbordamiento, para obtener precisión de 0.5us. Mi código está disponible para descargar y usar aquí:
http://electricrcaircraftguy.blogspot.com/2014/02/Timer2Counter-more-precise-Arduino-micros-function.html
Aquí hay una breve descripción: "Escribí una" biblioteca "para obtener una precisión de 0.5us en una función de reemplazo" micros () ", para que pueda obtener resultados repetibles leyendo una señal PWM o PPM, dentro de 1us. Busqué por todos lados Internet y no podía encontrar algo comparable (o que era fácil de usar, y mantenía la capacidad del Arduino de escribir señales PWM a través de la Servo Libary), por lo que creo que esta es mi primera gran contribución al mundo de Arduino y Radio Control ".
fuente
Si es aceptable bajar al nivel AVR (como mencionó en su pregunta), puede configurar un temporizador e incluso obtener los tics del reloj del AVR.
Debe consultar la hoja de datos de su AVR porque difiere entre los diferentes ATMegas y ATTinys. Pero el procedimiento es siempre el mismo. Lo que debes hacer es:
TCCR
De esa manera puede obtener los ticks exactos del registro del temporizador, sin embargo, debe contar los desbordamientos manualmente. Esto es lo más preciso posible por la tecnología.
Aquí hay un código de ejemplo para el AT90S2313 obsoleto, pero le da buenos consejos sobre qué hacer básicamente:
fuente
TIMSK
,TOIE0
etc. (copie la configuración del temporizador de la hoja de datos atmega328p). Parece que no puede usar la macro ISR (), en su lugar use arduino.cc/en/Reference/AttachInterrupt .