Zählen Sie die Zyklen von der Oszillatoruhr, um die Zeit zu erhalten

zum ersten Mal auf Stackexchange, hoffe ich bin hier richtig. Ich arbeite an einem Projekt, bei dem ich ein Ereignis (das von einem elektrischen Impuls erkannt wird) auf wenige zehn Nanosekunden zeitstempeln und mit GPS synchronisieren muss (weil es einige dieser Module geben wird, die miteinander synchronisiert werden müssen). ). Ich habe nach einer einfachen Arduino/Himbeer-Lösung gesucht, aber es scheint, dass sie nicht besser als 1-2 us ist, weit entfernt von ~30 ns.

Ich dachte daran, den 1PPS-Ausgang (1Hz) des GPS zu verwenden, um eine sehr genaue Zeit zu erhalten und dann das Zeitintervall zwischen diesem Impuls und dem Impuls des Sensors zu finden, indem ich die Zyklen einer externen, hochpräzisen Uhr zähle. Ich habe eine Uhr gefunden, die mich unter 30 ns Ungenauigkeit über die 1 s PPS (40 MHz, 10 ppb, 1 ps Jitter) bringt.

Das Problem ist nun, wie ich diese Taktzyklen zählen kann. Meine Erfahrung zu diesem Thema ist sehr nahe bei 0 und die meines Teamkollegen auch. Jede Hilfe wird sehr geschätzt.

BEARBEITEN: Es scheint, dass dies für jemanden, der nur Erfahrung mit Mikrocontrollern hat, sehr kompliziert ist, indem er Daten seriell sendet. Das perfekte Produkt für meine Anwendung wäre so etwas: http://www.ti.com/product/TDC7201/description Verbinden Sie einfach die beiden Impulse mit den START- und STOP-Pins und es gibt das Zeitintervall zurück. Der einzige Unterschied besteht darin, dass ich eine 1-s-Messung (gegenüber 8 ms) benötigen würde, jedoch mit einer Genauigkeit von 10-50 ns (gegenüber 50 ps). Grundsätzlich 1000x längere Messung mit 1000x weniger Genauigkeit.

