www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer Zeit umrechnung


Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin seit Stunden am rechnen aber irgendwie bekomme ich es nicht hin 
:-(..
Also folgendes:
Ich benutze einen Freescale Mikrocontroller. Ich sende einen Ultraschall 
und erhalte die Reflexion von einem Objekt.
Sobald ich mit senden beginne starte ich einen Timer und wenn die 
Reflexion angekommen ist, stoppe ich den Timer.

So weit so gut, aber nun muss ich den Wert, was der Timer liefert, in 
Strecke umwandeln.

Formel: s = (c * t)/2;
c: temperaturabhängige Schallgeschwindigkeit (bei Zimmertemp ~ 345 m/s)
t: Zeit
und weil doppelte Strecke zurückgelegt wird durch 2.

Der Prozessor arbeitet mit 32 MHz und eingestellt ist 9ms Interrupt 
Periode.
für 200mm erhalte ich nach dem stoppen des Timers 4661 (CNTR-Register). 
Es ist ein 16-Bit Timer (=65536).
wenn 1s=65536 ist dann müsste doch 4661=71,12ms sein oder liege ich 
falsch?
aber dann erhalte ich für die Strecke 12,268 m und das ist ganz falsch 
:-(

wie kann ich den Wert im CNTR-Register auf Sekunden umrechnen?
Fehlt mir irgend eine Rechnung, irgendwelche Parameter oder sonstiges?

ich weiß, daß diese Gleichung das richtige Ergebnis liefert:
("CNTR-Register"  c  250 / 2000000 ) - 1.3;

aber ich weiß nicht woher die Werte kommen?

Ich bin für jede Hilfe sehr dankbar
Cimbom

Autor: edson (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>wenn 1s=65536 ist

Woher stammt diese Annahme? Du hast nirgends deine Timereinstellungen 
erwähnt.
Takt, Prescaler...

Gruss,
Edson

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>9ms Interrupt Periode.
>für 200mm erhalte ich nach dem stoppen des Timers 4661

Das sind also 9ms/Tick * 4661Tick(s) = 41949ms = ~42 Sekunden.

Für 200mm ist das verdammt langsam...

Andersherum aufgezogen:
Für 0,2m braucht der Luftschall bei einer Geschwindigkeit von 345m/s 
ungefähr 580µs...

Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
edson wrote:
>>wenn 1s=65536 ist
>
> Woher stammt diese Annahme?

ok ich lag hier ganz falsch. 32 MHz bedeutet 32.000.000 mal in 1 
Sekunde. Weil es 16-Bit Timer ist, habe ich zu erst falsch gedacht und 
behauptet 1 sec entspricht 65536=2^16..aber nach 2^16 fängt der Timer 
wieder bei 0 an und das ganze 488 mal in 1 sec (2^16 * 488 ~ 32.000.000)

>Du hast nirgends deine Timereinstellungen erwähnt.
> Takt, Prescaler...

naja bei der Entwicklungsumgebung kann ich einfach den Interrupt Periode 
eingeben und die Software stellt den Prescaler ein.
eine Periode ist auf 9 msec eingestellt. Kann ich aus dieser Angebe den 
Prescaler berechnen?

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>und eingestellt ist 9ms Interrupt Periode.

Heißt das, dass ein 16-bit-Timer bei 32MHz Taktfrequenz durch den 
eingestellten Vorteiler alle 9ms überläuft?
Das wären 137.329µs pro 'Tick' (ein Timerschritt).
4661 * 137.329µs = 640ms. Das wäre die Umrechnung.

Ist die Hardware in Ordnung? Mit Oszi schon mal angeschaut? Werden die 
Echos per Interrupt ausgewertet?
Ich kenn den Prozessor nicht, aber irgendwas wird dann wohl beim 
Vorteiler nicht stimmen.

Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
STK500-Besitzer wrote:
>>9ms Interrupt Periode.
>>für 200mm erhalte ich nach dem stoppen des Timers 4661
>
> Das sind also 9ms/Tick * 4661Tick(s) = 41949ms = ~42 Sekunden.
>
> Für 200mm ist das verdammt langsam...
>
> Andersherum aufgezogen:
> Für 0,2m braucht der Luftschall bei einer Geschwindigkeit von 345m/s
> ungefähr 580µs...

ich weiß doch das was Faul ist :'(

Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thilo M. wrote:
> Heißt das, dass ein 16-bit-Timer bei 32MHz Taktfrequenz durch den
> eingestellten Vorteiler alle 9ms überläuft?

genau das soll es heißen :-D

> Das wären 137.329µs pro 'Tick' (ein Timerschritt).

kannst du mir sagen, wie du auf 137.329µs pro 'Tick' kommst?


ps: aber wenn es 640 ms sind => 640ms*345m/s / 2 =110,4m

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>kannst du mir sagen, wie du auf 137.329µs pro 'Tick' kommst?

9ms / 65536 (16-Bit)

Aber:
> ungefähr 580µs...

Wenn du die 580µS / 4661 Ticks teilst, dann kommen ungefähr 8MHz 'raus. 
Das wäre ein Vorteiler bei 32MHz von /4.
Also eine 'Periode' (65536 Ticks) von 8.192ms.

Stimmt also doch irgendwie. :/

Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thilo M. wrote:
> Also eine 'Periode' (65536 Ticks) von 8.192ms.
>
> Stimmt also doch irgendwie. :/

ja richtig, ich bekomme für 4661 Takte 583,625 µs

aber dann verstehe ich nicht woher diese Gleichung kommt:
(CNTR-Register*c*250/2000000)-1.3;
hier:
(4661*345*250/2000000)-1,3

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>aber dann verstehe ich nicht woher diese Gleichung kommt

Ich auch nicht! :)

Woher stammt die denn? Ist das ein Beispiel oder sowas?

Ich würde das so machen: (0.008192/65536)*CNTR-Register=t
t = abgelaufene Zeit.

Autor: Thilo M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:
s = (c * ((0.008192/65536)*CNTR-Register))/2;
wäre die Formel

Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thilo M. wrote:
> Woher stammt die denn? Ist das ein Beispiel oder sowas?

jepp, es ist ein Beispiel :)

> Ich würde das so machen: (0.008192/65536)*CNTR-Register=t
> t = abgelaufene Zeit.

habe ich auch gemacht ;-)

Vielen Dank für deine Hilfe...

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ja richtig, ich bekomme für 4661 Takte 583,625 µs

Dann funktioniert das Ding doch, oder?

Autor: Cimbom Gs (cimbomgs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmmm.. jetzt weiß auch woher die Gleichung kommt :)

im Prinzip ist diese:

1) (CNTR-Register*c*250/2000000)-1.3;

fast das gleich wie diese:
2) s = (c * ((0.008192/65536)*CNTR-Register));


wenn man weiß dass 1) als Ergebnis mm liefert, dann folgt:
250/2000000 = 125 µs
und in Meter würde heißen:

125 µs / 1000 = 125 ns => (125 ns)^-1 = 8 MHz

die Gleichung vollständig:
( (CNTR-Register / 8000000) * (c * 1000) ) - 1.3;

ich vermute 1,3 ist irgend ein Korrekturfaktor :)


Also vielen Danke für eure Hilfe, Dankeschön........

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.