Ich muss zwei Mikrocontroller synchronisieren, damit sie die Geschwindigkeit der sich ausbreitenden Wellen messen können. Die Zeitverzögerungsmessungen müssen eine Genauigkeit von Mikrosekunden aufweisen (Fehler von weniger als einer halben Mikrosekunde).
Ich habe zwei Mikrocontroller ( ATmega328 ), die einen 12-MHz-Quarz verwenden.
Sie sind beide mit Bluetooth-Transceivern ausgestattet. Die Bluetooth-Transceiver senden und empfangen Pakete mit einem Jitter von ~ 15 Millisekunden.
Ich hoffe, die Mikrocontroller mithilfe der Bluetooth-Transceiver oder einer anderen kreativen Methode zu synchronisieren.
Ich habe versucht, sie zu synchronisieren, indem ich sie zusammen berührte, aber ich brauche sie, um ungefähr 10 Minuten synchron zu bleiben, und ihre Uhren gingen zu schnell. Wenn es möglich wäre, die Zeitverschiebung genau vorherzusagen, würde diese Methode möglicherweise funktionieren.
Wie soll ich vorgehen, um diese Synchronisierung zu erreichen?
Antworten:
Ich will nicht auf Ihrer drahtlosen Parade regnen. Sie sind auf eine harte, aber unerwartete Anforderung gestoßen. So etwas erfordert eine Neubewertung des gesamten Systemdesigns.
Das erste, was mir einfällt, ist, beide Einheiten von einem Oszillator zu takten. Sie haben eine Bluetooth-Verbindung, was darauf hindeutet, dass die Reichweite in der Größenordnung von 10 m liegt. Sie könnten Ihre Geräte mit einem RG174-Koaxialkabel oder einem Lichtwellenleiter verbinden, der die Uhr tragen würde.
Zweitens gibt es Präzisionsoszillatoren. In der Reihenfolge steigender Präzision und Kosten.
3. Präzisionsoszillator, trainiert mit GPS. Jeder GPS-Satellit hat mehrere Atomuhren an Bord. Normalerweise sind viele GPS-Satelliten im Blick. GPS wird häufig für präzises Timing verwendet (weniger bekannte Verwendung im Vergleich zu Navigationsgeräten). Die meisten GPS-Empfänger haben einen 1PPS-Ausgang (ein Impuls pro Sekunde), der eine Zeitgenauigkeit von 50 ns liefert.
Um eine Drift von 0,5 μs über 600 s (10 min) zu erreichen, sollte Ihre Uhr (die 12-MHz-Uhr in Ihrem derzeitigen Design) eine Drift von weniger als 0,0008 ppm aufweisen. Wenn Sie den Timing-Fehler jedoch von Zeit zu Zeit von einer externen Quelle mit geringer Drift korrigieren können, kann die Anforderung an die Drift in der Uhr gelockerter sein. Wenn Sie jede Sekunde korrigieren können, kann Ihre Uhr eine Abweichung von 0,5 ppm aufweisen.
quelle
GPS-Module mit 1pps-Ausgängen sind leicht verfügbar und kostengünstig.
Es ist nicht wirklich notwendig, den Oszillator der CPU auf das GPS zu disziplinieren (z. B. mit einer PLL). Solange Sie externe Ereignisse in Bezug auf die CPU-Uhr mit einem Zeitstempel versehen können, ist es relativ einfach, die Zeit für das Senden und Empfangen von Wave-Ereignissen zwischen zwei PPS-Ereignissen zu interpolieren.
Sie können häufig die Kombination eines Hardware-Timers auf dem Mikrocontroller zusammen mit einem Software-Zähler für seine Überlaufereignisse verwenden, um einen CPU-Zykluszähler beliebiger Breite zu erstellen. Es kann schwierig sein, mit Rollover-Ereignissen sowohl des Hardware-Zählers als auch des Software-Zählers richtig umzugehen, aber am Ende können Sie beispielsweise einen 32-Bit-Zähler haben, der mit der Taktrate der CPU zählt (was eine hohe Auflösung ergibt) ) und läuft mit einer Zeitspanne weiter, die länger ist als die Intervalle, die Sie messen möchten (z. B. 429 Sekunden bei 10 MHz).
Mit diesem Zähler können Sie verschiedene externe Ereignisse mit einem Zeitstempel versehen. Wenn eines dieser Ereignisse 1-pps-Impulse von einem GPS-Empfänger sind, ist die grundlegende Langzeitgenauigkeit der CPU-Uhr unerheblich. Entscheidend ist nur die kurzfristige Stabilität. Sie können GPS-Zeitstempel in einem FIFO-Puffer speichern und die Zeitstempel anderer Ereignisse mit den Werten in diesem Puffer vergleichen. Da Sie wissen, dass die GPS-Impulse genau eine Sekunde voneinander entfernt sind, können Sie die genaue Uhrzeit jedes anderen Ereignisses durch Interpolation ermitteln.
Wenn Sie dieses Setup auf zwei separaten Systemen mit jeweils eigenem GPS-Empfänger ausführen, können Sie die für verschiedene Ereignisse auf den beiden Systemen berechneten Zeiten mit hoher Genauigkeit vergleichen (in der Regel in der Größenordnung von ± 100 ns), auch wenn die CPU-Takte der beiden Systeme sind nicht synchronisiert.
quelle
Ich habe zuvor eine drahtlose Uhrensynchronisation für Mikrocontroller implementiert, allerdings nur mit einer Genauigkeit von Millisekunden, die für die Anwendung gut genug war. Nach meiner Lektüre erklärt dieses Papier die Mikrosekunden-Synchronisation recht gut: http://www.math.u-szeged.hu/tagok/mmaroti/okt/2010t/ftsp.pdf
Wenn Sie das Sendeereignis und das Ankunftsereignis eines Funkpakets auf dem Sender bzw. Empfänger kennen, haben Sie im Wesentlichen ein gemeinsames beobachtbares Ereignis (vorausgesetzt, Sie ignorieren die Ausbreitungszeit der Funkwelle) zwischen den beiden möglichen Systemen als Referenz verwendet. Das andere nette Merkmal, das in der Veröffentlichung erwähnt wird, ist die Schätzung des Zeitversatzes unter Verwendung einer linearen Regression.
quelle
Lesen Sie das Bluetooth Clock Synchronization Protocol (CSP), das ein optionaler Bestandteil des Health Device Profile (HDP) ist. Die für CSP relevanten Abschnitte in diesem Dokument sind 2.1 und 8.
Ich hatte noch keine Gelegenheit, es selbst zu versuchen, aber so weit ich weiß, hat BlueZ (der offizielle Linux Bluetooth-Protokollstack) gerade die Unterstützung für HDP hinzugefügt , einschließlich der Unterstützung für CSP. Obwohl es sich nicht so anhört, als würden Sie auf einer Plattform laufen, die den BlueZ-Stack unterstützt, bietet der Code möglicherweise zumindest eine gute Referenzimplementierung.
quelle