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
>wenn 1s=65536 ist
Woher stammt diese Annahme? Du hast nirgends deine Timereinstellungen
erwähnt.
Takt, Prescaler...
Gruss,
Edson
>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...
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?
>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.
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 :'(
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
>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. :/
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
>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.
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...
>ja richtig, ich bekomme für 4661 Takte 583,625 µs
Dann funktioniert das Ding doch, oder?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.