Creo que este tipo apenas se ajusta a las reglas, pero es lo suficientemente interesante como para pensar que lo publicaría de todos modos.
Generador de marca de tiempo sincronizado por GPS de alta precisión para fines de adquisición de datos.
Este es un proyecto bastante interesante destinado a proporcionar una manera fácil de sincronizar múltiples sistemas independientes de adquisición de datos.
Básicamente, trabajo en un laboratorio de investigación, y a menudo tenemos instrumentos que tienen múltiples sistemas independientes de adquisición de datos, que pueden estar físicamente separados hasta 50 pies. Necesitamos poder correlacionar el tiempo en el que se tomaron muestras de cada sistema, lo que puede ser difícil si desea resolver los tiempos de muestreo con un alto grado de precisión. Usando algo como un sistema de adquisición de datos USB, solo la latencia USB puede introducir varios cientos de milisegundos de latencia desconocida, que puede variar de una adquisición a otra.
La solución anterior era un contador paralelo de 24 bits que simplemente se transportaba por todas partes, que requería un arnés de cableado enorme y que era un poco molesto.
Este sistema utiliza un módulo GPS de temporización especializado que puede sintetizar relojes de frecuencia arbitrarios, que están bloqueados en fase y frecuencia a los relojes atómicos en los satélites GPS.
El MCU es responsable de vincular los mensajes de datos GPS (tuve que extender y optimizar en gran medida un analizador de protocolo existente para los datos GPS). El GPS está configurado para usar un protocolo binario patentado, y todo lo analiza el analizador que escribí.
El proyecto ha pasado por varias revisiones (en la foto a continuación).
Diseño
Revisiones!

Rev 1: Nunca funcionó, debido al hecho de que inicialmente esperaba usar un software dPLL de un GPS mucho menos costoso, para sintetizar un reloj de mayor frecuencia desde solo la salida de 1 PPS. Probablemente sea posible hacerlo funcionar, pero la inversión de tiempo simplemente hizo que no valiera la pena. (y soy un codificador demasiado malo)
Usó una hélice de paralaje MCU. La falta de idiomas compilados decentes también fue un problema importante.

Rev 2: cambiado a un ATmega2560. Trabajó, tenía muchos aspectos de diseño originales heredados de la primera revisión. Principalmente, el uso continuo de registros de desplazamiento para la salida de 32 bits, a pesar del número más que suficiente de IO en el ATmega2560.
La primera placa que ejecutó Optiboot, y en realidad se programó completamente usando la cadena de herramientas estándar Arduino, antes de que me irritara y comenzara a modificar la cadena de herramientas para que se adaptara mejor a mis propósitos.

Rev 3: También funcionó. El cableado estructurado se debe a que esta placa incorpora un concentrador USB incorporado para reducir la cantidad de puertos USB requeridos (la interfaz FTDI requiere 1 USB y el GPS también tiene una interfaz USB). Desafortunadamente, el GPS no se enumeraría correctamente, aunque el dispositivo FTDI funcionó bien, y he usado este concentrador en otro lugar sin problemas. Extraño.
No tengo un depurador USB adecuado, así que simplemente dejé caer el concentrador USB por completo, en lugar de tratar de solucionar el problema. De todos modos, el usb GPS no se usa mucho fuera de la configuración.

Rev 4: versión semifinal ATmega2560. Se agregó una pantalla LCD para el estado del GPS, manipulada con LED, etc. Además, mejores huellas para los posibles supercondensadores para mantener el estado del GPS cuando no está encendido.
Esta es la última versión de Optiboot.
MStimees el MSTOW, o milisegundo de tiempo de la semana, que es el nombre del valor de datos GPS que se emite en la marca de tiempo. Es una variable de 32 bits que se incrementa una vez por milisegundo y se reinicia cada semana. Es una parte más oscura del estándar GPS.
ITOWes otro valor relacionado con GPS, siendo un valor que corresponde a la señal 1PPS. La correlación entre los dos no se refleja adecuadamente en la pantalla LCD, ya que no tengo el tiempo de CPU para actualizar la pantalla LCD a la velocidad que me gustaría. Esta fue en realidad una de las principales cosas que mejoró en la actualización de los dispositivos Xmega.

Rev 5: cambio de arquitectura completa. Ahora usa un procesador ATxmega128A1U. Ya no soy realmente "Arduino", pero la capacidad de tener múltiples niveles de interrupción en la serie de procesadores xmega me permitió mejorar considerablemente la estructura del código.
Los dos cables del cuerpo son de mí haciendo algo de experimentación, el tablero funcionó bien sin ellos también.
Viendo hacia adelante:
Rev 6!

Agregue la capacidad de usar diferentes tamaños de LCD, más protección ESD en la conexión de antena GPS (eso fue un problema), la capacidad de usar una batería CR2032 para mantener el reloj GPS en lugar de los supercondensadores.
Además, un etiquetado mucho mejor de los LED de depuración y estado.

Y bonificación Nyan-Cat!

(Estas placas están en proceso de fabricación en este momento. Cuando las obtenga, agregaré fotos de la placa real).
Hice algunas pruebas de larga duración entre dos de las placas ATmega2560, y durante 72 horas, el error de tiempo RMS entre las dos unidades fue de ~ 20 us. Esto fue con dos antenas completamente independientes también. Mi objetivo de diseño era <1 ms, así que estoy muy feliz con eso.
En general, creo que esto hace un buen trabajo ilustrando cómo Arduino puede ser una herramienta útil para la creación temprana de prototipos de productos / sistemas "reales". Lo uso para obtener una versión de prueba inicial que se ejecuta con un esfuerzo mínimo, y cuando estoy seguro de que la idea funcionará, realizo el trabajo para migrar a una implementación completamente personalizada y específica.
Archivos de diseño:
https://fake-server.no-ip.org/svn/FPGAStuff/DAQ%20systems/
(en la serie de directorios "GPS Timestamp").
(Nota: Los archivos son de Altium Designer El son. No archivos de águila).
Código fuente:
https://fake-server.no-ip.org/svn/Programming/Code/AVR/
Nuevamente, en la serie de directorios "gpsTimeStamp".
Perdón por las malas fotos del celular.