Datum: 03.07.2009 20:20
Hallo! Ich möchte aus einer Distanz und der Zeitdifferenz, die benötigt wird um die Distanz zurückzulegen die Geschwindigkeit in km/h berechen. Ich schaffs nicht ohne float-Variablen einen Richtigen Wert zu bekommen. Der Angezeigte Wert entspricht eher dem in m/s statt km/h, allerdings auch nicht exakt.
uint8_t vmax_sec=0; // Anfang der Distanz Vm_Dist uint16_t vmax_ms=0; uint8_t GesZ_sec=0; // Ende der Distanz Vm_Dist uint16_t GesZ_ms=0; uint8_t Vm_Dist=5; // Distanz in Meter uint16_t vmax=100; char c_vmax[6]; // ... Zeitmessung... // Geschwindigkeitsberechnung: vmax= (Vm_Dist*18000) / ((GesZ_sec*1000 + GesZ_ms - vmax_sec*1000 - vmax_ms)*5); itoa(vmax,c_vmax,10); lcd_gotoxy(0,3); lcd_puts("Vmax: "); lcd_puts(c_vmax); lcd_puts(" km/h"); |
m/s = mm/ms m/s *3,8 = m/s *18/5 = km/h, oder? Ich habe einen Überlauf beim Rechnen befürchtet und für vmax auch schon uint32_t probiert. Wie gehts richtig?
Datum: 03.07.2009 20:43
Es kann doch nicht so schwer sein ein Komma zu vermeiden. Im Wesentlichen v:= (Distanz/Zeit )* (Korrekturfaktor / Skalierung) Wobei der Korrektur ein Ganzzahlwwert ist, die Skalierung eine Division durch 2^N , zB div 256 oder so, was ein Schieben nach Rechts um 8 bit ist. Das Ganze in 32bit, falls noetig.
Datum: 03.07.2009 20:52
Nichts ist schwer, wenn man weis wies geht. Oder zumindest nicht viel ;-) also z.B. statt *18000/5 *28800/8 Die Einzelnen Summanden müssen aber nicht 32bit groß sein, oder? ich werds Morgen ausprobieren, besten Dank!
Datum: 03.07.2009 21:42
d = 19999m t = 100s normale int Rechunug: v = d/t = 1999/100 = 19 falsch (-1) sakliert: v = d/t = 1999 * |2^15| / 100 = 65503232 Ergebnis. 65503232 >> 15 = 1999