Hallo, ich habe eine Frage bezüglich der Berechnung einer Geschwindigkeit. Ich habe eine Zählerstand c, dieser wurde mit der Taktfrequenz von 12MHz und einem Prescaler von 1024 gezählt. Der Weg der zurückgelegt wurde beträgt 40cm. Wie kann ich nun am besten mit einem Atmega16 aus diesen Angaben die Geschwindigkeit berechnen, in km/h. Mit meiner Methode kommen nur unrealistische Werte heraus. Zum Schluss bräuchte ich den Wert als "string" in einem char-array, (ultoa). Es genügt eine Nachkommastelle, aber es wäre auch kein Weltuntergang wenn auf einen ganzen Wert gerundet wird. Ich hoffe ihr habt die Fragenstellung verstanden und könnt mir helfen. MfG.: Benjamin
citb schrieb: > Was ist "c" ? > > citb Eine "int32" Zahl. Diese Zahl ist der Zählerstand, dieser muss alleding noch mit der Periodendauer des Taktes 12Mhz/1024 multipliziert werden.
Ok, nun wissen wir alle, was du gerade machen sollst. Aber was wir nicht wissen: Und wo ist jetzt dein Problem? Du hast vergessen eine Frage zu stellen.
Du hast also eine Zahl, die eine Zeit darstellt. Du hast ausserdem einen Wert fuer den Weg. Wo ist das Problem, die Geschwindigkeit zu berechnen? citb
Mein Problem ist, ich kann mit C das irgendwie nicht berechnen. Ich weiss nicht wie ich richtig Floatingpoints vermeiden kann. Und wie ich die INT-zahlen am besten handhaben kann.
laiehoch10 schrieb: > Mein Problem ist, ich kann mit C das irgendwie nicht berechnen. Ich > weiss nicht wie ich richtig Floatingpoints vermeiden kann. Und wie ich > die INT-zahlen am besten handhaben kann. Dann zeige was du bisher gemacht hast. Die Meisten hier helfen gerne, aber lassen sich nicht gerne als Hausaufgabenlöser für Faule missbrauchen.
1 | /*----Berechnung----*/
|
2 | if (k == 1 && m == 0) |
3 | {
|
4 | /*Zählerstand und Overflowzähler zusammenrechnen => Zeit zwischen INT0 und INT1
|
5 | mit Abstand zwischen Lichtschranken Multiplizieren.
|
6 | (overflow*256+Zählerstand)*(1/(FCPU/1024))=(overflow*256+zählerstand)*85 us = Durchlaufzeit
|
7 | Geschwindigkeit=Abstand der Lichtschranken*Durchlaufzeit
|
8 | */
|
9 | k = 0; //weitere Berechnungen unterbinden |
10 | counter = (overflow * 256) + TCNT0; //Zaehlerstand berechnen |
11 | times = counter * 85; //Zeit in Sekunden Berechnen |
12 | timeh = times / 36; //Zeit in Stunden umwandeln |
13 | timeh >> 8; //6 Stellen für Sekunden und 2 Stellen für |
14 | speed = timeh / distance; //Berechnung der Geschwindigkeit und AUFrunden auf eine ganze Zahl |
15 | speed >> 4; |
16 | ultoa(speed,Speedt,6); |
17 | strcat(Speedt," km/h"); |
18 | strcat(Speedt,"\0"); |
19 | lcd_init(); |
20 | _delay_ms(2); |
21 | lcd_text(0,0,"Speed:"); |
22 | lcd_text(1,0,Speedt); |
23 | }
|
laiehoch10 schrieb: > Ich habe eine Zählerstand c, dieser wurde mit der Taktfrequenz von 12MHz > und einem Prescaler von 1024 gezählt. Der Weg der zurückgelegt wurde > beträgt 40cm. v = s/t > Ich weiss nicht wie ich richtig Floatingpoints vermeiden kann. Das ist auch gar nicht dein Problem. > Mein Problem ist, ich kann mit C das irgendwie nicht berechnen. Das ist eigentlich ganz einfach. Du brauchst eine Division... Ich mach dir mal kurz als Denksport deine Hausaufgaben: Dein Zähler zählt in einer Stunde auf 42187500 42187500/h = 3600*12MHz/1024 = (3600*12000000)/1024*s Wenn das gerade mal mit den 40cm = 0,0004km zusammentreffen würde, dann hättest du also 0,0004 km/h. Und die gesamte Formel lautet also v = 0,0004km*(42187500/h)/c = (16875/c)km/h Jetzt mußt du nur noch mit c=0 aufpassen... Oder in C:
1 | int v; |
2 | if (c!=0) v=16875/c; |
3 | else v=999; |
Und vor allem: Nachvollziehen und KAPIEREN solltest du schon, was ich da gemacht habe.
Das ist kein vollständiger Programmtext, sondern nur ein Fragment, aus dem sich nicht einmal die Variablendeklarationen entnehmen lassen. Das, was sofort ins Auge sticht, sind die nutzlosen Anweisungen mit dem Schiebeoperator ">>", deren Ergebnisse nicht weiterverwendet werden. Daher: C-Buch nehmen, lernen. Ggf. zunächst auf einem PC ausprobieren.
Lothar Miller schrieb: > Nachvollziehen und KAPIEREN solltest du schon, was ich da gemacht habe. Du stellst aber Ansprüche... Oliver
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.