Ein ATmega328 (der Mikrocontroller in einem Arduino Uno) kann Ereignisse mit einer Auflösung von bis zu 62,5 ns messen, nicht "1 oder 2 Mikrosekunden".
Ich denke, Sie möchten Ihren Prozessor mit dem 40-MHz-Takt betreiben und einen internen Timer verwenden, um das Intervall zu messen. Das 1PPS-Signal ist möglicherweise nicht genau, wenn das GPS nicht mit Satelliten synchronisiert ist. Außerdem kann das 1-pps-Signal eine langsame Anstiegs- oder Abfallzeit haben, und dies könnte zu einer gewissen Zeitunsicherheit führen, wenn Ihre Schaltspannungsschwelle nicht sehr stabil ist. Wenn ich mich richtig erinnere, ist der 1pps langfristig stabil, kann aber Zyklus-zu-Zyklus-Jitter haben. Die ideale Lösung könnte also eine Art digitale PLL sein.
Das GPS hat Jitter (11 ns für das, was ich im Sinn habe). Das GPS ist ein Muss, da wir 5 synchronisierte Module benötigen, die etwa 10 km voneinander entfernt sind. Können Sie näher darauf eingehen, "Ihren Prozessor mit dem 40-MHz-Takt zu betreiben und einen internen Timer zum Messen des Intervalls zu verwenden"? Ich habe über die 62,5-ns-Auflösung von ATmega gelesen, indem ich CPU-Zyklen gezählt habe, aber ich habe es nicht geschafft, herauszufinden, wie man sie zählt. Selbst dann hat die integrierte Uhr nicht die erforderliche Präzision (wird viel mehr als 30 ns über 1 s verlieren/vorrücken).
@jms, OP bedeutet 30 ns absoluter Fehler über ein Zeitintervall von 1 s. Die Junky-Arduino-Uhr hat wahrscheinlich 50 ppm, was zu einem 50us-Fehler führt.
Zuerst möchten Sie einen "GPS-disziplinierten Oszillator", es sei denn, Sie versuchen, dies in Software zu emulieren, indem Sie Korrekturen aus der Anzahl der Uhren anwenden, die Sie pro GPS-Hz gemessen haben. Ihre Anforderungen an die zeitliche Auflösung können typische MCU-Zähler/Timer-Peripherie-Taktgrenzen belasten – sowohl weil hohe interne Takte intern von einem niedrigeren Eingang multipliziert werden, als auch weil die Peripheriegeräte oft nicht mit der vollen Rate laufen können. Aber schauen Sie sich verschiedene moderne ARM Cortex M4-Teile an, um eine Vorstellung davon zu bekommen, was einfach wäre. Um schneller zu werden, könnten Sie ein FPGA für die Zeitstempelung und die MCU zum Berichten in Betracht ziehen.
Was ich meine ist, wenn der Prozessor von einem hochgenauen Oszillator wie Ihrem 40-MHz-Takt läuft, haben die anderen Takte im Prozessor die gleiche Genauigkeit, auch wenn die Frequenz aufgrund von PLLs und Auf- / Abwärtswandlung unterschiedlich ist Teiler/Multiplikatoren usw. Viele Prozessoren haben eingebaute Zeiterfassungsfunktionen, bei denen ein bestimmtes Ereignis den Timer startet und ein anderes Ereignis ihn stoppt. Dann ist es nur noch eine Frage des Lesens des Registers, nachdem das Ereignis eintritt. Ich bin mir nicht sicher, ob es Ihr Ziel treffen kann, aber wenn nicht, benötigen Sie möglicherweise ein FPGA.
@ChrisStratton "versuchen Sie, das in der Software zu emulieren, indem Sie Korrekturen aus der Anzahl der Uhren anwenden, die Sie pro GPS-Hz gemessen haben." Wenn ich das richtig verstehe, versuche ich dies zu tun. Bleibt die Frage, wie zähle ich die Anzahl der Taktzyklen zwischen 2 Ereignissen (bzw. elektrischen Impulsen)?
Sie verwenden das Zähler- / Timer-Peripheriegerät in einer besseren MCU als einem ATmega, oder wenn Sie schneller fahren müssen, verwenden Sie ein kleines FPGA oder einen dedizierten Timing-Chip - es hört sich so an, als wollten Sie einen Ereignis-Timer, der mit etwa 100 MHz getaktet ist. Die Idee der Softwarekorrektur wäre, auch das Intervall der GPS 1pps zu messen und alle Abweichungen von einer dort gemessenen Sekunde auf die gemessenen Zeiten der interessierenden Ereignisse unter einem einfachen Modell des Fehlers der schnellen lokalen Uhr anzuwenden. Das ist grob, aber billiger als die Verwendung einer GPS-disziplinierten 100-MHz- oder so-Laborquelle.
Wenn Sie Code verwenden, rufen Sie die Zählung von einem freilaufenden Timer ab, dessen Häufigkeit bekannt ist. Wenn Sie Erfassungsregister verwenden, richten Sie diese richtig ein und lesen dann einfach die verstrichene Zeit aus dem entsprechenden Register ab, nachdem das Ereignis aufgetreten ist. Ich bin kein Programmierer, aber ich beschäftige mich manchmal mit solchen Dingen.
Einige GPS-Chipsätze haben einen Impulseingangsstift, das Modul teilt Ihnen die Zeit mit, zu der es den Zustand ändert. Stöbern Sie durch die Produktpalette von uBlox. Damit GPS zuverlässig Sub-100 ns erreicht, ist eine lange Messzeit oder ein ausgefallener ionofreier Empfänger erforderlich. Für die Kalibrierung benötigen Sie Zugriff auf eine bessere Referenzeinheit und einen Zeitintervallzähler. Vielleicht haben Sie Glück mit mehreren Einheiten des gleichen Modells, einfach zu testen.
@tomnexus Das GPS, an das ich dachte, war eigentlich von uBlox ( u-blox.com/sites/default/files/products/documents/… ). Sie haben mich darauf aufmerksam gemacht, dass es eine "Zeitmarke für externe Ereigniseingänge" enthält. Wird das zuverlässig sein? Sie geben an, dass die RMS-Genauigkeit 30 ns beträgt. Sollte dies für die Markierung eines Ereignisses am Eingang gelten?
@ user126881 das ist die Funktion, auf die ich mich bezog. Ich denke, du wirst es nicht besser machen. Was die Genauigkeit anbelangt, so sind 30 ns ohnehin an der Grenze dessen, was ein einfaches GPS leisten kann, das Timing auf diesem Niveau wird von der Ionosphäre dominiert. Und es erspart all den Aufwand beim Schaltungsdesign.
@ user126881 Sie werden immer noch viele Probleme mit einer so schnellen Eingabe haben. Zum Beispiel habe ich einen Himbeer-Pi, der etwas misst, indem er einen GPS-PPS-Ausgang als Trigger verwendet. Ich finde, dass es oft durch elektrisches Rauschen falsch ausgelöst wird. Ich finde also alle 10 Sekunden 11 oder 12 Impulse. Ich brauche eine viel bessere Erdung und Abschirmung, um dies zu stoppen.
@tomnexus Ich habe heute u-blox kontaktiert und jedes ihrer Module kann es tun, auch wenn es nicht immer als Feature erwähnt wird. Für Leute, die sich vielleicht fragen, können u-blox-Module ein Ereignis einmal pro Epoche markieren, also einmal pro Sekunde für eine Aktualisierungsrate von 1 Hz. Wenn zwei Ereignisse in einer Epoche stattfinden, wird nur das letzte zeitmarkiert.
@tomnexus Dieses ublox kann mit 5 Hz laufen, sodass Sie alle 200 ms zu 1 Ereignis gelangen. Die andere Option, wenn Sie häufigere Ereignisse benötigen, besteht darin, das PPS schneller auszuführen. Alle ublox können mindestens 1kHz auf dem PPS machen. Das reduziert die maximale Zeit, die Sie benötigen, um auf eine andere Uhr zu zählen, auf maximal 1 ms, was Fehler reduzieren sollte. Die Kenntnis der absoluten Zeit für jeden PPS-Impuls erfordert etwas Herumspielen während der Initialisierung, ist aber machbar.

