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?
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.
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 )
@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 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.
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.
RTC wird Anfangs synchronisiert und dann bei Impuls der Zeitstempel über beliebiges Protokoll übertragen.
Nachteil:
sync. anfangs mit Kabel
2 RTC Module, ca. 40 €
Impuls über Drahtlosverbindung bei Auslösung.
Nachteil:
störempfindlich
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.
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.
Damit dürfte die grösste Distanz möglich sein, auch wenn evtl. auf Sender/Empfänger aus anderen Bereichen zurückgegriffen werden muss.
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.
Ich meinte Verzögerung durch das Modul, also aufgrund interner Vorgänge, jedoch habe ich etwas von teilweise 790 ms gelesen, aber das müsste man gesondert überprüfen. (vgl. GPS Timestamp synchronisieren - Mikrocontroller.net)
Ich habe irgendwo zwischen bis zu 1 Microsekunde / 50 Nanosekunden pps-Genauigkeit gelesen, also sehr genau. Also meiner Meinung nach ist diese Lösung die genaueste, wenn sie denn funktioniert.
Edit: Watterott bietet ein günstiges Modul an, dort beträgt die pps-Genauigkeit 10ns laut Datenblatt.
Golfer86:
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 % ...
Du verwechselst hier absolute und relative Genauigkeit. Wenn du nur 33 Millisekunden misst und die laufen die beiden Taktquellen auch weniger auseinander, als wenn du 20 Minuten messen tust. Wenn du z.B. Quarzoszillatoren verwendest, kannst du Genauigkeiten von ca. +-25 ppm und besser erreichen. Wenn deine Messung ab der Synchronisation an 30 Sekunden dauert hast du eine Differenz von 0,15 ms. Rechnet man das auf die Geschwindigkeit zurück, hast du einen Fehler von 0,5 %. Wenn du den Abstand zwischen Synchronisation und Messungsende auf 3 Sekunden verkürzt bist du schon bei 0,05%.
Von was willst du den die Geschwindigkeit messen? Autos? Licht? Wellen?
GPS ist nicht nur teuer sondern im Zweifelsfall auch ungenau. Wer das bezweifelt darf selber nachmessen. Grund: das hochgenaue interne Zeitsignal wird nicht immer so hochgenau nach aussen gegeben. Wer wirklich genaue Zeit braucht, muß sich schon ein Timekeeping GPS holen. Die gibt es häufig gebraucht bei Ebay um die 100 Euro ("Trimble Thunderbolt").
Das ist aber definitiv overkill. DS3232 ist klar der richtige Weg.
@Udo Klein, das hört sich plausibel an, aber prinzipiell wäre die Genauigkeit zur absoluten Uhrzeut ja egal, solange beide Module das selbe Signal bekommen würden, oder?
@circuit99, es kommt aber durchaus vor, dass zwischen Synchronisation und Messung 20 Minuten vergehen und ich wollte das ganze so unkompliziert wie möglich gestalten, also nur Anfangs synchronisiseren, es wäre auch sehr umständlich, jedes mal im dümmsen Fall 1000 m hin und herzulaufen. Gemessen sollen KFZ mit Geschwindigkeiten zwischen 1 und 300 km/h.
Ich habe mal in Excel überschlagen wie es mit Fehlern aussieht: Bei 300 km/h und keiner Berücksichtigung des Messstreckenfehlers (Länge) ist der Größtfehler (zwei RTC-Module driften auseinander bei einem Meter Messtrecke bei 55 % nach 35 min .... siehe Anhang)
Genau da liegt der Hase im Pfeffer: zwei verschiedene GPS Module können zwangsläufig nicht am selben Platz sein. Ergo können sie auch nicht das selbe Signal empfangen. Das ausgesendete Signal ist für alle gleich, das empfangene aber nicht, sonst könnte man ja den Ort nicht bestimmen. Die geringen Unterschiede sind aber irrelevant. Die Frage ist ob beide das gleiche Ausgangssignal erzeugen. Bei Timekeeping GPS kannst Du Dich drauf verlassen, bei normlem GPS nicht. Es kann sein, daß im 99% Fall zwei normale GPS Module auf die Mikrosekunde übereinstimmen und genau dann wann Du es brauchst das nicht so ist.
Also wenn schon overkill dann richtig --> Timekeeping GPS oder doch besser bei DS3232 bleiben. Oder DCF77 nehmen und damit auf die Millisekunde syncen. Das geht, ist aber nicht ganz leicht. Wie man sowas macht wird Gegenstand der nächsten 3-5 Blinkenlight Blog Einträge sein. Das ist etwas länglich