Precisión del reloj de tiempo Arduino

10

Actualmente estoy tratando de crear un reloj de tiempo Arduino usando la biblioteca de tiempo PJRC ( http://www.pjrc.com/teensy/td_libs_Time.html ). Sé que, dado que la mayoría de las placas Arduino funcionan con un reloj de 16MHz y un solo resonador, el tiempo puede quedar "fuera de sincronización" después de un cierto período de tiempo.

Sin embargo, me preguntaba si alguien tiene una idea sobre la precisión de la biblioteca Time cuando se usa en el Arduino DUE con un reloj de 84MHz. Lo he estado probando y hasta ahora, el reloj se ha mantenido sincronizado durante unas horas. ¡Gracias!

KK6FSL
fuente
Las limitaciones de precisión de la biblioteca dependen de la precisión del cristal. Supongamos que tiene un cristal apagado por .5 segundos cada hora, ideal para corto plazo, pero si lo expande más de un año, para ese momento ya no tiene más de 1 hora. Si desea que algo mantenga una hora precisa durante un período prolongado, le sugiero un reloj en tiempo real (todavía tienen imprecisiones), un módulo GPS o una conexión a Internet para sincronizar.
Jesse Laning
@jamolnng Gracias por tu respuesta. ¿Conoces la precisión del cristal en el Arduino DUE o dónde podría encontrarlo?
KK6FSL
La mejor precisión que obtendrá es 84MHz, cuando hacen, o cocinan, el cristal solo pueden hacerlo con cierto grado de precisión, también el entorno del cristal (temperatura, humedad, etc.) juega un papel en el precisión de la misma.
Jesse Laning
@jamolnng Entonces, ¿puedo esperar una mayor precisión con el cristal de 84MHz en lugar del cristal de 16MHz en la mayoría de los otros Arduinos?
KK6FSL
55
"La mejor precisión que obtendrás es 84MHz", ¡eso no tiene mucho sentido para mí!
Cybergibbons

Respuestas:

10

Las limitaciones de precisión de la biblioteca dependen de la precisión del cristal. Cuando hacen, o cocinan, el cristal, solo pueden hacerlo hasta cierto grado exacto, también el entorno del cristal (temperatura, humedad, etc.) juega un papel en la precisión del mismo. Supongamos que tiene un cristal apagado por .5 segundos cada hora, ideal para corto plazo, pero si lo expande más de un año, para ese momento ya no tiene más de 1 hora. Si desea que algo mantenga una hora precisa durante un período prolongado, le sugiero un reloj en tiempo real (todavía tienen imprecisiones), un módulo GPS o una conexión a Internet para sincronizar.

Para obtener más información, consulte el artículo de Wikipedia sobre cristales de cuarzo.

El uso de un cristal de 84MHz versus un cristal de 16MHz no necesariamente mejorará la precisión del reloj Arduino ya que la frecuencia del cristal es más un indicador de la velocidad del procesador que la precisión. La precisión del reloj Arduino depende principalmente de la precisión del oscilador de cristal.

EDITAR: no soy un experto en osciladores de cristal, así que si ves algo mal aquí, házmelo saber

Jesse Laning
fuente
5

Volviendo a visitar una vieja pregunta ... ya que encontré una publicación de blog muy informativa que arroja nueva luz sobre ella. Pero permítanme primero proporcionar un contexto antes de dar el enlace.

Al evaluar la calidad de una base de tiempo, ya sea un cristal, un resonador de cerámica o un estándar de frecuencia de laboratorio, hay dos nociones que deben distinguirse:

  • precisión : cuán cercana es la frecuencia de la base de tiempo a su valor nominal
  • estabilidad : cuánto se desplaza esa frecuencia con el tiempo

La precisión es importante si desea que su reloj dé la hora correcta "fuera de la caja". Sin embargo, si está dispuesto a pasar un tiempo calibrando su reloj, entonces realmente no le importa porque va a calibrar cualquier inexactitud que mida. La respuesta de jfpoilpret proporciona un ejemplo de un protocolo de calibración "manual", que por necesidad es bastante largo. Si puede tomar prestado un módulo GPS con una salida de 1PPS, la calibración podría realizarse en unos segundos.

La estabilidad es un problema más serio. Si la frecuencia de la base de tiempo varía aleatoriamente, esto anulará sus esfuerzos de calibración. Esencialmente, la calibración le dirá qué tan rápido o lento está funcionando su reloj en este momento , pero no le permitirá predecir qué tan rápido o lento funcionará en el futuro .

Aquí está el enlace prometido: precisión de la frecuencia del reloj Arduino , por Joris van Rantwijk.

Lo que hizo Joris fue medir la precisión y la estabilidad de un Arduino Pro Mini (con un resonador de cerámica) y un viejo Duemilianove (cristal de cuarzo). Desde mi perspectiva, las principales conclusiones son:

  • ambos relojes son extremadamente inexactos, por lo que ambos necesitarían calibración del usuario para ser utilizados como relojes
  • El cristal de cuarzo del Duemilianove tiene una estabilidad decente, mejor que 1.5e-8 a las 6 h de tiempo promedio
  • La estabilidad del resonador de cerámica del Pro Mini es patética, más de dos órdenes de magnitud peor que el cristal, lo que lo hace esencialmente inútil como pieza de tiempo.

Aquí está su diagrama de desviación de Allan , que mide la inestabilidad del reloj en función del tiempo de observación:

Allan desviación de la frecuencia del reloj Arduino
(fuente: jorisvr.nl )

Aunque este estudio tiene algunas limitaciones (solo se probaron dos paneles y el tiempo de observación es demasiado corto), está bien pensado y es muy informativo. Te animo a leerlo en su totalidad.

Edgar Bonet
fuente
1
La frecuencia de los cristales de cuarzo cambia ligeramente con la temperatura. Si puede controlar la temperatura, ayuda a mantener estable la frecuencia.
Duncan C
3

La mejor manera de conocer la precisión del resonador de su placa es medirlo usted mismo.

Para hacerlo, puede usar la millis()función Arduino de su pizarra y escribir un pequeño boceto que:

  1. le permite establecer la hora de inicio para medir la deriva del tiempo (por ejemplo, con un simple botón); activará el botón en función de una base de tiempo precisa .
  2. luego llame repetidamente a millis () hasta que hayan transcurrido al menos 120 h ("horas de arduino", que serían unos 5 días)
  3. muestre una señal cuando hayan transcurrido esas 120 h (su boceto probablemente debería "advertirle" antes de que se haya alcanzado la hora exacta para que pueda prepararse para la medición)
  4. cuando hayan transcurrido las 120 h, verifique su tiempo de referencia basado (utilizado en el paso 1) y verifique cuánto tiempo ha transcurrido (debe ser 120 h +/- epsilon)
  5. una vez que sepa la deriva de su reloj, y siempre que su tablero funcione en las mismas condiciones ambientales (temperatura principalmente) de su medida, puede usarlo en sus bocetos para ajustar el millis()valor cada hora más o menos.

Por supuesto, este enfoque está lejos de ser perfecto, ya que requiere intervención humana y, por lo tanto, creará desviaciones de tiempo adicionales durante las mediciones, es por eso que debe medir las desviaciones de tiempo del reloj durante un largo período.

Un enfoque mejorado sería conectar un reloj RTC de alta precisión (la precisión debe elegirse en función de la precisión que necesita para su aplicación) a su placa y adaptar el boceto para que calcule automáticamente la deriva. Una vez que tenga la deriva del tiempo, puede hacer lo mismo que el paso 5 anterior en sus bocetos y desconectar el reloj RTC de su tablero.

Puntos importantes :

  • Mida la deriva del tiempo en el tablero que necesitará un ajuste del reloj más adelante (si tiene varias tablas, debe medir una deriva por tablero)
  • Garantizar la estabilidad del entorno en el que se utilizará su placa

Finalmente, si realmente necesita una alta precisión, definitivamente conecte una fuente de reloj externa (por ejemplo, reloj RTC, GPS, NTP) a su placa y úsela como SyncProvider para la biblioteca PJRC.

jfpoilpret
fuente
2

Su cristal de reloj promedio del sistema estará apagado en varias decenas de ppm (partes por millón. Son excelentes para una sincronización estable y precisa de las señales, pero dramático para mantener la hora exacta. Sin provisiones especiales, el cristal del sistema puede estar apagado por varios segundos por día.

La solución es utilizar un reloj de tiempo real adecuado, impulsado por lo que comúnmente se conoce como un reloj de cristal de 32768Hz. Estos cristales son fácilmente un factor 10 mejor en precisión. Puede configurar su propio oscilador que interrumpe el procesador principal y llevar la cuenta en su boceto Arduino o puede encontrar una placa de conexión RTC.

Dos ejemplos aleatorios que aparecen en Google con los términos de búsqueda "RTC breakout":

jippie
fuente