Timer Zeit umrechnung

OP #752278
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
Gast #752350
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...
OP #752366
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?
Gast #752369
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.
OP #752375
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 :'(
OP #752378
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
Gast #752386
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. :/
OP #752399
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
Gast #752409
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.
OP #752437
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren