www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeit (ms) mit Mikrocontroller messen


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte eine Sportzeitmessung aufbauen, die auf millisekunden genau 
sein sollte (Über einen Zeitraum von 2min).

Ich kenn mich etwas mit Mikrocontrollern aus und weiß auch, dass ich 
dafür den Timer einsetzen kann. Aber sind dise Timer auch ausreichend 
genau?
Ich denke mal das hängt auch vom eingesetzten Quartz ab...

Oder wie wird das in professionellen Zeitmessungen gemacht?
Gibts vielleicht irgendwelche Realtime-Clocks die auch Millisekunden 
messen?

Für ein paar Tipps wäre ich sehr dankbar...


Gruß Stefan

Autor: 3357 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich kenn mich etwas mit Mikrocontrollern aus und weiß...

 ... weniger als nichts. Vergiss es. Hat keinen Sinn.

Autor: Matte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Laß Deinen Mikrocontroller im 1 ms-Zyklus laufen, der von einem Timer 
gesteuert wird. Dann brauchst Du beim Messen einfach nur die Zyklen 
zählen. Die Genauigkeit der ganzen Geschichte hängt von Deiner 
Quarzgenauigkeit ab. Die Angaben zur Genauigkeit findest Du in dem 
Quarz-, bzw. Oszillator-Datenblatt von dem Baustein, der Deinen 
Mikrocontroller taktet.

Autor: Namenloser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die Taktung ist ausschlaggebend!

- Zum einen kann man sagen, dass die interne Müll ist, was exakte
  Genauigkeiten angeht.

- Zum anderen hast du eine im Vergleich zur Taktung riesige Zeit, die du
  messen willst. Daher solltest du die Taktung des µC so langsam wählen,
  wie möglich. Damit würdest du dann die Abweichung kleiner halten 
können.

Angenommen du taktest mit 500kHz.(Abweichung des Quartz: X%)
Dann kannst du 60 000 000 mal takten, bis du auf 120 sek. bist
die Abweichung wird leider addiert. Darum ist es sinnvoll, wenn du die 
Taktung sehr langsam wählst.


Angenommen du taktest mit 20MHz
Dann musst du 2 400 000 000 mal takten, bis du auf 120s bist
die Abweichung ist dann viel höher!!!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan wrote:

> Ich denke mal das hängt auch vom eingesetzten Quartz ab...

Wenn Du keine dirty Hacks in Deiner Software hast, d.h. die Timer nicht 
willkürlich umsetzt, hängt es nur vom Quarz ab.

Leider setzen Anfänger gerne mal willkürlich die Timer, d.h. ohne 
Berücksichtigung von Interruptlatenzen und anderen 
Softwareausführungszeiten.
Klar, daß dann die Uhr nachm Mond geht.


1ms ist fürn nen MC kein Hexenwerk, sondern elendig lang.
Also überhaupt kein Problem.
Erst bei <1µs wirds knifflig.


Peter

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Ich kenne mich etwas aus" bedeutet: Ich hab schon mehrere Programme für 
Mikrocontroller geschrieben, auch mit Timer, Capture/Compare usw.

Nur mit Quarten kenn ich micht nicht allzu gut aus.
Außerdem dachte ich mir, dass es für eine derartige Anwendung spezielle 
Bauteile gibt, die mir die Zeitmessung abnehmen...

Autor: Namenloser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Anmerkung!

bei Uhren wird öfter mal gworben mit dem Schlawort
"Quartzuhr" Und die müssen noch größere Zeiten überbrücken, als du

Also eine ausreichende Genauigkeit wirst du auf Jeden Fall erreichen. 
Wichtig ist nur, dass du die Abweichung(aus dem Quartz-Datenblatt) mit 
der errechneten Taktanzahl hochrechnest.

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Namenloser:
> die Abweichung ist dann viel höher!!!

Nein. Quarze mit einer hohen Frequenz haben oftmals auch viel kleinere 
Abweichungen. Eine Ausnahme stellen allerdings die Uhrenquarze mit 
32.768 kHz dar.

