Drehzahlmessung mit Hallsensor H501

michael_x:
Mit Mess-Spitzen sollte man eigentlich keinen Arduino kaputtkriegen, mit Kurzschlüssen, 5V oder mehr an den falschen Stellen evtl. schon. Aber ohne OUTPUT Pins und mit nur 5V auch eher seltsam ...

Ich hab mit den Messpitzen am Hallsensor gemessen und dabei werde ich 5V und Massemit der Messpitze gebrückt haben. Is ja recht fuddelig da für große Hände :slight_smile:

Danke an alle. Ich werds morgen noch mal probieren, wenn die neuen Nanos da sind.
Auf den Breakout Boards von Funduino ist die Fummelei beim Ausprobieren doch einfacher. Wenns dann steht wirds ein Pro Mini, der dann in den Flieger kommt.

dabei werde ich 5V und Masse mit der Messpitze gebrückt haben

Hattest du ihn über USB oder Vin am Laufen?

Bei USB: Toi Toi Toi, dass ein neuer Nano hilft. ;(

Über USB, aber zum Glück über nen aktiven HUB.

Ich konnte es nicht abwarten und hab nen Pro aus einer anderen Schaltung raus genommen.

Mit dem 4,7K Widerstand und dem Code von Michael funzt es.
Jetzt muss ich nur noch die Impulse in eine Drehzahl umrechnen.

Danke an alle.

Dann kann ich mich ja jetzt an den nächsten Hallsensor in einem Durchflussmengensensor geben.
Damit der Kollege auf seinem Sender endlich die Motordrehzahl des Verbrenners und den Spritverbrauch per Telemetrie angezeigt bekommt.

Mit dem 4,7K Widerstand und dem Code von Michael funzt es.

Schön. Mit meinem Code sollte es übrigens auch ohne Widerstand zwischen Vcc und Pin3 gehen.
Mit 4,7k ist es evtl. etwas unempfindlicher gegen Störungen.

Hier bekommst du Impulse/sec., X 60 = U/min

[/

#define READPIN 2       // Pin für Reed-Kontakt, Digital-2 für Interrupt 0
#define REEDINTERRUPT 0 // Hardware-Interrupt für den Reed-Pin (Tacho)
volatile int reedCountSum;
volatile long reedMillisSum;
float impulse;
unsigned long letzteSekunde=0;
unsigned long lastReedMillis;

void setup()
{
  Serial.begin(9600);
  attachInterrupt(REEDINTERRUPT, reedISR, FALLING);// prüfen des Signals auf fallende Flanke
  }

void loop()
{
    
    // Anzeige wird einmal pro Sekunde aktualisiert
    if (millis()-letzteSekunde>1000) 
    { 
     tacho();
     Serial.print(impulse); //Impulse je Sekunde
     impulse=0;
     reedCountSum = 0;
     reedMillisSum = 0;
     letzteSekunde=millis(); 
    }
}


  

  void reedISR()
  {
      reedCountSum++;                           // Impulse addieren
      reedMillisSum+=millis()-lastReedMillis;   // Zeit addieren
      lastReedMillis=millis();                  // Zeit merken
    }
  
  void tacho()
{
  if (reedMillisSum >0 && reedCountSum>2) // Division durch null abfangen
      detachInterrupt(REEDINTERRUPT); // Interrupt deaktivieren um das Rechnen nicht zu unterbrechen.
      impulse = reedCountSum*1000.0/reedMillisSum;
      attachInterrupt(REEDINTERRUPT, reedISR, FALLING);
  if (millis()-lastReedMillis>150) impulse=0;    // wenn 150 ms kein Signal kommt Impulszähler auf null setzen 
}
code]

statt detachInterrupt / attachInterrupt reicht eigentlich noInterrupts() / interrupts().
Und das Rücksetzen auf 0 würde ich auch da machen...

Dein Pin3 gehört (beim Uno) zu Interrupt1,
da gibts inzwischen die Hilfsfunktion digitalPinToInterrupt(pin)

Danke für die Info. Ich möchte aber gerne solange es geht die Benutzung von Interrupts vermeiden, da der Mini nur 2 hat. In der derzeitigen Planung sind schon 2 Hallsensoren geplant ( Drehzahl, Durchflussmenge ). Damit hätte ich schon alle verfügbarer Interrupts belegt.

Da ich / wir noch nicht wissen, wo denn das ganze hinführt, möchte ich mir alle Möglichkeiten soweit möglich offen halten.

Was wäre denn der Nachteil, wenn das ganze ohne Interrupts gemacht wird? Doch höchstens, das mal ein Impuls verloren geht. Bei >1000 pro Minute sollte das nicht so ins Gewicht fallen. Da alle 20 ms die Telemtrie auf dem Rückkanal neu bedient wird.würde die Abarbeitung durch den Interrupt ja auch beeinflust.

Da alle 20 ms die Telemtrie auf dem Rückkanal neu bedient wird.würde die Abarbeitung durch den Interrupt ja auch beeinflust.

Ja.
Alles was auf dem atmega in software abläuft, beeinflusst einander. So gesehen ist es ohne ISR einfacher: Sicherstellen, dass loop() immer schnell genug fertig ist und alle Teile oft genug drankommen, fertig. :wink: