Je pense que ce genre de chose correspond à peine aux règles, mais c'est assez intéressant pour que je pense que je le publierais de toute façon.
Générateur d'horodatage synchronisé par GPS de haute précision à des fins d'acquisition de données.
Il s'agit d'un projet assez intéressant qui est destiné à être utilisé pour fournir un moyen facile de synchroniser plusieurs systèmes d'acquisition de données indépendants.
Fondamentalement, je travaille dans un laboratoire de recherche, et nous avons souvent des instruments qui ont plusieurs systèmes d'acquisition de données indépendants, qui peuvent être physiquement séparés jusqu'à 50 pieds. Nous devons être en mesure de corréler l'heure à laquelle les échantillons de chaque système ont été prélevés, ce qui peut être difficile si vous souhaitez résoudre les temps d'échantillonnage avec un grand degré de précision. En utilisant quelque chose comme un système d'acquisition de données USB, seule la latence USB peut introduire plusieurs centaines de millisecondes de latence inconnue, qui peuvent varier d'une acquisition à l'autre.
La solution précédente était un compteur parallèle 24 bits qui était simplement mis en bus partout, nécessitant un énorme faisceau de câbles, et était une sorte de douleur dans le cul.
Ce système utilise un module GPS de synchronisation spécialisé qui peut synthétiser des horloges de fréquence arbitraires, qui sont verrouillées en phase et en fréquence sur les horloges atomiques des satellites GPS.
Le MCU est chargé de lier les messages de données GPS (j'ai dû étendre et optimiser fortement un analyseur de protocole existant pour les données GPS). Le GPS est configuré pour utiliser un protocole binaire propriétaire, et tout est analysé par l'analyseur que j'ai écrit.
Le projet a subi un certain nombre de révisions (photo ci-dessous).
Conception
Révisions!
Rev 1: n'a jamais fonctionné, car j'espérais initialement utiliser un logiciel dPLL sur un GPS beaucoup moins cher, pour synthétiser une horloge de fréquence plus élevée à partir de la seule sortie 1 PPS. Il est probablement possible de le faire fonctionner, mais l'investissement en temps ne le rendait pas intéressant. (et je suis un codeur trop merdique)
Utilisé une hélice MCU de parallaxe. Le manque de langues compilées décentes était également un problème majeur.
Rev 2: Passé à un ATmega2560. Travaillé, avait beaucoup d'aspects de conception géniaux hérités de la première rév. Principalement, l'utilisation continue de registres à décalage pour la sortie 32 bits, malgré le nombre plus que suffisant d'E / S sur l'ATmega2560.
Première carte qui a exécuté Optiboot et a été en fait entièrement programmée à l'aide de la chaîne d'outils Arduino standard, avant que je ne m'énerve et ne commence à modifier la chaîne d'outils pour mieux l'adapter à mes besoins.
Rev 3: a également fonctionné. Le câblage corsé est dû au fait que cette carte incorporait un concentrateur USB intégré pour réduire le nombre de ports USB requis (l'interface FTDI nécessite 1 USB et le GPS a également une interface USB). Malheureusement, le GPS ne serait pas correctement énuméré, bien que le périphérique FTDI fonctionne correctement, et j'ai utilisé ce hub ailleurs sans problème. Bizarre.
Je n'ai pas de débogueur USB approprié, j'ai donc laissé tomber complètement le concentrateur USB, plutôt que d'essayer de résoudre le problème. De toute façon, l'USB GPS n'est pas vraiment utilisé en dehors de la configuration.
Rev 4: Version semi-finale ATmega2560. Ajout d'un écran LCD pour l'état du GPS, tripoté de LED et ainsi de suite. En outre, de meilleures empreintes pour les super-condensateurs possibles pour maintenir l'état du GPS lorsqu'ils ne sont pas alimentés.
Ceci est la dernière version d'Optiboot.
MStime
est le MSTOW
, ou Millisecond-Time-Of-Week, qui est le nom de la valeur de données GPS qui est sortie sur l'horodatage. Il s'agit d'une variable 32 bits qui s'incrémente une fois par millisecondes et se renouvelle chaque semaine. C'est une partie plus obscure de la norme GPS.
ITOW
est une autre valeur liée au GPS, étant une valeur qui correspond au signal 1PPS. La corrélation entre les deux ne se reflète pas correctement sur l'écran LCD, car je n'ai pas le temps CPU pour mettre à jour l'écran LCD à la vitesse que j'aimerais. C'était en fait l'une des principales améliorations apportées à la mise à niveau des appareils Xmega.
Rev 5: commutateur d'architecture complet. Utilise désormais un processeur ATxmega128A1U. Plus vraiment "Arduino" du tout, mais la possibilité d'avoir plusieurs niveaux d'interruption sur la série de processeurs xmega m'a permis d'améliorer considérablement la structure du code.
Les deux bodge-wire sont de moi en train d'expérimenter, la planche a bien fonctionné sans eux aussi.
Avoir hâte de:
Rév 6!
Ajoutez la possibilité d'utiliser différentes tailles d'écran LCD, plus de protection ESD sur la connexion de l'antenne GPS (qui était un problème), la possibilité d'utiliser une batterie CR2032 pour maintenir l'horloge GPS au lieu des super-condensateurs.
En outre, un meilleur étiquetage des LED de débogage et d'état.
Et en bonus Nyan-Cat!
(Ces cartes sont en cours de fabrication pour le moment. Quand je les obtiendrai, j'ajouterai des photos de la vraie carte.)
J'ai fait des tests de longue durée entre deux des cartes ATmega2560, et sur 72 heures, l'erreur de temps RMS entre les deux unités était de ~ 20 uS. C'était aussi avec deux antennes complètement indépendantes. Mon objectif de conception était <1 ms, donc je suis sacrément satisfait de cela.
Dans l'ensemble, je pense que cela illustre bien comment Arduino peut être un outil utile pour le prototypage précoce de "vrais" produits / systèmes. Je l'utilise pour lancer une version de test initiale avec un minimum d'effort, et quand je suis convaincu que l' idée fonctionnera, je mets en fait le travail pour migrer vers une implémentation entièrement personnalisée et spécifique.
Fichiers de conception:
https://fake-server.no-ip.org/svn/FPGAStuff/DAQ%20systems/
(dans la série de répertoires "GPS Timestamp").
(Remarque: les fichiers proviennent d'Altium Designer. Ce ne sont pas des fichiers Eagle).
Code source:
https://fake-server.no-ip.org/svn/Programming/Code/AVR/
Encore une fois, dans la série de répertoires "gpsTimeStamp".
Désolé pour les photos de téléphone portable de merde.