@Stefan:
Ich würde den Microcontroller nicht unbedingt sehr langsam Takten, dafür 
folgendes machen:
Der Timer wird so initialisiert, dass er, sagen wir mal alle 10 ms 
überläuft. In der Interrupt-Routine zählst du dann eine Variable hoch. 
Wenn die Variable auf 100 hochgezählt hat, ist genau 1 Sekunde durch 
(100x 10 ms = 1000 ms oder 1 s). Der Rest ist simpel: Nun musst du jede 
Sekunde eine weitere Variable hochzählen. Wenn die auf 60 überläuft, ist 
eine Minute um usw.

Autor: Matte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Namenloser:

1. Die Genauigkeit hängt bei richtigier Programmierung ausschließlich 
vom Quarz ab.

2. Korrekte Schreibweise: Quarz

Autor: Matte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Tobias Plüss:

Ohne Interrupt wird es genauer!

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Matte:
Wieso? Klar, der Interrupt wird, je nach Aufgabe, die die CPU sonst 
erledigt, nicht sofort aufgerufen (Latenz). Aber: der Interrupt wird 
eben in regelmässigen Abständen aufgerufen. Die Latenz bleibt ja da mehr 
oder weniger gleich, schlussendlich tritt der Interrupt halt doch immer 
im selben Zeitraster auf.
Ausserdem: Meist ist ja die Verzögerung ein paar CPU-Takte. Bei einem 
8051, der mit 12 MHz getaktet ist, wäre die Latenz z.B., sagen wir mal, 
3 uS. Das ist auf die 2 min gesehen vernachlässigbar klein... Ausserdem 
muss er die abgelaufene Zeit ja noch irgendwo ausgeben können. Bei 
Polling des Timer-Überlaufs wird das sehr hässlich zu programmieren...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matte wrote:
> @ Tobias Plüss:
>
> Ohne Interrupt wird es genauer!
Und wie willst Du ohne Interrupt mit vertretbarem Programmieraufwand 
Sekunden, Minuten (und Stunden) zählen? Außerdem ist der Interrupt bei 
einer Millisekunde zwischen zwei Ereignissen absolut unkritisch!

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,
nachdem jetzt dem völlig Ahnungslosen die Vor- und Nachteile von 
verschiedenen Taktfrequenzen und Nutzung des Interrupt erläutert wurden, 
sollten wir jetzt unser Augenmerk auf die diversen 
Ausführungsmöglichkeiten von Lichtschranken richten.
Später kommt dann noch die Anzeige des Ergebnisses auf einer möglichst 
hochauflösenden TFT-Anzeige mit mind. 1600x1200 Pixeln in 24-Bit dazu.
Oder besser gleich die Funkdatenübertragung und Kopplung an eine 
Datenbank.

Es ist also noch viel zu tun an diesem Projekt !

Autor: Matte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Johannes M.:

Ohne Interruptaufruf benötigst Du sogar noch einige Zeilen weniger 
Programmcode, somit wird es eher einfacher.
Ein Zyklus (siehe meinen ersten Beitrag) könnte so aussehen:

- Zyklusstart: Timer startet Zyklus jede ms
- Eingände werden abgefragt
- Daten werden verarbeitet
- Daten werden ausgegeben
- Sprung zum Zyklusstart

Du solltest bei der Analyse von Problemen vielleicht ein wenig flexibler 
werden. Die Einstellung "Das habe ich immer schon so gemacht" führt 
nicht unbedingt zur besten Lösung.

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matte wrote:
> - Zyklusstart: Timer startet Zyklus jede ms

Also doch Interrupt

Autor: Matte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ tastendrücker:

Das Interruptflag eines Timers läßt sich auch direkt abfragen und muß 
nicht zwangsläufig einen Interrupt abfragen!
... denk mal drüber nach.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin's nochmal (10.07.2008 12:10) .

Ergänze meinen Diskussionsvorschlag "Lichtschranke" noch um 
"Lasermessung".

Los geht's !

