¿Cómo sincronizar dos microcontroladores con una precisión de microsegundos?

Necesito sincronizar dos microcontroladores para que puedan medir la velocidad de propagación de las ondas. Las mediciones de retardo de tiempo deben tener una precisión de microsegundos (error inferior a 1/2 microsegundo).

Tengo dos microcontroladores ( ATmega328 ) que usan un cristal de 12MHz.

Ambos están equipados con transceptores Bluetooth. Los transceptores Bluetooth envían y reciben paquetes con una fluctuación de ~15 milisegundos.

Espero sincronizar los microcontroladores usando los transceptores Bluetooth o algún otro método creativo.

Intenté sincronizarlos tocándolos, pero necesito que permanezcan sincronizados durante unos 10 minutos y sus relojes se adelantaron demasiado. Tal vez si fuera posible predecir con precisión la desviación del reloj, este método funcionaría.

¿Cómo debo hacer para lograr esta sincronización?

¿Podría decirnos qué está tratando de hacer y por qué las unidades deben sincronizarse? Puede ser, los detalles de su aplicación pueden señalar una solución. Como problema general, este no es muy fácil, especialmente para pequeños dispositivos inalámbricos.
Es imposible lograr la sincronización confiando en el Bluetooth. La fluctuación de fase de 15 ms es demasiado para obtener una sincronización de 0,5 us. Necesita algo con fluctuaciones muy bajas y latencia fija que pueda corregirse. Sería más fácil si pudiera obtener un solo reloj para ambos y amortiguar el reloj para equilibrar los retrasos.
Lo siento por el retraso. El objetivo del proyecto es eliminar los cables de un diseño existente de herramientas de medición digitales portátiles. Los usuarios querían un diseño inalámbrico, ya que estaban dañando los cables actuales. Las unidades están midiendo la propagación de ondas en árboles en pie, que son lo suficientemente rápidos como para necesitar una sincronización de 0.5us entre ambos sensores.
Cheap-o wireless: Infrarrojos. Un pulso IR podría ser suficiente para volver a sincronizar los relojes cuando se hayan desviado un poco.
Este artículo propone un sistema Bluetooth 4.0 con sincronización de ~10uS, con prueba experimental.
@Kevin: En ninguna parte de su pregunta mencionó que la sincronización debe ser inalámbrica ... solo más adelante en su comentario. ¡Esta es información importante! ¿Esperas que los lectores lean tu mente?
Bluetooth = juguetes. Probablemente no pueda usarlo para ninguna forma de rendimiento en tiempo real, y mucho menos para una precisión de microsegundos.

Respuestas (4)

No pretendo llover sobre tu desfile inalámbrico. Te has topado con un requisito difícil pero inesperado. Algo así justifica la reevaluación de todo el diseño del sistema.

Lo primero que me viene a la mente es sincronizar ambas unidades con un oscilador. Tiene comunicación Bluetooth, lo que da a entender que el alcance es del orden de los 10m. Podrías conectar tus unidades con cable coaxial RG174 o una fibra óptica, que llevaría el reloj.

En segundo lugar, hay osciladores de precisión. En orden creciente de precisión y costo.

  • TCXO (oscilador de cristal con compensación de temperatura). Deriva de 1 a 3 ppm, típicamente.
  • OCXO (oscilador de cristal controlado por horno). Deriva del orden de 0,02 ppm. Algunos OCXO han bajado a 0,0001 ppm.
  • Reloj atómico ( estándar de rubidio , por ejemplo). Menciono el reloj atómico principalmente para dar un marco de referencia. Más sobre eso aquí .

, oscilador de precisión entrenado con GPS. Cada satélite GPS tiene varios relojes atómicos a bordo. Por lo general, hay muchos satélites GPS a la vista. El GPS se utiliza mucho para la sincronización de precisión (uso menos conocido en comparación con la navegación por satélite). La mayoría de los receptores GPS tienen una salida de 1PPS (un pulso por segundo), lo que proporciona una precisión de tiempo de 50 ns.
Para tener una desviación de 0,5 μs durante 600 s (10 minutos), su reloj (el reloj de 12 MHz en su diseño actual) debe tener una desviación inferior a 0,0008 ppm. Pero si puede corregir el error de tiempo de vez en cuando desde una fuente externa de baja deriva, el requisito de la deriva en el reloj puede ser más flexible. Si puede corregir cada segundo, su reloj podría tener una desviación de 0,5 ppm.

Una vez trabajé en un proyecto en el que teníamos que obtener este tipo de precisión en servidores que se ejecutan en centros de datos de todo el mundo. Allí la forma más fácil era usar GPS. Resultó que no todas las máquinas/centros de datos podían acceder al GPS, por lo que nuestra solución al final fue todo un desafío. Hacer esto con microcontroladores va a ser aún más difícil.
+1 para "justifica la reevaluación de todo el diseño del sistema".
Dependiendo de su presupuesto, puede comprar unidades de GPS que emiten una frecuencia programable (0-10 Mhz) que está alineada en fase con la señal de GPS por ~$150 c/u. Mira el uBlox LEA-6T. Afirman una salida de pulso de tiempo de error RMS de 30 nS, 99% <60 nS.

