Genaue Zeitangabe / micros() bzw. millis()

Hallo,

Ich brauche für ein Projekt eine sehr genaue Zeitangabe bzw. einen Zeitstempel auf mindestens eine Millisekunde aufgelöst. Das DS3231-Modul bietet mir eine hohe Genauigkeit, jedoch gibt es mir maximal Sekunden-Werte zurück. Ich habe nun gelesen, dass ich mir ein 32 khz-Signal von diesem Modul ausgeben lassen kann, jedoch verstehe ich nicht wie ich das im Arduino weiterverarbeite.

Das Projekt ist eine Stopuhr, beim ersten Impuls soll eine Zeitangabe in einer Variablen gespeichert werden, beim zweiten Impuls soll eine weitere Zeitangabe abgespeichert werden, die wiederum von der ersten abgezogen wird.

Gibt es irgendwie die Möglichkeit, ein externes Signal als Timer einzubinden? Im Grunde also die millis() bzw. micros() Funktion zu ersetzen oder nachzubilden? Ich habe mir überlegt das mit Interrupts zu machen, jedoch benötige ich ja schon einen für das Start- bzw. Stopsignal. Ich hbe bis jetzt das DS3231 Modul noch icht gekauft, da ich erst wissen möchte ob und wie so etwas möglich wäre.

Gruß, Golfer_86

http://datasheets.maximintegrated.com/en/ds/DS3231.pdf

In welchem Zeitrahmen soll die Messung denn stattfinden?
Wenn ich das richtig verstanden habe, geht es ja nicht um die genaue Uhrzeit sondern nur um die Zeitdifferenz. Wenn die nicht zu groß ist, reichen ja ev. millis() bzw micros() alleine aus.

Es geht um 0,5 Sekunden bis 20 Minuten, ich habe das schon durchgerechnet, es wird mit der internen Clock zu ungenau.

Nachschauen im Datenblatt. Such im Datenblatt nach "external clock source". Dann speisst Du das Signal in einen Timer Deiner Wahl (Vorsicht bei Timer 0) und verarbeitest es dann weiter. Und Achtung: das Modul läuft nicht mit 32kHz sondern mit 32768 Hz. D.h. Wenn Du Millisekunden brauchst, dann musst Du das auf Millisekunden hinbiegen. Wie man Frequenzen die nicht so richtig aufgehen hinbiegt habe ich zufällig hier schon mal breitgetreten: Flexible Sweep | Blinkenlight.

Ich nehme übrigens lieber DS3232 der ist nicht soviel teurer und kann ein bischen mehr. Wenn Du Zeit hast auf die Lieferung zu warten ist Futurelec eine sehr günstige Quelle: http://www.futurlec.com/Mini_DS3232.shtml

Es geht um 0,5 Sekunden bis 20 Minuten, ich habe das schon durchgerechnet, es wird mit der internen Clock zu ungenau.

Wenn Du einen Arduino (bzw. Clone) wie z.B. Seeeduino oder Iteaduino nimmst (die haben einen richtigen Quartz und nicht nur einen Keramik-Resonator), kriegst Du eine Genauigkeit, die bei wenigen ppm (Parts per Million) liegt. Das dürfte auch mit einem DS3232 nur schwer zu schlagen sein. Auf 20 Minuten sind das nur wenige ms (nicht Auflösung, sondern Genauigkeit).

Ok, danke für den Hinweis @Pylon, ich wollte aber erstmal bei meinem Mega2560 bleiben.

@Udo Klein, genau so hatte ich mir das vorgestellt, ich habe mich auch schon mit dem Thema Timer beschäftigt, wie man sie Ansteuert usw., da gibt es ja Unmengen an Beispiele um z.B. eine Frequenz zu erzeugen, aber zu meinem konkreten Problem habe ich nach langer Suche nichts gefunden, hat eventuell jemand ein Beispiel wie man, speziell den Timer0, um die Zeitfunktionen dann zu ersetzen, über einen externen Geber ansteuert?

Wie lange hast du so ca. auf deine Lieferungen warten müssen?

Gruß und vielen Dank schonmal, Golfer86

Hast Du schon mal hier: AVR-Tutorial: Timer – Mikrocontroller.net bzw. hier AVR-GCC-Tutorial/Die Timer und Zähler des AVR – Mikrocontroller.net geschaut?

Futurelec braucht manchmal 4-6 Wochen und manchmal nur eine Woche. Ist eine Art Glücksspiel, aber geliefert haben sie bisher immer.

