Forum: Compiler & IDEs Geschwindigkeit berechnen


von laiehoch10 (Gast)


Lesenswert?

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

von citb (Gast)


Lesenswert?

Was ist "c" ?

citb

von laiehoch10 (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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.

von citb (Gast)


Lesenswert?

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

von laiehoch10 (Gast)


Lesenswert?

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.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Grundlagen lernen. Das ist mühsam, aber unabdingbar.

von U.R. Schmitt (Gast)


Lesenswert?

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.

von laiehoch10 (Gast)


Lesenswert?

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
     }

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.