Los módulos GPS con salidas de 1 pps están fácilmente disponibles y son económicos.

No es realmente necesario disciplinar el oscilador de la CPU al GPS (por ejemplo, con un PLL). Siempre que pueda "marcar la hora" de los eventos externos en relación con el reloj de la CPU, es relativamente sencillo interpolar el tiempo de su transmisión de ondas y recibir eventos entre dos eventos PPS cualesquiera.

A menudo, puede usar la combinación de un temporizador de hardware en el microcontrolador, junto con un contador de software para sus eventos de desbordamiento, para crear un contador de ciclos de CPU de ancho arbitrario. Puede ser complicado manejar correctamente los eventos de rollover, tanto del contador de hardware como del contador de software, pero al final, puede tener, digamos, un contador de 32 bits que cuenta a la velocidad del reloj de la CPU (dando alta resolución). ) y cambia con un período más largo que los intervalos que intenta medir (por ejemplo, 429 segundos a 10 MHz).

Puede usar este contador para marcar la hora de diferentes eventos externos. Si uno de esos eventos son pulsos de 1 pps de un receptor GPS, entonces la precisión básica a largo plazo del reloj de la CPU se convierte en un problema. Lo único que importa es su estabilidad a corto plazo. Puede guardar marcas de tiempo GPS en un búfer FIFO y comparar las marcas de tiempo de otros eventos con los valores en ese búfer. Como sabe que los pulsos del GPS están separados exactamente por un segundo, puede encontrar la hora exacta de cualquier otro evento mediante la interpolación.

Suponer GRAMO PAG S norte y GRAMO PAG S norte + 1 son las marcas de tiempo del reloj de la CPU para dos pulsos de GPS sucesivos. También conoce los tiempos reales (reloj atómico) asociados con cada uno de esos pulsos (de los mensajes GPS), T i metro mi norte y T i metro mi norte + 1 . Si mi X t es la marca de tiempo del reloj de la CPU para algún evento externo que desea medir que se encuentra entre GRAMO PAG S norte y GRAMO PAG S norte + 1 , su hora exacta es:

T i metro mi norte + mi X t GRAMO PAG S norte GRAMO PAG S norte + 1 GRAMO PAG S norte

Finalmente, si tiene esta configuración ejecutándose en dos sistemas separados, cada uno con su propio receptor GPS, puede comparar los tiempos calculados para varios eventos en los dos sistemas con alta precisión (normalmente del orden de ±100 ns), incluso si el Los relojes de la CPU de los dos sistemas no están sincronizados.

¿Podría ser un poco más explícito acerca de cómo funcionaría esto? Tengo problemas para entender la explicación actual.
@NickHalden: Bien, listo.
Hmmm ok, ¿no depende esto de que la frecuencia del reloj de la CPU sea constante entre los dos pulsos de 1 segundo? Por ejemplo, tome un circuito de oscilador de cristal particularmente horrible donde el 99% de los pulsos ocurren entre 0,00 y 0,05 segundos, y luego el 1% final ocurre entre 0,05 y 1,00 s. ¿Ese ejemplo construido patológicamente no arruinaría esto o todavía me estoy perdiendo algo?
Sí, eso es lo que significa "estabilidad a corto plazo".
Oh, vaya, ¿eso estaba ahí cuando comenté? Jaja eso es vergonzoso. De todos modos, gracias por la explicación +1 de mi parte.

He implementado una sincronización de reloj inalámbrica para microcontroladores antes, pero solo con una precisión de milisegundos, lo cual fue lo suficientemente bueno para la aplicación. Según mi lectura, este documento explica bastante bien la sincronización de microsegundos: http://www.math.u-szeged.hu/tagok/mmaroti/okt/2010t/ftsp.pdf

Esencialmente, si tiene conocimiento del evento de transmisión y el evento de llegada de un paquete de radio en el transmisor y el receptor respectivamente, tiene un evento observable común (asumiendo que ignora el tiempo de propagación de la onda de radio) entre los 2 sistemas que pueden ser utilizado como referencia. La otra característica interesante mencionada en el documento es la estimación de sesgo horario mediante regresión lineal.

La precisión de 1,5 µs en el escenario de un solo salto y la precisión promedio de 0,5 µs por salto en el caso de varios saltos se demostraron proporcionando resultados experimentales. Bonito.

Consulte el Protocolo de sincronización de reloj Bluetooth (CSP), que es una parte opcional del Perfil de dispositivo de salud (HDP). Las secciones de ese documento que son relevantes para CSP son 2.1 y 8.

Todavía no he tenido la oportunidad de probarlo yo mismo, pero, por lo que sé, BlueZ (la pila oficial de protocolos Bluetooth de Linux) acaba de agregar soporte para HDP , incluido el soporte para CSP. Entonces, aunque no parezca que se ejecutará en una plataforma compatible con la pila BlueZ, tal vez el código al menos proporcione una buena implementación de referencia.