ESP32-Sensoren ohne GPS über BLE synchronisieren

Ein ESP32-S3 gibt den Takt vor. Mit einem Phasenregelkreis in Software können Sensormodule in der Nähe ihre Messwerte ohne UTC-Referenz auf dieselbe Zeitachse beziehen.

Ein ESP32-S3 sendet Zeitinformationen per Bluetooth an zwei Sensormodule. Beide beziehen ihre Messwerte auf dieselbe Zeitachse.
In diesem Beispiel liefert ein frei laufender ESP32-S3 per Bluetooth Low Energy eine gemeinsame Zeitbasis für Sensormodule in der Nähe.
In diesem Beitrag

Befestige zwei Beschleunigungssensoren an den gegenüberliegenden Enden einer Werkbank und klopfe darauf. Wenn ein Sensor die Erschütterung früher aufzeichnet, ist sie dort wirklich früher angekommen? Oder gehen die Uhren der beiden Boards unterschiedlich?

Für den Vergleich brauchen beide Boards dieselbe Zeitachse. Ein ESP32-S3 kann als Referenz dienen und die verstrichene Zeit ab einem beliebigen Startpunkt vorgeben. Sein Oszillator läuft frei. So funktioniert der Aufbau auch in Innenräumen ohne GPS oder Zeitserver im Netz. Die Gruppe folgt dem Takt dieses Oszillators, auch wenn er gegenüber der Weltzeit UTC abdriftet. Diesen Aufbau verwendet Beispiel 01: Drahtloser SoftPLL über BLE.

Zwei Zeitstempel für dasselbe Funkereignis

Das Referenzboard sendet 16-mal pro Sekunde ein Zeitpaket über Bluetooth Low Energy (BLE). Beide Empfänger hören dieselben Aussendungen. Beim Empfang eines Originalpakets speichert jeder einen lokalen Zeitstempel aus dem Controller. Ein späteres Paket enthält die geschätzte Sendezeit des Originals auf der Referenzuhr. Der Empfänger ordnet die beiden Angaben anhand der Paketnummer, des Funkereigniszählers und des Kanals innerhalb derselben Quellsitzung einander zu. So erhält er zwei Zeitwerte für das frühere Ereignis.

Das Folgepaket beschreibt ein früheres Paket Beim Originalpaket erfasst der Empfänger seinen lokalen Zählerstand. Ein späteres Paket liefert die geschätzte Sendezeit des Originals auf der Referenzuhr. Der Empfänger ordnet diese Schätzung dem früher erfassten Zählerstand zu. Referenz Empfänger Original Folgepaket BLE-Funkpakete Dem ersten Empfang zuordnen
Beim Originalpaket hält der Empfänger den lokalen Zählerstand fest. Das Folgepaket liefert die dazugehörige geschätzte Referenzzeit.

Entscheidend ist der Zeitpunkt des Funkereignisses. Wenn die Anwendung ihren Callback ausführt, ist das Paket bereits angekommen. Andere Aufgaben können den Aufruf zusätzlich verzögern. Das Beispiel liest den Empfangszeitstempel des Controllers in Schritten von 500 ns. Für das Senden schätzt es den Zeitpunkt anhand des Sendeplans im Controller. Verzögerungen im Funkpfad können das Wertepaar systematisch verschieben, selbst wenn die Zeitstempel wenig streuen. Der Zeitstempeladapter ist auf den ESP32-S3 und die im Repository festgelegte ESP-IDF-Version zugeschnitten. Zeitstempeladapter für den ESP32-S3 · Ereigniszuordnung und Sitzungsregeln

Den Gang bestimmen und die Zeitabweichung ausgleichen

Stell dir vor, die beiden Empfängeruhren zeigen am Anfang dieselbe Zeit an. Geht eine um 20 ppm vor und die andere um 15 ppm nach, liegen ihre unkorrigierten Anzeigen nach zehn Sekunden 350 Mikrosekunden auseinander. Je länger die Zeitspanne, desto stärker wirkt sich dieser Gangunterschied aus.

Ein Phasenregelkreis in Software, kurz SoftPLL, schätzt anhand der jeweils jüngsten Zeitstempelpaare, wie viel Zeit einem lokalen Zähltakt entspricht. Wächst der Vorsprung stetig, läuft die Uhr zu schnell. Die Differenz zwischen der aktuellen Anzeige und der geschätzten Referenzzeit ist der Phasenfehler, den der Regelkreis ausgleichen soll.