Antworten (3)

Das Zählen von Zyklen zwischen PPS-Pulsen ist kein guter Ansatz. Selbst wenn Sie Uhren mit einer Stabilität von 10 ppb verwenden, müssen Sie immer noch den Versatz zwischen verschiedenen Einheiten bewerten.

Die Verwendung eines integrierten GPS-Empfängers mit Zeitstempel ist ein guter Ansatz. Beachten Sie jedoch, dass es nicht einfach sein wird, diese RMS-Genauigkeit von 30 ns unter realen Bedingungen zu erreichen. 30 ns entsprechen einer Positionsgenauigkeit von nur 9 m. Während die meisten Empfänger dies für eine Kalman-gefilterte Position leicht erreichen, werden Sie mehr Störungen bei Ihren Zeitstempeln feststellen (wobei der Empfänger kein Hidden-Markov-Modell verwenden kann ), es sei denn, Sie mitteln auch über mehrere Ereignisse.

Der Mehrwegempfang ist Ihr Hauptgegner (für Einheiten, die einige zehn Kilometer voneinander entfernt sind, und Ereignisse innerhalb von Sekundenbruchteilen). Multipath wird irgendwie vom Empfänger gemildert, aber das Beste, was Sie tun können, ist, eine gute Antenne (Drosselring oder ähnliches) zu verwenden und einen guten Ort zu wählen. Es kann auch helfen, es auf ein Stativ zu stellen.

Eine Gruppenverzögerungskalibrierung wird normalerweise für 30 ns nicht benötigt, wenn alle Ihre Module ein ähnliches Setup verwenden (Antennenkabellänge spielt eine Rolle, auch Verstärker oder ähnliches).

Eine weitaus bessere Genauigkeit kann erreicht werden, wenn Sie das Ereignis im Band mit den GPS-Signalen messen können , dh über das HF-Frontend des Empfängers . Dies setzt das Timing direkt mit den empfangenen Signalen in Beziehung und bietet die Möglichkeit, mehrere Fehlerquellen auszumerzen. Wenn Sie das Ergebnis nicht in nahezu Echtzeit benötigen, können Sie GPS-Signale zusammen mit Ihrem Trigger aufzeichnen und nachbearbeiten. Dies ergibt eine hohe Genauigkeit der relativen Position und Zeit (differenzielles GPS).

