Hallo Forumsgemeinde!
Ich steh da vor einem kleinen Problem und könnte Hilfe gebrauchen. Es geht um die Drehzahlerfassung einer Welle. Ich verwende dazu den Hall-Sensor TLE4905 und erwarte mir eine maximale Drehzahl der Welle von ca. 1300 U/min. Im Normalfall sollte diese aber bei ca. 800 U/min liegen. Also das sollte der Sensor schaffen. Mechanisch funktioniert auch alles. Der Sensor spricht an, wenn der Magnet vorbeisaust.
Hier mal der Code dazu:
// Ermittlung der Wellendrehzahl mit Hallsensor TLE4905
volatile int Wellendrehung = 0;
float Timestamp = 0;
float Geschwindigkeit = 0; // in km/h
float Weg = 0; // in m
float Reifenumfang = 0,2; // in m // Annahme zum testen
void setup()
{
Serial.begin(9600);
attachInterrupt(0, functionCount, FALLING); //Interrupt Pin 0 ist Digital Pin 2; FALLING löst aus wenn Pin von high auf low fällt (Magnetfeld vorhanden ist low)
}
void functionCount()
{
Wellendrehung++;
}
void loop ()
{
if ( millis()-Timestamp > 1000) // Wenn tausend Millisekunden vorüber...
{
noInterrupts();
Geschwindigkeit = Wellendrehung*Reifenumfang*3.6; // Geschwindigkeit in km/h
Weg = Wellendrehung*Reifenumfang; // Weg in m pro sekunde; muss dann noch aufsummiert werden
Wellendrehung = 0;
Timestamp = millis();
interrupts();
Serial.print("Geschwindigkeit: ");Serial.println(Geschwindigkeit,1);
Serial.print("Weg: ");Serial.println(Weg);
}
}
Soweit so gut. Und jetz zum Problem: Wenn ich die Wellendrehungen über eine Sekunde lang zähle ist das Ergebnis bei relativ konstanter Wellendrehzahl akzeptabel. So erhalte ich aber nur jede Sekunde einen neuen Wert, wodurch die digitale Anzeige der Geschwindigkeit nicht gerade sehr "flüssig" läuft. Wenn ich länger warten würde wäre das Ergebnis wahrscheinlich noch genauer (zumindest bei konstanter Geschwindigkeit). Ich hatte aber einen Intervall von 100 ms im Sinn, damit die Anzeige bei Geschwindigkeitsänderungen schön flüssig ist. Dazu hatte ich Timestamp < 100 in der if-Bedingung und dann die Geschwindigkeit in der loop mit 10 multipliziert. Dabei kommen aber keine plausiblen Werte raus.
Hat jemand eine Idee wie man das besser machen kann? Wäre es ratsam einen Tiefpassfilter zu verwenden?
Dankeschön und LG!