Zeitstempelpaare zeigen den Gangfehler Die beispielhaften Beobachtungen streuen um eine ansteigende Ausgleichsgerade oberhalb der Nulllinie. Die Steigung zeigt, wie schnell die Uhr vorläuft. Der senkrechte Abstand zur Nulllinie entspricht dem geschätzten Phasenfehler zum gewählten Zeitpunkt. Zeitabweichung Vergangene Zeit Gangfehler Phasen- fehler 0
Beispielhafte Zeitstempelpaare. Die Steigung zeigt, wie schnell die Abweichung wächst. Der Abstand zur Nulllinie zeigt, wie weit die Uhr zu diesem Zeitpunkt vorgeht.

Aus den Zeitstempelpaaren schätzt der Regelkreis den Gang der Uhr. Dann aktualisiert er die Softwareuhr und gleicht die verbleibende Zeitabweichung aus, indem er die Anzeige kurzzeitig schneller oder langsamer laufen lässt. Das ist dieselbe gleitende Korrektur wie in Teil 1, diesmal anhand von Beobachtungen. Die Uhr läuft weiter, und der Quarz schwingt in seinem eigenen Takt. Eine einfache Uhr auf dem ESP32 bauen · SoftPLL-Implementierung

Messwerte auf eine gemeinsame Zeitachse bringen

Wenn ein Sensor ein Ereignis aufzeichnet, erfasse den lokalen Zählerstand so nah am Abtastzeitpunkt, wie es die Hardware erlaubt. Rechne den Zählerstand mit der gerade gültigen Softwareuhr in die gemeinsame Zeit um und speichere sie beim Messwert. Jedes Board verwendet seine eigene Umrechnung. Jetzt kannst du beide Schwingungsverläufe auf derselben Zeitachse vergleichen, selbst wenn die Daten in umgekehrter Reihenfolge am Laptop eintreffen.

Zwei lokale Zählerstände ergeben vergleichbare Messzeitpunkte Sensor A erfasst den Zählerstand 48.000.000 und rechnet ihn in 2,4000 Sekunden um. Sensor B erfasst 93.006.000 und erhält 2,4003 Sekunden. Beide Werte liegen auf der Zeitachse der Referenz. Sensor A Sensor B Zähler: 48.000.000 Zähler: 93.006.000 2,4000 s 2,4003 s Gemeinsame Zeitachse
Beispielwerte auf einem vergrößerten Ausschnitt der Zeitachse. Nach der Umrechnung liegen die erfassten Ereignisse 300 µs auseinander.

Der Vergleich hängt weiterhin davon ab, wann die Sensoren tatsächlich abtasten und wie genau du diesen Zeitpunkt erfasst. Beide Sensoren gleichzeitig abtasten zu lassen, ist eine eigene Aufgabe. Um die Gleichzeitigkeit zu prüfen, miss die Flanken der Abtastsignale mit einem gemeinsamen Messgerät. Die Uhren werden dabei weiterhin über BLE geregelt.

Wann die Uhr bereit ist

Bevor der Empfänger ein Folgepaket zur Korrektur nutzt, vergleicht er dessen Referenzzeit mit der Vorhersage, die er beim ursprünglichen Ereignis gespeichert hat. Für die Anzeige LOOP LOCK braucht der Regelkreis genügend Vorhersagen mit kleinen Abweichungen, eine belastbare Schätzung des Uhrengangs und einen kleinen verbleibenden Phasenfehler. Die Anzeige beschreibt, wie eng die Softwareuhr ihren BLE-Beobachtungen folgt. Eine feste Verzögerung in diesen Beobachtungen kann die Uhrzeit weiterhin verschieben.

Bleiben brauchbare Paare aus, liefert die Uhr ab 500 ms nach dem Empfang des letzten verwendbaren Originalpakets keine gültige Zeit mehr. Bei einer neuen Quellsitzung muss der Regelkreis den Gang erneut bestimmen. Speichere den rohen Zählerstand und die Quellsitzung zusammen mit deinen Daten. So erkennst du beim späteren Vergleich der Kurven auch Lücken und Neustarts. Lock-Prüfung und Ablauf im Code

Ohne angeschlossene Boards ausprobieren

Starte die Übung am Computer. Sie nutzt denselben Regelkreis wie die Firmware, mit einer simulierten Referenz und zwei Empfängern, die um +20 beziehungsweise −15 ppm abweichen. Überlege zuerst, welches Vorzeichen die beiden Gangkorrekturen haben sollten, und prüfe dann die Ausgabe. Lass anschließend einen Empfänger mehr Pakete verpassen und beobachte, wie viele Ereignisse du noch vergleichen kannst. Die Ausgabe zählt fehlende Gelegenheiten zum Vergleich und zeigt die zeitliche Streuung. Beispiel 01 starten · Simulation ändern