Ich bin mit dem Arduino Uno nicht vertraut, aber es hat wahrscheinlich ein Zählermodul, das Zeitintervalle festlegen kann. Aber es wird auf die Taktfrequenz beschränkt, die wahrscheinlich zu niedrig für das ist, was Sie wollen. Sie sollten besser zu einem Arduino Due wechseln, es hat sicherlich diese Fähigkeit und kann mit 96 MHz laufen. Studieren Sie das Zähler/Timer-Peripheriegerät (Datenblatt). Verwenden Sie es zum Erfassen

  • das Intervall zwischen den 1s-Impulsen
  • das Intervall zwischen dem letzten 1s-Impuls und dem Ereignis

Aus diesen Zahlen können Sie den genauen Abstand zwischen dem letzten Impuls und dem Ereignis berechnen.

Beachten Sie, dass die Programmierung des Peripheriegeräts nicht einfach ist. Und wenn Ihre Erfahrung in der Programmierung von Mikrocontrollern null ist, müssen Sie sie zuerst auf ein vernünftiges Niveau bringen. Das lernt man nicht in einer Woche. Wenn Sie über grundlegende Programmierkenntnisse und einen guten Lehrer verfügen, ist ein Monat möglicherweise eine gute Schätzung. Und danach kommt das Verständnis des Timers.

Ich arbeitete mit einer R&D co. die früher ein Netzwerk mit ähnlichen Anforderungen für synchrones TDM in einem gemeinsam genutzten Netzwerk hatten. Der Upstream-Multiplexer maß den Phasenfehler eines schmalen Impulses von jedem „Sender“, sodass die Downstream-Ziele nicht nur in ihrem eigenen Zeitschlitz mit dem gemeinsam genutzten Bitstrom phasenverriegelt, sondern aufgrund von „Leitungsaufbau“ oder Latenz oder phasensynchronisiert werden konnten jeder andere Phasenfehler. Der Repeater sendete dann bei Bedarf Phasenkorrekturbefehle an jeden Sender, um sicherzustellen, dass der zentrale Punkt alles perfekt synchron empfing.

Um so etwas zu erreichen, muss Ihr Phasenfehlerdetektor eine höhere Auflösung als der erforderliche Fehler haben, und die zeitliche Drift eines nicht synchronisierten Senders muss in ein Zeitintervall übersetzt werden, das innerhalb der Phasendetektorspanne von +/- xx ns korrigiert werden kann. Die Verwendung von ULF/VLF-Phasenerkennung wie z. B. ergibt eine größere Phasenspanne, aber wenn sie bis zu einer Frequenzauflösung multipliziert wird, die eine Phasensynchronisation im Bereich von 10 ns ergibt, ist entweder ein sehr stabiler Takt mit niedrigem Phasenrauschen oder eine hohe Kanalbandbreite erforderlich.

WWVB ist sehr stabil <1e-12 in f, aber unzureichende Bandbreite, um besser als ein paar ms zu korrigieren, aufgrund des 60-kHz-Trägers mit einigen kHz Bw. Übertragen Sie dies auf ns und Ihre Netzwerkbandbreite muss zur Korrektur von Phasenfehlern eine um 1e6 höhere Frequenz aufweisen.

Beginnen Sie mit genauen Spezifikationen zu den Anforderungen für jeden Standort und bestimmen Sie Ihre Phasengenauigkeit, die Sie beim Erkennen von Phasenfehlern in ns erreichen können. Ich bezweifle, dass ein Arduino dies ohne spezielle Schnittstellenhardware lösen kann, um Phasenfehler in Nanosekunden zu messen.

Ich habe viele verschiedene Doppler-Instrumente von VLF bis UHF entwickelt, daher befasse ich mich hier nur mit allgemeinen Dingen.

Ich stimme zu, dass Nanosekunden nicht in Frage kommen (das würde einen Takt von ~ 1 GHz erfordern), aber ein 96-MHz-Due sollte in der Lage sein, 10 Nanosekunden zu erreichen.
Ich denke, ein 500 MHz Cortex könnte besser geeignet sein.
Vielleicht einfacher, aber es könnte übertrieben und nicht so leicht verfügbar sein. (Der Due hat einen Cortex-M3).