Deine Genauigkeitsanforderungen sind so nicht zu erfüllen. 20 Minuten sind 1,2 Mio ms. Wenn du es auf 1 ms genau haben möchtest brauchst du eine Genauigkeit von 0,8 ppm. Im Datenblatt vom DS3231 sind 2 ppm angegeben. Macht dann eine Genauigkeit von 2,4 ms ohne Berücksichtigung weiterer Fehler. Eine solche Genauigkeit wie du sie dir vorstellst wirst du nur mit GPS erreichen. Was hast du für einen Versuchsaufbau, dass du bei 20 Minuten Zeitdifferenz eine solch hohe Auflösung brauchst? Holst du dir nicht über Andere Fehlerquellen deutliche Größere Fehler ins Haus?

Die Genauigkeit erreichst Du auch mit einem DCF77 Empfänger wenn Du die Sendefrequenz ausnutzt um über einen PLL Schaltung den Systemquarz zu stabilisieren oder einen Oszillator stabilisierst von dem die zeit für die Messung abgeleitet wird. Die Sendefrequenz des DCF ist von der Atomuhr abgeleitet und darum hochgenau.
Um das DCF Signal auzunutzen brauchst Du aber einen speziellen Empfänger. Die normalen Module können das nicht.

grüße Uwe

Ich hatte in einem anderen Thread schon einmal wegen einer Funkübertragung für eine Lichtschranke zur Geschwindigkeitsmessung geschrieben. Der konkrete Systemaufbau soll so aussehen:

Arduino 1 mit Lichtschranke wird zuanfangs über ein Kabel mit Arduino 2 - ebenfalls mit Lichtschranke - synchronisiert, beide sollen ein DS323x Modul erhalten. Danach soll nach Auslösung von Arduino 1 dieser das Startsignal an Arduino 2 übertragen und einen Zeitstempel mitsenden, löst die Lictschranke von Arduino 2 aus, so wird der Zeitstempel von Arduino 1 abgezogen und mit bekanntem Weg bzw. Abstand lässt sich die Geschwindigkeit berechnen. Wenn ich jetzt mehrere Messungen mache, dauert das ja seine Zeit und je nach der Ganggenauigkeit driften die beiden Zeitgeber ja immer weiter auseinander, sodass im ungünstigsten Fall 10 min mit Sicherheit zur Verfügung stehen sollen.

Ich bin gezwungen auf Funk zurückzugreifen, da Teilweise Entfernungen bis zu 1000 m zwischen den beiden Arduinos bestehen und ich eine gewisse Flexibilität benötige (Ich will kein Extra Fahrzeug für eine Kabeltrommel :wink: )

@uwefed, du meinst ich soll die Trägerfrequenz messen?

Du brauchst über eine Entfernung von 1000m eine absolute (nicht relative) Genauigkeit von 1ms? Was misst Du da? Raketenstarts?

Nur um das zu veranschaulichen: Bei Schallgeschwindigkeit wäre 1ms eine Ungenauigkeit von 30cm. Bei menschlichen Geschwindigkeiten (< 10m/s) sind wir deutlich unter 1cm und das bei einer Gesamtdistanz von 1km. Macht das wirklich noch Sinn?

Ich hatte geschrieben teilweise bis zu 1000m. Es kommen durchaus auch Entfernungen von 1 Meter vor, bei einer Geschwindigkeit von 30 m/s (was relativ wenig ist) wären das 33,33 Millisekunden, also ein Fehler von 3 % bei 2 Arduino mit entsprechenden Modulen und ungünstigen Bedingungen von auseinanderlaufenden Uhren wären dass dann schon Größtfehler von 6 % ...

Golfer86:
@uwefed, du meinst ich soll die Trägerfrequenz messen?

Nein, Du könntest einen Taktgenerator mit der DCF Sendefrequenz koppeln und so eine absolute Ganggenauigkeit erhalten. Der Aufwand ist aber nicht zu unterschätzen.
grüße Uwe

Bei einem oder auch mehreren Metern könntest Du eine Kabelverbindung zur Synchronisation verwenden, bei grösseren Entfernungen wäre eine entsprechende Funkstrecke denkbar. Dann brauchst Du nicht mal zwei Arduinos, denn Du musst ja nur das Signal der Lichtschranke übertragen. Bei grösseren Entfernungen dürfte die Verzögerung der Funkstrecke nicht mehr so relevant sein, was aber natürlich sehr stark vom zu messenden Objekt bzw. dessen Geschwindigkeit abhängt.

Ich kenne mich mit der Materie leider nicht sehr gut aus, aufwenig fällt dann eher weg :wink: Ich habe mir die GPS-Empfänger mal angesehen, die liefern ja auch ein 1Hz-Signal, wie verarbeite ich das am Besten?