Autor: Matte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Klaus:
Auch für Dich:
... denk mal drüber nach.

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timer I-Flag abfragen.... Ich pack mich weg.

Und was genau soll das für ein Vorteil bringen?

Autor: Matte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ tastendrücker:

s.o.

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Matte
Also ich bin doch wesentlich flexibler, wenn ich die "Abfrage" des Timer 
I-Flags den µC machen lasse und er mir Bescheid sagt, wenn's soweit ist?

Aber wer weiss... vielleicht hast du da ja geniale Techniken, auf die 
andere noch nicht gekommen sind.

Autor: Matte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ tastendrücker:

Auch außerhalb des Interrupt fragt der µC das Timer-I-Flag ab. Und wenn 
es dann soweit ist, startet er einfach den Zyklus. Er muß somit 
niemanden Bescheid sagen und vertrödelt damit keine unnötige Zeit oder 
jittert beim Interrupt-Aufruf herum (siehe µC-Datenblatt).

Womit hast Du eigentlich ein Problem?

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder, ohne Timer: Den Micro einfach Register incrementieren lassen, und 
warten bis es überläuft....

8051 Assembler:

PAUSE: DJNZ R0,$
DJNZ R1,PAUSE
RET

gibt exakt 65.536 ms Verzögerung, abzüglich der 2 us für den LCALL und 
der 2 us für RET.... ;)

Autor: Steffen Hausinger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Angenommen du taktest mit 500kHz.(Abweichung des Quartz: X%)
Dann kannst du 60 000 000 mal takten, bis du auf 120 sek. bist
die Abweichung wird leider addiert. Darum ist es sinnvoll, wenn du die
Taktung sehr langsam wählst.


Angenommen du taktest mit 20MHz
Dann musst du 2 400 000 000 mal takten, bis du auf 120s bist
die Abweichung ist dann viel höher!!!"



Hast Du Dein Beispiel mal ausgerechnet?! Angenommen, Deine Quarze 
weichen um 1% ab:

500 kHz => 1%-Abweichung = 20 ns
60 000 000 * 20 ns = 1,2 s

20 MHz => 1%-Abweichung = 0,5 ns
2 400 000 000 * 0,5 ns = 1,2 s

Übrigens: 120s => 1% Abweichung = 1,2 s

1% Abweichung sind nunmal 1% Abweichung.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Stefan: Das Tutorial über Uhren könnte für Dich noch interessant sein. 
Vorallem die Betrachtungen zur Ganggenauigkeit:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Uhr

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Angenommen du taktest mit 500kHz.(Abweichung des Quartz: X%)
>Dann kannst du 60 000 000 mal takten, bis du auf 120 sek. bist
>die Abweichung wird leider addiert. Darum ist es sinnvoll, wenn du die
>Taktung sehr langsam wählst.
>
>Angenommen du taktest mit 20MHz
>Dann musst du 2 400 000 000 mal takten, bis du auf 120s bist
>die Abweichung ist dann viel höher!!!

Blödsinn. Lies Dir mal Steffens Beitrag durch. Du hast offenbar den 
Unterschied zwischen einem absoluten und einem relativen Fehler nicht 
begriffen.

