Pregunta:
¿Cuál es la forma más precisa de marcar la hora en los datos de lectura analógica?
Josh de Leeuw
2014-05-29 21:30:13 UTC
view on stackexchange narkive permalink

Quiero muestrear un sensor analógico lo más rápido posible y marcar la hora de cada muestra que tomo con la mayor precisión posible.

Actualmente, estoy haciendo lo siguiente:

  val = analogRead (SENSOR_PIN); clocktime = micros (); writeData (val, clocktime); // escribe los valores en una tarjeta SD  

Me pregunto si hay una forma más precisa de sellar los datos de la llamada analogRead. Dicho de otra manera, me gustaría registrar la hora exacta en que se recopilaron los datos de analogRead. Supongo que esto es básicamente imposible en un Arduino, entonces, ¿qué técnica me permitirá acercarme lo más posible?

Dos respuestas:
#1
+5
BrettAM
2014-05-30 02:48:24 UTC
view on stackexchange narkive permalink

No hay una forma más precisa de obtener tiempo en el arduino, pero le sugiero que use millis () en su lugar.

micros () devuelve microsegundos, o millonésimas de segundo, ya que el arduino fue encendido. El problema es que el entero de 32 bits sin firmar que se usa para almacenar el tiempo en el arduino solo puede contar aproximadamente 70 minutos en micros antes de desbordarse y restablecerse a 0 (consulte http://arduino.cc/en/reference/micros).)

millis () está en milésimas de segundo desde que se encendió el arduino, y no se reiniciará durante aproximadamente 50 días. Si cree que una milésima de segundo es una resolución suficientemente buena, probablemente sea la mejor opción.

Si necesita que el tiempo sea absoluto, como en el día / hora / minuto actual, deberá comprar un reloj de tiempo real para conectarlo al arduino. Cuestan alrededor de 20 dólares y están disponibles en todas las tiendas de accesorios arduino estándar como sparkfun, adafruit, etc.

En su pregunta sobre el orden, ambos comandos se ejecutan tan rápido que no se me ocurre ninguna razón por la que importaría.

gracias por la respuesta. Estoy midiendo eventos muy rápidos que tienen una resolución cercana a los milisegundos y solo necesito ejecutar el programa durante unos minutos a la vez.
#2
+3
JRobert
2014-06-01 18:56:34 UTC
view on stackexchange narkive permalink

Para "lo más rápido posible",

  1. Reescribiría su código de muestreo en lenguaje ensamblador (solo esas dos declaraciones, no todo el programa); y
  2. Almacene los pares de datos sin procesar en la memoria si tiene suficiente, luego guárdelos en la tarjeta después de la explosión de medición. Si necesita más espacio de datos, considere que el tiempo de un ciclo de ensamblaje ajustado será consistente (¡y rápido!) Y puede medirse. Es posible que no necesite leer el reloj en absoluto. Tenga en cuenta que puede obtener la misma consistencia de tiempo usando C / C ++ si lee los puertos analógicos y de reloj directamente, y tal vez tan rápido. Es solo que con el lenguaje ensamblador, WYWIWYG (lo que escribes es lo que obtienes); los generadores de código y optimizadores de los compiladores no lo estropearán.

Un posible problema con su código tal como lo ha escrito es que writeData probablemente almacena los datos en la mayoría de las llamadas, pero cada vez que una llamada da como resultado un búfer completo, escribe todo el búfer en la tarjeta, lo que introduce jitter en su muestreo.

Al abordar su edición del 3 de junio de 2014, "me gustaría registrar la hora exacta en que Se recopilaron datos de analogRead ":

Dado que propuso usar micros () (en lugar de un reloj en tiempo real), supongo que está satisfecho con el tiempo relativo. Una vez que sepa que su código de recopilación de datos es completamente predecible, entonces el desfase entre la lectura de datos y el tiempo de lectura es constante y, dado que estamos usando el tiempo relativo de todos modos, se puede descontar o al menos corregir.

Por supuesto, no es completamente predecible, ya que en este caso, estás usando un reloj mantenido por interrupciones, y puedes esperar que a veces la interrupción ocurra entre la lectura de datos y el reloj leer, estirando el desplazamiento para esa tupla. Para ser aún más preciso, debe mantener las interrupciones apagadas, lea el temporizador usted mismo de manera invariable. Por ejemplo, puede ejecutar el temporizador a una velocidad tal que podría esperar tomar dos o más muestras entre desbordamientos del byte de orden inferior, leer y almacenar solo el byte de orden inferior como muestra de tiempo y procesar posteriormente el tiempo datos para reconstruir el byte de orden superior mediante la detección de envolturas en el orden inferior.

Sin interrupciones en ejecución, y una vez que sepa la velocidad a la que puede muestrear datos sin leer el reloj, puede leer y guarde el reloj una vez inmediatamente antes de tomar la primera muestra, e infiera los tiempos de cada muestra subsiguiente en función de la frecuencia de muestreo conocida.



Esta pregunta y respuesta fue traducida automáticamente del idioma inglés.El contenido original está disponible en stackexchange, a quien agradecemos la licencia cc by-sa 3.0 bajo la que se distribuye.
Loading...