Arduino Time Clock Genauigkeit

9

Ich versuche derzeit, mithilfe der PJRC-Zeitbibliothek ( http://www.pjrc.com/teensy/td_libs_Time.html ) eine Arduino-Zeitschaltuhr zu erstellen . Ich weiß, dass, da die meisten Arduino-Boards mit einem 16-MHz-Takt und einem einzelnen Resonator betrieben werden, die Zeit nach einer bestimmten Zeit "nicht mehr synchron" sein kann.

Ich habe mich jedoch gefragt, ob jemand eine Vorstellung von der Genauigkeit der Zeitbibliothek hat, wenn sie auf dem Arduino DUE mit einem 84-MHz-Takt verwendet wird. Ich habe es ausprobiert und bis jetzt wurde die Uhr einige Stunden lang synchron gehalten. Vielen Dank!

KK6FSL
quelle
Die Einschränkungen der Genauigkeit der Bibliothek hängen von der Genauigkeit des Kristalls ab. Angenommen, Sie haben einen Kristall, der jede Stunde um 0,5 Sekunden ausgeschaltet ist, was kurzfristig großartig ist. Wenn Sie diesen Wert jedoch über ein Jahr erweitern, ist er zu diesem Zeitpunkt über 1 Stunde entfernt. Wenn Sie möchten, dass etwas über einen langen Zeitraum eine genaue Zeit hält, empfehle ich eine Echtzeituhr (die immer noch Ungenauigkeiten aufweist), ein GPS-Modul oder eine Internetverbindung zur Synchronisierung.
Jesse Laning
@ Jamolnng Danke für deine Antwort. Kennen Sie die Genauigkeit des Kristalls auf dem Arduino DUE oder wo ich ihn finden könnte?
KK6FSL
Die beste Genauigkeit, die Sie erhalten werden, ist 84 MHz. Wenn sie den Kristall herstellen oder kochen, können sie ihn nur bis zu einem gewissen Grad genau machen. Auch die Umgebung des Kristalls (Temperatur, Luftfeuchtigkeit usw.) spielt eine Rolle Genauigkeit davon.
Jesse Laning
@jamolnng Kann ich also mit dem 84-MHz-Kristall eine höhere Genauigkeit erwarten als mit dem 16-MHz-Kristall bei den meisten anderen Arduinos?
KK6FSL
5
"Die beste Genauigkeit, die Sie erhalten werden, ist 84 MHz" - das macht für mich nicht viel Sinn!
Cybergibbons

Antworten:

9

Die Einschränkungen der Genauigkeit der Bibliothek hängen von der Genauigkeit des Kristalls ab. Wenn sie den Kristall herstellen oder kochen, können sie ihn nur bis zu einem gewissen Grad genau machen. Auch die Umgebung des Kristalls (Temperatur, Luftfeuchtigkeit usw.) spielt eine Rolle für dessen Genauigkeit. Angenommen, Sie haben einen Kristall, der jede Stunde um 0,5 Sekunden ausgeschaltet ist, was kurzfristig großartig ist. Wenn Sie diesen Wert jedoch über ein Jahr erweitern, ist er zu diesem Zeitpunkt über 1 Stunde entfernt. Wenn Sie möchten, dass etwas über einen langen Zeitraum eine genaue Zeit hält, empfehle ich eine Echtzeituhr (die immer noch Ungenauigkeiten aufweist), ein GPS-Modul oder eine Internetverbindung zur Synchronisierung.

Weitere Informationen finden Sie im Wikipedia-Artikel über Quarzkristalle

Die Verwendung eines 84-MHz-Kristalls gegenüber einem 16-MHz-Kristall verbessert nicht unbedingt die Genauigkeit des Arduino-Takts, da die Frequenz des Kristalls eher ein Indikator für die Prozessorgeschwindigkeit als für die Genauigkeit ist. Die Genauigkeit der Arduino-Uhr hängt hauptsächlich von der Genauigkeit des Quarzoszillators ab.

EDIT: Ich bin kein Experte für Quarzoszillatoren. Wenn Sie hier etwas falsch sehen, lassen Sie es mich bitte wissen

Jesse Laning
quelle
5

Erneutes Besuchen einer alten Frage ... als ich einen sehr informativen Blog-Beitrag fand, der neues Licht in sie wirft. Aber lassen Sie mich zuerst einen Kontext angeben, bevor Sie den Link angeben.

Bei der Beurteilung der Qualität einer Zeitbasis, sei es ein Kristall, ein Keramikresonator oder ein Frequenzstandard in Laborqualität, sollten zwei Begriffe unterschieden werden:

  • Genauigkeit : Wie nahe ist die Frequenz der Zeitbasis an ihrem Nennwert ?
  • Stabilität : Wie stark driftet diese Frequenz im Laufe der Zeit?

Die Genauigkeit ist wichtig, wenn Sie möchten, dass Ihre Uhr sofort die richtige Zeit anzeigt. Wenn Sie jedoch bereit sind, einige Zeit damit zu verbringen, Ihre Uhr zu kalibrieren, ist es Ihnen eigentlich egal, da Sie die von Ihnen gemessene Ungenauigkeit kalibrieren werden. Die Antwort von jfpoilpret liefert ein Beispiel für ein „manuelles“ Kalibrierungsprotokoll, das notwendigerweise ziemlich langwierig ist. Wenn Sie ein GPS-Modul mit einem 1PPS-Ausgang ausleihen können, kann die Kalibrierung in wenigen Sekunden durchgeführt werden.

Stabilität ist ein ernstes Problem. Wenn die Häufigkeit der Zeitbasis zufällig abweicht, werden Ihre Kalibrierungsbemühungen zunichte gemacht. Im Wesentlichen wird die Kalibrierung Ihnen sagt , wie schnell oder langsam Ihre Uhr läuft jetzt , aber es wird nicht zulassen , vorherzusagen , wie schnell oder langsam es laufen wird in Zukunft .

Hier ist der versprochene Link: Arduino Taktfrequenzgenauigkeit , von Joris van Rantwijk.

Was Joris getan hat, ist die Messung der Genauigkeit und Stabilität eines Arduino Pro Mini (getaktet von einem Keramikresonator) und eines alten Duemilianove (Quarzkristall). Aus meiner Sicht sind die wichtigsten Erkenntnisse:

  • Beide Uhren sind grob ungenau, daher müssten beide vom Benutzer kalibriert werden, um als Zeitmesser verwendet zu werden
  • Der Quarzkristall der Duemilianove weist eine anständige Stabilität auf, besser als 1,5e-8 bei einer Durchschnittszeit von 6 Stunden
  • Die Stabilität des Keramikresonators des Pro Mini ist erbärmlich, mehr als zwei Größenordnungen schlechter als der des Kristalls, was ihn als Zeitmesser im Wesentlichen unbrauchbar macht

Hier ist sein Allan-Abweichungsdiagramm , das die Instabilität der Uhr als Funktion der Beobachtungszeit misst:

Allan Abweichung der Arduino-Taktfrequenz
(Quelle: jorisvr.nl )

Obwohl diese Studie einige Einschränkungen aufweist (nur zwei Boards wurden getestet und die Beobachtungszeit ist zu kurz), ist sie gut durchdacht und sehr informativ. Ich ermutige Sie, es vollständig zu lesen.

Edgar Bonet
quelle
1
Die Frequenz der Quarzkristalle ändert sich leicht mit der Temperatur. Wenn Sie die Temperatur regeln können, hilft dies, die Frequenz stabil zu halten.
Duncan C
3

Der beste Weg, um die Genauigkeit des Resonators Ihres Boards zu ermitteln, besteht darin, ihn selbst zu messen.

Dazu können Sie die Arduino- millis()Funktion Ihres Boards verwenden und eine kleine Skizze schreiben, die:

  1. Sie können die Anfangszeit für die Messung der Zeitdrift einstellen (z. B. mit einem einfachen Druckknopf). Sie werden die Schaltfläche basierend auf einer genauen Zeitbasis auslösen .
  2. Rufen Sie dann wiederholt millis () auf, bis mindestens 120 Stunden ("Arduino-Stunden", das wären etwa 5 Tage) vergangen sind
  3. Zeigen Sie ein Signal an, wenn diese 120 Stunden verstrichen sind (Ihre Skizze sollte Sie wahrscheinlich "warnen", bevor die genaue Zeit erreicht ist, damit Sie sich auf die Messung vorbereiten können).
  4. Wenn die 120 Stunden abgelaufen sind, überprüfen Sie Ihre Referenzzeit basierend (in Schritt 1 verwendet) und überprüfen Sie, wie viel Zeit vergangen ist (sollte 120 Stunden +/- Epsilon betragen).
  5. Sobald Sie die Drift Ihrer Uhr kennen und vorausgesetzt, dass Ihr Board unter den gleichen Umgebungsbedingungen (hauptsächlich Temperatur) Ihres Maßes läuft, können Sie es in Ihren Skizzen verwenden, um den millis()Wert jede Stunde oder so anzupassen .

Natürlich ist dieser Ansatz alles andere als perfekt, da er menschliches Eingreifen erfordert und daher zusätzliche Zeitverschiebungen während der Messungen erzeugt. Deshalb müssen Sie Ihre Zeitverschiebungen über einen langen Zeitraum messen.

Ein verbesserter Ansatz wäre, eine hochgenaue RTC-Uhr (die Genauigkeit muss basierend auf der Genauigkeit ausgewählt werden, die Sie für Ihre Anwendung benötigen) an Ihr Board anzuschließen und die Skizze so anzupassen, dass die Drift automatisch berechnet wird. Sobald Sie die Zeitverschiebung erhalten haben, können Sie dasselbe wie in Schritt 5 oben in Ihren Skizzen tun und die RTC-Uhr von Ihrem Board trennen.

Wichtige Punkte :

  • Messen Sie die Zeitdrift auf dem Board, die später angepasst werden muss (wenn Sie mehrere Boards haben, müssen Sie eine Drift pro Board messen).
  • Stellen Sie die Stabilität der Umgebung sicher, in der Ihr Board verwendet wird

Wenn Sie wirklich eine hohe Genauigkeit benötigen, schließen Sie auf jeden Fall eine externe Taktquelle (z. B. RTC-Uhr, GPS, NTP) an Ihr Board an und verwenden Sie sie als SyncProvider für die PJRC-Bibliothek.

jfpoilpret
quelle
2

Ihr durchschnittlicher Systemuhrkristall ist um einige zehn ppm (parts per million) ausgeschaltet. Sie eignen sich hervorragend für ein stabiles und genaues Timing von Signalen, sind jedoch dramatisch, um eine genaue Zeit zu halten. Ohne besondere Vorkehrungen kann der Systemkristall um einige Sekunden pro Tag ausgeschaltet sein.

Die Lösung besteht darin, eine richtige Echtzeituhr zu verwenden, die von einem sogenannten 32768-Hz-Uhrenkristall angetrieben wird. Diese Kristalle sind leicht um den Faktor 10 genauer. Sie können entweder Ihren eigenen Oszillator einrichten, der den Hauptprozessor unterbricht und in Ihrer Arduino-Skizze zählt, oder Sie finden ein RTC-Breakout-Board.

Zwei zufällige Beispiele, die in Google mit den Suchbegriffen "RTC-Ausbruch" auftauchen:

Jippie
quelle