@pylon, das Problem ist bei der Funkübertragung im Bereich von 1000m dass eine Fehlerkorrektur meist benötigt wird und ich die Verzögerung daher nicht vorhersagen kann. Ich habe neulich einen Artikel gelesen http://www.digi.com/support/kbase/kbaseresultdetl?id=3065 wo die Verzögerung vom XBEE Standard aufgezeigt wird, zwar kenne ich mich nicht sehr gut aus mit dem Thema, jedoch sind die Abweichungen meines Erachtens zu groß(ungefähr 9 < t < 50 ms)

wo die Verzögerung vom XBEE Standard aufgezeigt wird,

Ich habe ja auch nicht von einem XBEE gesprochen (die dürften mit 1000m sowieso ihre Mühe haben). Du brauchst ja keine Datenübertragung, nur ein Impuls-Signal, wenn die Lichtschranke betätigt wird. Ich würde also etwas nehmen, wo Du mehr Kontrolle über die Verzögerungen hast. z.B. LR Series RF Transmitter and Receiver Modules - Linx Technologies

Da hast du recht, Impulssignal wäre das Einfachste, leider haben die nur "up to 914m". Hast du Erfahrungen bezüglich der tatsächlichen Reichweite? Die XBee gibts meine ich sogar > 1,5km, das Schöne daran ist dass es ausführliche Dokumentationen und Beispiele dazu gibt, ich bin halt auf dem Gebiet absoluter Neuling.

Edit: Von Nordic hatte ich auch mal was gefunden mit bis zu 1000m http://www.elecfreaks.com/store/nrf24l01p-pa-lna-v31-p-142.html jedoch benutzt der auch ein Protokoll

Noch einmal zurück zum GPS: Ich kann bei einigen Modellen ja ein PPS (Pulse per second) Signal ausgeben lassen, kann ich damit irgendwie den Arduino synchronisieren?

Hast du Erfahrungen bezüglich der tatsächlichen Reichweite?

Nein, aber bei Sichtkontakt würde ich annehmen, dass 1000m erreicht werden könnten.

Die XBee gibts meine ich sogar > 1,5km

Das sind dann aber nicht mehr die günstigen, die man überall kriegt.

Ich kann bei einigen Modellen ja ein PPS (Pulse per second) Signal ausgeben lassen, kann ich damit irgendwie den Arduino synchronisieren?

Ja, Du kannst das Signal auf einen Interrupt-Pin legen, in der entsprechenden ISR dann den Wert von micros() abspeichern und kriegst damit immer die Mikrosekunden seit dem letzten Sekunden-Signal. Für Millisekunden sollte somit auch der Resonator-Takt eines UNO oder Mega2560 ausreichen.

OK, dann hab ich also drei Möglichkeiten:

  1. RTC wird Anfangs synchronisiert und dann bei Impuls der Zeitstempel über beliebiges Protokoll übertragen.

Nachteil:

  • sync. anfangs mit Kabel
  • 2 RTC Module, ca. 40 €
  1. Impuls über Drahtlosverbindung bei Auslösung.

Nachteil:

  • störempfindlich
  1. GPS als Zeitsignal und beliebige Funk-Module

Nachteil:

  • ca. 80 € für 2 GPS-Module

Dafür jedoch kein Synchronisation, je nach Protokoll störunempfindlich, höchste Genauigkeit. Ich bekomme ja nur das 1-Sekunden-Signal, ich brauche jedoch zumindest einmal eine absolute Zeitangabe, die ich ja auch über GPS abrufen kann, allerdings habe ich gelesen gibt es gewisse Verzögerungen zwischen GPS-Sender, Empfänger-Modul und Arduino - Ist die bei gleichen Modulen gleich? Sonst hätte ich ja das Problem nur verlagert.

  1. Mit nur den RTC dürfte eine Genauigkeit im ms-Bereich nur kurzfristig möglich sein. Nach wenigen Minuten können die Uhren deutlich über 1ms abweichen.

  2. Damit dürfte die grösste Distanz möglich sein, auch wenn evtl. auf Sender/Empfänger aus anderen Bereichen zurückgegriffen werden muss.

  3. Die Genauigkeit hängt davon ab, wie genau das 1 Sekunden-Signal vom GPS geliefert wird. Darüber konnte ich in den Datenblättern der von mir verwendeten Module keine Angaben finden.

Ich bekomme ja nur das 1-Sekunden-Signal

Wieso? Du kannst doch ganz normal die Zeit auslesen. Mit dem 1-Sekunden-Signal machst Du dann nur die Subsekunden-Auflösung möglich.

allerdings habe ich gelesen gibt es gewisse Verzögerungen zwischen GPS-Sender, Empfänger-Modul und Arduino - Ist die bei gleichen Modulen gleich?

Ich bezweifle ganz stark, dass das bei nahe beieinanderstehenden Empfängern (in GPS-Grössenordnungen) auch nur in die Nähe von 1ms kommt. Das wären Signallauflängen von 300km.