Go Down

Topic: Genaue Zeitangabe / micros() bzw. millis() (Read 4320 times) previous topic - next topic

Golfer86

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

MaFu

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.
_______
Manfred

Golfer86

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

Udo Klein

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: http://blog.blinkenlight.net/experiments/measurements/flexible-sweep/.

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
Check out my experiments http://blog.blinkenlight.net

pylon

Quote
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).

Golfer86

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

Udo Klein

Hast Du schon mal hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer bzw. hier http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR geschaut?

Futurelec braucht manchmal 4-6 Wochen und manchmal nur eine Woche. Ist eine Art Glücksspiel, aber geliefert haben sie bisher immer.
Check out my experiments http://blog.blinkenlight.net

circuit99

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?

uwefed

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

Golfer86

#9
Nov 02, 2012, 02:13 pm Last Edit: Nov 02, 2012, 02:19 pm by Golfer86 Reason: 1
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?

pylon

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?

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 % ...

uwefed


@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

pylon

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.

Golfer86

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)

Go Up