Pages: [1] 2 3   Go Down
Author Topic: Genaue Zeitangabe / micros() bzw. millis()  (Read 3921 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Munich/Germany
Offline Offline
God Member
*****
Karma: 11
Posts: 643
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

_______
Manfred

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3496
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Check out my experiments http://blog.blinkenlight.net

Switzerland
Offline Offline
Faraday Member
**
Karma: 111
Posts: 5242
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3496
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Check out my experiments http://blog.blinkenlight.net

Offline Offline
Jr. Member
**
Karma: 0
Posts: 82
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 271
Posts: 21871
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink )

@uwefed, du meinst ich soll die Trägerfrequenz messen?
« Last Edit: November 02, 2012, 08:19:22 am by Golfer86 » Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 111
Posts: 5242
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 271
Posts: 21871
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 111
Posts: 5242
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 46
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich kenne mich mit der Materie leider nicht sehr gut aus, aufwenig fällt dann eher weg smiley-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)
Logged

Pages: [1] 2 3   Go Up
Jump to: