Drehzahlmessung mit ESP32

Hallo,

ich nutze die Arduino IDE unter Linux und messe eine Drehzahl über einen induktiven Näherungsschalter. Dieser misst die Flanken an einem rotierenden Zahnrad. Die Frequenz ist max. 40 Hz, der Näherungsschalter schafft 2 kHz.
Ich messe mit dem Oszi eine einwandfreie Frequenz, die Daten des ESP32 sind aber irgendwie "floatend", ungenau, schwammig. Ich habe mehrere Pins ausprobiert. Alle mit dem gleichen Ergebnis.
Das Signal erzeugt am Pin ein Interrupt, in dem die Maschinenzeit in eine Variable geschrieben wird. In der Loop wird diese Variable dann bearbeitet und in Hz umgerechnet.
Tausche ich den Näherungsschalter gegen ein identisches Signal von einem Frequenzgenerator , so bekomme ich ein supergenaues Ergebnis. Bin echt begeistert.
Also gehe ich davon aus, daß irgendwas mit dem Rechtecksignal des Näherungsschalters nicht stimmt. Da habe ich auch schon mehrere durchprobiert. Erfolglos.
Auch mit dem Interrupt, HIGH, LOW, RISE,CHANGE habe ich alles durch. Das ändert aber nichts an dem Problem, daß die Messungen ungenau sind.
Kennt jemand den Effekt?
Aber beide Signale sind eigentlich einwandfrei.
Auf dem Oszi sieht das Frequenzgeneratorsignal minimal glatter aus.
Es scheint als misst der ESP32 irgendwelche winzigen Störsignale?
Versuche das Signal mit winzigen Elkos zu "glätten" hat nix gebracht (Tantal, Kerkos, von wenigen Pico bis 300nF).
Nun möchte ich versuchen das Signal mit Optokopplern zu "bereinigen", oder hat jemand einen andere Vorschlag?

Wie meinst Du können wir Dir zu Deinem geheimen Sketch und Deiner geheimen Schaltung Hinweise geben?

Gruß Tommy

Der Sketch hat 11 Seiten auf dem Monitor und funktioniert einwandfrei bei einem Signal vom Frequenzgenerator.
Die "Schaltung" besteht aus einem Spanungsteiler von 24 V auf 3,3 V. Gebe ich ein 24V Rechtecksignal auf den Spannungsteiler, funktioniert es auch. Mir scheint, daß der Fehler nicht in der "Schaltung" oder dem Sketch liegen kann, sondern in der Art und Weise wie der ESP die Signale auswertet.

Eigentlich kann ich mir das nicht vorstellen, aber...
Schafft es der "induktive Schalter" vielleicht nicht, den Eingangspin des ESP sauber zu treiben?
Der Feequenzgenerator wird einen ganz anderen "Wumms" haben.

Neben der Schaltung (wie genau sieht der Spannungsteiler aus?) wären die Aufzeichnungen vom Oszi zum Vergleich mal schön.

Rubbernose:
Mir scheint, daß der Fehler nicht in der "Schaltung" oder dem Sketch liegen kann, sondern in der Art und Weise wie der ESP die Signale auswertet.

Wenn Du meinst. Dann brauche ich ja nicht mehr darüber nachzudenken.

Gruß Tommy

Hallo,

der Sensor macht sogar 5kHz und schaltet 200mA (PNP). Der Spannungsteiler zieht ein 24V Rechtecksignal mit einem 12k und einem 1,8k auf 3,3V runter. Sollte das zu hochohmig sein? Screenshots vom Oszi kriege ich leider nicht hin. Sobald ich an der nächsten Maschine so einen Effekt habe kann ich mal Handyfotos machen. Es scheint aber, daß das Näherungsschaltersignal etwas stärker rauscht. Das ist irgendwie nicht so rechteckig/glatt wie das Rechtecksignal vom Frequenzgenerator. Der Unterschied ist minimal, aber ausschlaggebend?

Okay, dann ist der ja aktiv. Sollte dann wohl nicht zusammenbrechen.
Dann mach doch mal eine bemaßte Handzeichnung wie Dein Signal aussieht.

Meine Vermutung: Dein ESP misst Über- und Unterschwinger - dann wäre die Ursache im Sketch zu suchen.
Ein Minimalsketch, der nur das Signal misst sollte vielleicht auf einer oder zwei Bildschirmseiten unterzubringen sein.

Meinst du? Müsste das dann nicht mit steigender Frequenz immer schlechter werden? Das habe ich bisher nicht feststellen können. Ich hab mal den Code soweit eingedampft:

 unsigned long Wert1 = 1000;
 unsigned long Wertalt1 = 1000;
 unsigned long Wertneu1 = 2000;
 float kmh = 0 ;      
 float Hz1 = 3.7;

void IRAM_ATTR ISR1() {    // Zeitwerte messen
    Wertneu1 = ESP.getCycleCount();   // Sensor rpm
    time1 = true;  
  }

void setup() {
    ...
    // pinMode(ISR1Pin, INPUT);  
    attachInterrupt( ISR1Pin, ISR1, CHANGE); 
}

void loop(){
    ...
   if (time1 == true  ) {  time1 =  false; Calc(); }   // time1 = true, auswerten
}

void Calc(){  // in Hz x 10
 
   Wert1 = (Wertneu1 - Wertalt1); // differenz
   Hz1 = 2400000000/float(Wert1);   Wertalt1 = Wertneu1;
        } 

}

Ich hoffe ich habe nichts vergessen. Der Code errechnet nur die Anzahl der Maschinenzyklen. Wie könnte man diese Über- / Unterschwinger per Code verhindern?

Hallo,

was ist das denn für ein Zahnrad an dem gemessen wird, und was wird gemessen. Eventuell ist die Messung ja auch richtig. Da Deine Frequenz max 40Hz beträgt gehe ich jetzt davon aus das es sich um eine Periodendauermessung handelt. Gleitender Mittelwert bilden geht eventuell auch noch wenn der Messwert um den richtigen Wert herum schwankt.

Ist der Messwert denn ehr zu hoch? Ich kenne das aus meiner beruflichen Praxis von Zahnrad-Durchfluss Zählern. Wenn in dem Hydraulichen System Federbehaftete Druckhalte-Organe drin sind kann es pasieren das der Durchflussmesser kurz stehen bleibt, und eventuell eine Flanke sogar 2 mal gemessen wird. Das Hydraulische System schwingt dann also. Das solltest Du aber auf einem Oscar sehen. Weg bekommen kann man das mit einem geeigeten Filter, der die kurzen , doppelten, Immpulse die gar nicht möglich sind, nicht durchlässt. (RC Glied entprellen) . Das hast Du ja aber schon probiert. In dem Fall liegt die Messwertschwankung aber immer höher als der richtige Wert.

Heinz

Hast Du mit dem eingedampften Sketch dieselben Probleme mit den Meßwerten?

Bei 40Hz könnte der Code noch gehen, bei höheren Frequenzen hätte ich Bedenken, wenn während der Kalkulation ein Interrupt auftritt. Die Rechnerei mit dem unsigned long ist möglicherweise nicht atomar. Beim Arduino bestimmt, beim ESP vermute ich das auch (habe aber da noch nie aktiv mit Interrupts gearbeitet).

Außerdem hat der Sketch am Ende eine schließende Klammer zuviel.

Hallo,

habe zwar bei einem ESP32 noch keine ISR gemacht aber.Ich habe den Sketch gerade gesehen ich denke so geht das nicht. Warum nimmst Du nicht micros() um die Zeit zu bestimmen. Und ein atomic fehlt das sicher auch.

Heinz

Ich lasse immer einen Counter mitlaufen der mir den "Leerlauf" anzeigt. 40 Hz entsprechen 25 ms. Zeit genug. Ich kann das hochdrehen auf fast 2kHz. Das geht super. Zumindest mit dem Frequenzgenerator. Mit dem Näherungsschalter wirds ungenau.

Wie oben schon geschrieben, überprüfe ich das Signal vom Näherungsschalter mit dem Oszi, das kann die Frequenz errechnen, dann stimmt die Frequenz einwandfrei und steht wie eine eins.

Micros sind ungenauer. Maschinenzyklen / -ticks sind 42 ns (?) und die ändern sich ja nicht, wenn man die Signalquelle (Näherungsschalter / Frequenzgenerator) ändert.