Forum: Mikrocontroller und Digitale Elektronik Timer Zeit umrechnung


von Cimbom G. (cimbomgs)


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

von edson (Gast)


Lesenswert?

>wenn 1s=65536 ist

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

Gruss,
Edson

von STK500-Besitzer (Gast)


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

von Cimbom G. (cimbomgs)


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?

von Thilo M. (Gast)


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.

von Cimbom G. (cimbomgs)


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 :'(

von Cimbom G. (cimbomgs)


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

von Thilo M. (Gast)


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. :/

von Cimbom G. (cimbomgs)


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

von Thilo M. (Gast)


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.

von Thilo M. (Gast)


Lesenswert?

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

von Cimbom G. (cimbomgs)


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

von STK500-Besitzer (Gast)


Lesenswert?

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

Dann funktioniert das Ding doch, oder?

von Cimbom G. (cimbomgs)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.