Autor: Jurij G. (jtr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steffen Hausinger wrote:
> Hast Du Dein Beispiel mal ausgerechnet?! Angenommen, Deine Quarze
> weichen um 1% ab:

So schlechte Quarze müssen aber erst noch hergestellt werden...
Die übliche Abweichung von der Nominalfreq. liegt bei Standardquarzen so 
bei 30-50ppm, das sind 0.003-0.005%

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, angenommen wir nehmen einen 8 Mhz Quarz. Für eine ms sind das dann 
eben 8000 Takte. Da können wir z.B. einen 16-Bit Timer nehmen der im 
CTC-Modus einfach 8000 Takte abzählt oder bei einem 8-Bit Timer eben 31 
* 256 + 1 * 64. Je nachdem auch mit Vorteiler 8 oder so.

8000 Timertakte / 8000µC-Takte = 1ms

Bei Reichelt entnehme ich den Angaben des 8-Mhz Quarzes:
• Temperaturkoeffizient: ± 30 ppm
• Frequenztoleranz: ± 30 ppm

Gehen wir meinetwegen mal von einer Abweichung von +100ppm aus. D.h. aus 
8Mhz werden dann eben mal 8.000.800 Mhz

d.h. wir haben jetzt in einer ms nicht 8000 sondern 8000,8 Takte.

8000 Timertakte / 8000,8 µC-Takte = 0,9999ms

Somit ist eine reale ms für den µC nur 0,9999ms lang, er wird weniger 
Zeit messen als real vergangen ist. Wenn man mit dem µC nun auf eine ms 
abstoppt, vergehen in Wirklichkeit 1,0001ms. Hochgerechnet auf die 1000 
* 120ms die in 2 Minuten vergehen ergibt das 120,0120s also 120ms 
Abweichung. => Unbefriedigend.

Diese Abweichung müsste man unter realen Umständen messen nach dem 
Verfahren in 
http://www.mikrocontroller.net/articles/AVR_-_Die_... 
vorgehen.

lg PoWl

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Paul:
Da ist Dir aber eine Null flöten gegangen. 100 ppm sind 0,1 Promille, 
macht bei 120 s eine Abweichung von 12 ms...

Ich sehe grad, Du hast es sogar noch richtig da stehen, aber 0,012 s 
sind 12  ms...

Das hätte man auch einfacher rechnen können...

Autor: Namenloser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Tobias Plüss

Schreibweise ok....

Außerdem habe ich auch nicht gesagt, dass das von was anderem abhängt, 
als von der Genauigkeit des Quarzes!

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Hm, angenommen wir nehmen einen 8 Mhz Quarz...

Für solche Anwendungen muss man halt den richtigen Quarz aussuchen. 
Rechne das nochmal mit 4.096MHz.

MfG Spess

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 wrote:
> Hm, angenommen wir nehmen einen 8 Mhz Quarz...
>
> Für solche Anwendungen muss man halt den richtigen Quarz aussuchen.
> Rechne das nochmal mit 4.096MHz.
???
Und was soll das bitteschön für einen Unterschied machen? Mit einem 8 
MHz-Quarz geht das sehr gut, es besteht kein Grund, einen 4,096 
MHz-Quarz zu nehmen (abgesehen von dem evtl. geringeren Stromverbrauch 
bei kleinerer Taktfrequenz).

Wenn der 4,096 MHz-Quarz dieselbe Genauigkeit hat wie der 8 MHz-Quarz, 
dann spielt das für das Ergebnis überhaupt keine Rolle.

Mit einem 8 MHz-Quarz kann man z.B. mit einem AVR sehr schön einen 
ms-Takt erzeugen, sogar mit einem 8-Bit-Timer. Prescaler auf 64, Timer 
im CTC-Modus, Compare-Register auf 124 und los geht's. Bei nem 
16-Bit-Timer kann man auch nen Prescaler von 8 nehmen und dann 1000 ins 
Compare-Register...

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan wrote:

> Ich möchte eine Sportzeitmessung aufbauen, die auf millisekunden genau
> sein sollte (Über einen Zeitraum von 2min).

Und wie genau  soll das aussehen?
Wie schon geschrieben wurde: 1ms ist absolut kein Problem.

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, hast völlig recht, hab mich da verguckt.

4096 ist eine 2erpotenz. Demnach kann man da ganz einfach mit einem 
Overflow-Interrupt arbeiten.

z.B. 4096000 / 256 = 16000 Timeroverflows / Sekunde. Man kann jetzt 16 
OVFs für eine ms abzählen oder mit dem Vorteiler von 8 eben 2 OVFs.

An der Genauigkeit ändert das jedoch nix. Man müsste also mit einer 
genauen Referenz die Abweichung messen. Am besten über einen längeren 
Zeitraum, z.B. mit einer Funkuhr und dann ein paar Tage durchzählen 
lassen. Das ganze kann man dann leichter mit der CTC-Methode 
korrigieren. Oder man nimmt einfach einen Uhrenquarz und ist damit 
glücklich.

Solange die Messungen per Hand ausgelöst werden bringt diese hohe 
Genaugikeit eh nix.

lg PoWl

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paul Hamacher wrote:

> Solange die Messungen per Hand ausgelöst werden bringt diese hohe
> Genaugikeit eh nix.

Ja, selbst wenn man sich Muehe gibt kommt man nicht besser als +/- 100ms 
ran. Da braeuchte man dann mind. eine Lichtschranke. Deswegen frag ich 
ja wie das Gesamtsystem aussehen soll.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hochgerechnet auf die 1000
>* 120ms die in 2 Minuten vergehen ergibt das 120,0120s also 120ms
>Abweichung. => Unbefriedigend.

Es sind nur 12 ms.

>Diese Abweichung müsste man unter realen Umständen messen nach dem
>Verfahren in
>http://www.mikrocontroller.net/articles/AVR_-_Die_...
>vorgehen.

Genau.  Es ist möglich, den Fehlgang des Quarzes sehr genau per Software 
auszugleichen, und das ist gar nicht mal so schwierig.

Vorüberlegung:

Ein idealer Quarz würde mit exakt 8 MHz schwingen, und der Timer 
müsste (bei Prescaler 1) immer bis 8000 zählen, bis die nächste ms - der 
"fundamentale Zeitschritt" des gesamten Programms - vergangen ist.  Die 
Frequenz eines realen Quarzes wird jedoch etwas davon abweichen.  Also 
könnte man erwägen, den Timer einfach immer bis 7999 oder 8001 statt bis 
8000 laufen zu lassen.  Aber das würde die Frequenz um 1 - 7999/8000 = 
125 ppm ändern, was für das gewünschte "Feintuning" zu grob ist.

Die Lösung: Man lässt den Timer z. B. 99 mal bis 8000 laufen, und nur 
jedes einhundertste mal bis 7999 oder 8001.  Das ist der Trick!  Dazu 
zählt man in der Interruptroutine einen Extra-Zähler immer nach dem 
Schema 0, 1, 2, ..., 99, 0, 1, ... 99, 0, 1, 2, ... hoch (ist mit ein 
paar Zeilen Code erledigt).  Solange dieser Zähler ungleich 0 ist, setzt 
man das OCR1A-Register auf den Standardwert 8000, aber wenn es Null ist, 
auf 8000 + C. Dabei ist C ein weiteres Register, dessen Wert die 
Frequenzkorrektur bestimmt.

Für 100 ms braucht der Controller dann nicht 100 * 8000 = 800000 
Taktzyklen, sondern 99 * 8000 + 1 * (8000 + C) = 800000 + C Taktzyklen. 
800000 + C hat aber gegenüber 800000 die relative Abweichung (1 - 
(800000 + C)/800000) = C/800000 = C * 1.25 ppm.
                          ------------

Ergebnis: Macht man es so, dann lässt sich über C die Frequenz 
softwaremäßig in 1.25 ppm-Schritten tunen.  Das ist ausreichend genau 
(1.25 ppm sind ca. 3 Sekunden pro Monat).

Die ganze Sache "tickt" dann eine Winzigkeit unregelmäßig, und zwar 
folgen immer auf 99 gleiche, aber minimal zu kurze[lange] Millisekunden 
dann eine etwas genau derart zu lange[kurze] Millisekunde, dass es 
insgesamt alle 100 ms stimmt.  Die Tick-Unregelmäßigkeit ist jedoch sehr 
gering und ist für die Praxis ohne Bedeutung.

Autor: Paul H. (powl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hochqualitativer Post!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für eure Vorschläge!
Das Meiste hab ich auch verstanden...

@Michael G.
Hast recht: Das Gesamtsystem soll mit Lichtschranken aufgebaut werden!

Bin auch schon am recherchieren, was ich da noch beachten muss.
Die Hardware krieg ich schon hin, bin trotzdem für Vorschläge offen 
(z.B. welche Lichtschranken sich dafür eignen)

Gruß Stefan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.