Forum: Mikrocontroller und Digitale Elektronik Drehzahl / Geschwindigkeit


von Sari (Gast)


Lesenswert?

Hallo Leute,

anbei mein Programm für die Berechnung der Geschwindigkeit und Drehzahl 
mittels eines induktiven Näherungsschalters bei einem Heimtrainer 
Fahrrad.

Es funktioniert soweit alles wunderbar.....
Nur bei der Ausgabe hab ich ein kleines Problemchen. Ich denke es hat 
was mit dem math.error zu tun !!! Wenn ich das Rad noch nicht drehe, 
dann gibt er mir den wert "inf" aus.

Das liegt warscheinlich daran das bei den Berechnungen in Ausgabe() am 
Anfang eben noch kein Wert in der Variable "Zeit_sek_Umdrehung" steht, 
da das rad eben noch nicht dreht.

Meine Frage ist...... wie kann ich es Ausgeben das eben nicht "inf" dort 
steht sondern einfach "0.00".

------------------------------------------------------------------------ 
-
1
#include "TimerOne.h" 
2
3
const int inputPin = 2;                                     
4
int alle_x_sekunden=1;                                      
5
double Drehzahl;                                             
6
double Umfang_km = 0.000942477;                              
7
double Geschwindigkeit;                                      
8
volatile int Umdrehungen;                                    
9
volatile double lastTime;
10
volatile double Zeit_sek_Umdrehung;
11
volatile double now;
12
13
14
15
void setup() 
16
{                
17
  pinMode(inputPin, INPUT);                                  
18
  Serial.begin(9600); 
19
  
20
  Timer1.initialize(alle_x_sekunden*1000000);                
21
  Timer1.attachInterrupt(Ausgabe);                           
22
  attachInterrupt(0, keyPressed, RISING);                   
23
  attachInterrupt(0, Zeit, RISING);
24
  
25
}
26
27
void keyPressed()                 
28
{       
29
    Umdrehungen++;                                          
30
}
31
32
void Zeit()
33
{
34
  now = millis();                                            
35
  Zeit_sek_Umdrehung = (now - lastTime)/1000;                
36
37
  lastTime=now;                                             
38
}
39
40
void Ausgabe()
41
{ 
42
43
  Drehzahl = 1 / Zeit_sek_Umdrehung;                         
44
  Drehzahl = Drehzahl * 60;                                 
45
  Serial.println("Drehzahl in U/min");
46
  Serial.println(Drehzahl);
47
  
48
  Geschwindigkeit = Umfang_km / Zeit_sek_Umdrehung;          
49
  Geschwindigkeit = Geschwindigkeit * 3600;                  
50
  Serial.println("Geschwindigkiet in km/h");
51
  Serial.println(Geschwindigkeit);                                       
52
}
53
54
55
56
void loop()
57
{
58
  
59
}
------------------------------------------------------------------------

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

> Nur bei der Ausgabe hab ich ein kleines Problemchen. Ich denke es hat
> was mit dem math.error zu tun !!! Wenn ich das Rad noch nicht drehe,
> dann gibt er mir den wert "inf" aus.

inf steht für 'infinity'. Also unendlich.

Und das ist das Ergebnis, wenn man in
1
  Drehzahl = 1 / Zeit_sek_Umdrehung;
durch 0 dividiert.


> Das liegt warscheinlich daran das bei den Berechnungen in Ausgabe() am
> Anfang eben noch kein Wert in der Variable "Zeit_sek_Umdrehung" steht,
> da das rad eben noch nicht dreht.

Es gibt nicht 'kein Wert'.
Eine numerische Variable hat immer einen Wert. Und wenn der 0 ist, dann 
ist der eben 0.

von Sari (Gast)


Lesenswert?

ja .... Haste auch ne Idee wie man den Fehler beheben kann ?

von Karl H. (kbuchegg)


Lesenswert?

Sari schrieb:
> ja .... Haste auch ne Idee wie man den Fehler beheben kann ?

Indem man den Wert abfrägt und die Berechnung nur dann macht, wenn der 
WErt nicht 0 (oder da es sich um Floating Point handelt, größer als ein 
sehr kleiner Wert) ist?
Das if ist schon erfunden!
1
  if( Zeit_sek_Umdrehung > 0.0001 )
2
    Drehzahl = 1 / Zeit_sek_Umdrehung;
3
  else
4
    Drehzahl = 0;

von Sari (Gast)


Lesenswert?

jop ok danke ;)

funktioniert ;)

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.