Forum: Mikrocontroller und Digitale Elektronik Hallsensoren und Interrupts


von Nils (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

Nils schrieb:
> 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.

Stillstand wirst du nicht feststellen können. Du kannst höchstens 
feststellen, wenn die Zeit zwischen zwei Impulsen des Hallsensors einen 
gewissen Wert überschreitet, die Drehzahl also unter einem bestimmten 
Wert liegt. Was du brauchst, ist ein Timeout für die Zeitmessung.

von STK500-Besitzer (Gast)


Lesenswert?

Du solltest noch eine Marke setzen, die anzeigt, dass ein Interrupt 
aufgetreten ist.
Die setzt du zusammen mit einem Timeout-Timer zurück. Wenn der 
Timeout-Timer abgelaufen ist, steht dein Motor.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Im Loop oder per Timer-Interrupt prüfen, ob sich das Array längere Zeit 
nicht geändert hat (mit Kopie vergleichen). Wenn das so ist, Anzeige auf 
Null setzen ...

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.