Hallsensoren und Interrupts

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.
Gast #5950450
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.
Gast #5950451
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.