Gast
#5950442
Hallo, ich habe einen Hallsensor mit dem ich die Drehzahl eines Motors
auslese. Das funktioniert auch gut, allerdings habe ich Probleme damit
einen Stillstand des Motors festzustellen, sprich wenn er bei 100 U/min
ausgemacht wird, wird weiterhin diese Drehzahl angezeigt.
Das Programm ist für sehr niedrige Drehzahlen zwischen 15-50 U/min
ausgelegt, deswegen werden die Zeiten mit dem Array festgehalten.
Am Motor sind 3 Magnete, pro Umdrehung misst man also 4 mal und bildet
die Differenz daraus, deswegen die Arraylänge von 4.
//Array für Messzeiten
volatile unsigned long hall_values[4];
//Berechnung der Drehzahl im Hauptprogramm
void calc_rpm()
{
//Ein paar Bedingungen um Nulldivision etc zu verhindern
if(hall_values[0]!=0 && hall_values[1]!=0 && hall_values[2]!=0 &&
hall_values[3]!=0 && hall_values[0]!= hall_values[3])
{
//da nointerrupts() mit einem wire.begin() kollidiert
detachInterrupt(digitalPinToInterrupt(interruptPin));
leakinfo.sensor.drehzahl = 60000000/(hall_values[0]-hall_values[3])
;
hall_values[3]=0;
attachInterrupt(digitalPinToInterrupt(interruptPin), detectMagnet,
FALLING);
}
}
//Interruptroutine
void detectMagnet() {
hall_values[3]=hall_values[2];
hall_values[2]=hall_values[1];
hall_values[1]=hall_values[0];
hall_values[0]=micros();
}
Bin für Vorschläge zur Verbesserung offen.