Geschwindigkeit berechnen

Gast #2176222
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
Gast #2176296
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.
Gast #2176304
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
     }
Moderator (Firma: Titel) Persönliche Seite #2176308
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.
(Firma: Schweigstill IT) Persönliche Seite #2176310
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren