Störsignale Drehzahlmessung filtern

OP #7841734
Lesenswert?

Hallo,

ich erhalte bei meiner Drehzahlmessung Störsignale. Diese Störsignale verursachen Fehlmessungen. Als Drehzahlsensor dient ein LJ18A3-8-Z/BX. Die "Schaltnocken" an der Welle sind ausreichend hoch, eine Metallerkennung zwischen den Nocken möchte ich ausschließen. Der Drehzahlsensor hat eine eigene (exklusive) Spannungsversorgung und ist per Optokoppler (PC817) an die Steuerung (ESP Devkit V4) angebunden. Siehe beiliegendes Bild. Ebenso habe ich ein Foto von meiner Oszi Messung angehängt. Diese Peaks sehe ich sowohl vor dem Optokoppler als auch danach. Ein Tausch des Drehzahlsensors brachte keine Änderung. Das Kabel zum Sensor ist ca 1m lang und ungeschirmt. Des weiteren hängt noch eine Waage (HX711) an der Steuerung dran, die aber tadellos funktioniert.

Wie kann ich diese Peaks verhindern oder ausfiltern?

Angehängte Dateien:
OP #7841748
Lesenswert?

Michael B. schrieb:

Die Störsignale erfolgen dermassen regelmässig, dass es kein elektrisches sondern ein mechanisches Problem sein wird. Der Sensor wird getriggert.

Nein die Störsignale sind nicht regelmäßig. Ich habe wohl nicht das optimale Bild ausgewählt. Hier ein anderes.

Ich habe den Sensorabstand variiert, die Breite der High und der Low Pegel veränderte sich, aber die Peaks blieben.

Angehängte Dateien:
OP #7841762
Lesenswert?

Matthias S. schrieb:

Kannste auch im Programm filtern, indem du prüfst, ob die Länge des pos. Pulses eine Mindestlänge hat. Kürzer wird verworfen.

Habe ich versucht:

1
  durationHigh = pulseIn(DrehzahlsensorPin, HIGH, 40000);
2
     mb.task();
3

4
  durationLow = pulseIn(DrehzahlsensorPin, LOW, 50000);
5
     mb.task();
6

7
  if (durationHigh > 10){
8
    samples.add(durationHigh + durationLow);        // nur gute Werte werden hinzugefügt
9
  }

Es filtert zwar die kurzen Peaks aus, da aber durch den Highpeak das Lowsignal geteilt wird (es werden die Flanken ausgewertet) sind die Lowsignale zu kurz.

#7841773
Lesenswert?

Konrad B. schrieb:

Ich habe den Sensorabstand variiert, die Breite der High und der Low Pegel veränderte sich, aber die Peaks blieben.

In welchem Bereich bewegt sich die Breite der Störpeaks?

Konrad B. schrieb:

Als Drehzahlsensor dient ein LJ18A3-8-Z/BX. Die "Schaltnocken" an der Welle sind ausreichend hoch, eine Metallerkennung zwischen den Nocken möchte ich ausschließen.

Warum verwendest du einen kapazitiven Sensor für Schaltnocken einer Welle und nicht einen Hall-Sensor? Aus welchem Material ist die Welle? Wie ist die Versorgungsspannung vom Sensor abgeblockt? Sind die Störungen auch auf der Versorgung zu sehen?

#7841791
Lesenswert?

Konrad B. schrieb:

Welche Größe könnte euren Erfahrungen nach passen?

Auf Deinem Foto kann ich keine Informationen über Zeitbasis und Amplitude erkennen. 100 nF ist immer ein guter Wert ;-) Alternativ kann man auch immer den längeren '1' Pegel durch mehrfache Abtastung auswerten. Aber bei der mickymouse-Programmiersprache kann man wohl keine Aussage zum realen Timing treffen.

Rainer W. schrieb:

Warum verwendest du einen kapazitiven Sensor für Schaltnocken einer Welle und nicht einen Hall-Sensor?

Das ist doch wurscht!

OP #7841802
Lesenswert?

Mi N. schrieb:

Auf Deinem Foto kann ich keine Informationen über Zeitbasis und Amplitude erkennen.

Die Amplitude ist ca 3 V. Ich vermute "M: 10ms" ist die Zeitbasis. Das Ergäbe eine Periodendauer von ca 30 ms. Es sind zwei Schaltnocken auf der Welle (wegen Vermeidung von Unwucht) das ergäbe eine Drehzahl von 1000 rpm. Dies ist die Höchstdrehzahl der Maschine

100 nF ist immer ein guter Wert ;-)

Danke

OP #7841806
Lesenswert?

N. M. schrieb:

12V Drehzahlmeldung lässt mich vermuten das ist im Auto.

Ist dem so? Sag mal mehr zu der Applikation.

Es handelt sich um eine fette Wirbelstrombremse deren Spulen mit einem 150A IGBT angesteuert werden. Die Bremse kann einen Traktor mit 250 PS mühelos abwürgen. Die Spulen der Bremse wurden zum Zeitpunkt der Drehzahlmessung jedoch nicht angesteuert.

(Firma: matzetronics) #7841844
Lesenswert?

Konrad B. schrieb:

Habe ich versucht: durationHigh = pulseIn(DrehzahlsensorPin, HIGH, 40000); mb.task(); durationLow = pulseIn(DrehzahlsensorPin, LOW, 50000); mb.task(); if (durationHigh > 10){ samples.add(durationHigh + durationLow); // nur gute Werte werden hinzugefügt }

Was ist das für eine Sprache?

Ich würde da einen Timer benutzen, wie bei der Abfrage eines Buttons. https://www.mikrocontroller.net/articles/Entprellung

OP #7841884
Lesenswert?

Was ist das für eine Sprache?

Ich habs mit der Arduino IDE 2.x geschrieben. Die Funktion "pulseIn()" habe ich bei einem früheren Projekt schon benutzt und brachte die besten Ergebnisse. Dort hatte ich allerdings nicht mit diesen Peaks zu kämpfen

Ich würde da einen Timer benutzen, wie bei der Abfrage eines Buttons. https://www.mikrocontroller.net/articles/Entprellung

Das habe ich soeben durchgelesen.

Für einen RC Entpreller bräuchte ich (wenn ich den Text richtig verstanden habe) noch einen zusätzlichen Widerstand. Die Werte müsste ich noch berechnen.

Zur Abfrage mit einem Timer habe ich folgendes gefunden: https://github.com/khoih-prog/ESP32_New_TimerInterrupt/blob/main/examples/RPM_Measure/RPM_Measure.ino Dort kann man einen DEBOUNCING_INTERVAL_MS einstellen. Auch dass muss ich mir noch genauer anschauen

#7842049
Lesenswert?

Konrad B. schrieb:

Habe ich versucht:

1
  durationHigh = pulseIn(DrehzahlsensorPin, HIGH, 40000);
2
>      mb.task();
3
> 
4
>   durationLow = pulseIn(DrehzahlsensorPin, LOW, 50000);
5
>      mb.task();
6
> 
7
>   if (durationHigh > 10){
8
>     samples.add(durationHigh + durationLow);        // nur gute Werte 
9
> werden hinzugefügt
10
>   }
11
>

Es filtert zwar die kurzen Peaks aus, da aber durch den Highpeak das Lowsignal geteilt wird (es werden die Flanken ausgewertet) sind die Lowsignale zu kurz.

Du filterst doch falsche Werte raus. Wie können diese in die Auswertung gelangen?

#7842076
Lesenswert?

Rainer W. schrieb:

Mi N. schrieb:

Das ist doch wurscht!

Offensichtlich nicht - sonst würde es im Automobilbereich Hersteller geben, die kapazitive Sensoren für die Erfassung der Nockenwellendrehung einsetzen.

Lenk doch nicht vom Thema ab. Der TO hat diese Sensoren und sie liefern u.a. die benötigten Impulse.

Konrad B. schrieb:

Für einen RC Entpreller bräuchte ich (wenn ich den Text richtig verstanden habe) noch einen zusätzlichen Widerstand. Die Werte müsste ich noch berechnen.

Du hast schon zwei Widerstände in der Schaltung; die sollten reichen. Probieren reicht hier völlig aus und sollte längst passiert sein.

OP #7842155
Lesenswert?

Veit D. schrieb:

[/c] Es filtert zwar die kurzen Peaks aus, da aber durch den Highpeak das Lowsignal geteilt wird (es werden die Flanken ausgewertet) sind die Lowsignale zu kurz.

Du filterst doch falsche Werte raus. Wie können diese in die Auswertung gelangen?

Ich filtere nur die HighPeaks aus. Ich müsste aber den ganzen Zyklus (Bestehend aus Highsinal, dem Lowsignal bis zum Peak, den Highpeak selbst und den Rest des Lowsignals) verwerfen. Habe aber keine Idee, wie ich das Bewerkstelligen sollte. Am Sinnvollsten wäre die Ursache zu beseitigen, da mir das aber nicht gelingt, werde ich versuchen die Peaks herauszufiltern.

#7842161
Lesenswert?

Konrad B. schrieb:

selbst und den Rest des Lowsignals) verwerfen. Habe aber keine Idee, wie ich das Bewerkstelligen sollte. Am Sinnvollsten wäre die Ursache zu beseitigen, da mir das aber nicht gelingt, werde ich versuchen die Peaks herauszufiltern.

Dann nimm einen anderen Sensor, anstatt an den Symptomen herum zu doktor'n. Das wird doch hinten und vorne sonst nichts Gescheites.

OP #7842162
Lesenswert?

Mi N. schrieb:

Du hast schon zwei Widerstände in der Schaltung; die sollten reichen. Probieren reicht hier völlig aus und sollte längst passiert sein.

Werde ich bald möglichst probieren. Das ist aber leider nicht so einfach:

  1. Muß die Bremse aufgebaut und ein Traktor angeschlossen werden
  2. Liege ich gerade im Krankenhaus, bekomme jetzt dann Abführmittel und habe morgen eine Magen und Darmspiegelung
(Firma: hier&da) #7842174
Lesenswert?

Nun ich hätte die Last eher in den Kollektorkreis gelegt.

Hintergrund befindet sich die LAst im Emitterkreis muss die Basis auch deutlich höher mit Spannung angesteuert werden. Da das aber nur ein einfacher Optokoppler ist wird das hier schwierig.

Befindet sich die Last hingegen im Kollektorkreis kann man interne Pullups nutzen und das Steuersignal an der Basis bleibt recht identisch mit 0,6-0,7V

#7842200
Lesenswert?

Konrad B. schrieb:

Welcher Sensor ist was Gescheites?

Weiß ich nicht. Aber offensichtlich ist Dein Fabrikat wohl nichts wert. Die Dinger soll es ja auch von unterschiedlichen Herstellern geben (bei gleicher Bezeichnung). Da wäre es halt eine Idee, mal nach anderen Herstellern/Fabrikaten zu schauen. Oder die mechanische/geometrische Anordnung der beteiligten Teile ist bei Dir möglicherweise arg ungünstig.

#7843317
Lesenswert?

pulseIn() ist nicht für Drehzahlmessung geeignet und entprellt auch nicht. Wie der Name schon sagt, mißt sie die Pulsdauer, Du aber willst die Periodendauer. Sie ist außerdem blockierend programmiert, d.h. die Ausführung bleibt für die Messung stehen oder rennt ins Timeout.

Du solltest erstmal anzeigen, wie lang die Störnadeln typisch sind, bei der gewählten Auflösung ist das nicht zu erkennen. Und dann sagen oder anzeigen, in welchem Bereich (min/max) Du die Drehzahl messen willst. Dann kann man sinnvolle Filterregeln aufstellen.

Der 100nF kann richtig oder falsch sein, das kann man nicht erkennen. Eine Filterung in Software ist in jedem Fall besser, er ist also überflüssig.

OP #7850914
Lesenswert?

Hallo, das Projekt musste krankheitsbedingt eine Weile ruhen.

Ich habe mir das Signal primärseitg (vor dem Optokoppler) mit dem Oszi angesehen, siehe Oszi3.jpg. Das 0 Signal ist nicht stabil.

Vermutlich enthält der Näherungssensor nur einen (Feldeffekt?)Transistor der die Signalleitung auf Masse schaltet oder eben nicht. Ich habe deshalb einen zusätzlichen Widerstand (1 kOhm) eingebaut der das 0 Signal auf 12V zieht. Einen 100 nF Kerko habe ich ihr auch spendiert, siehe schaltplan1.png.

Jetzt sieht das Signal besser aus (Oszi4.jpg)

Angehängte Dateien:
#7850948
Lesenswert?

Konrad B. schrieb:

Vermutlich enthält der Näherungssensor nur einen (Feldeffekt?)Transistor der die Signalleitung auf Masse schaltet oder eben nicht.

Natürlich.

Ich habe deshalb einen zusätzlichen Widerstand (1 kOhm) eingebaut der das 0 Signal auf 12V zieht. Einen 100 nF Kerko habe ich ihr auch spendiert, siehe schaltplan1.png. Jetzt sieht das Signal besser aus (Oszi4.jpg)

Ach.

Jens G. schrieb:

Dann nimm einen anderen Sensor, anstatt an den Symptomen herum zu doktor'n.

Jens G. schrieb:

Konrad B. schrieb:

Welcher Sensor ist was Gescheites?

Weiß ich nicht. Aber offensichtlich ist Dein Fabrikat wohl nichts wert.

Oh Mann. Jetzt hast du ihm gegeben. Alle doof ausser dir.

Auch das zuvor gestörte Signal lässt sich mit minimalen Kenntnissen im Programmieren softwaretechnisch zuverlässig auswerten. Man muss halt programmieren können.

Nun, das saubere Signal, geht sogar bei naiver Programmierung.

#7851010
Lesenswert?

Michael B. schrieb:

Oh Mann. Jetzt hast du ihm gegeben.

Und das stellst Du nach paar Wochen erst fest?

Alle doof ausser dir.

Das ist Deine Interpretation. Aber wenn ein Sensor solch komische Spikes liefert, dann würde ich solch einen Sensor oder die ganze Anordnung nun nicht unbedingt als zuverlässig betrachten, womit auch der versuchte Workaround nicht unbedingt zuverlässig sein könnte.

Konrad B. schrieb:

Vermutlich enthält der Näherungssensor nur einen (Feldeffekt?)Transistor der die Signalleitung auf Masse schaltet oder eben nicht. Ich habe

Dann hätten wir saubere 0V ...

deshalb einen zusätzlichen Widerstand (1 kOhm) eingebaut der das 0 Signal auf 12V zieht.

???

Die IRED im OK würde übrigens lt. Schaltplan niemals leuchten, eher kaputt gehen ...

OP #7852380
Lesenswert?

Peter D. schrieb:

pulseIn() ist nicht für Drehzahlmessung geeignet und entprellt auch nicht.

Richtig. Er liefert(e) zwar teilweise Schrottwerte, aber mein Sensor prellt nicht.

Wie der Name schon sagt, mißt sie die Pulsdauer, Du aber willst die Periodendauer.

// Schlaumeiermodus on //

Die Summe der Pulsdauern einer Umdrehung ist doch der Kehrwert der Periodendauer der Umdrehung

// Schlaumeiermodus off //

Sie ist außerdem blockierend programmiert, d.h. die Ausführung bleibt für die Messung stehen oder rennt ins Timeout.

Das ist richtig. Deshalb habe ich das Programm umgeschrieben, siehe unten.

Und dann sagen oder anzeigen, in welchem Bereich (min/max) Du die Drehzahl messen willst. Dann kann man sinnvolle Filterregeln aufstellen.

Der 100nF kann richtig oder falsch sein, das kann man nicht erkennen. Eine Filterung in Software ist in jedem Fall besser, er ist also überflüssig.

Der 100nF bleibt drin, schaden tut er bestimmt nicht.

Als Filter habe ich mich für RunningMedian entschieden.

Hier das (verkürzte) Programm (in Mickey Maus Sprache geschrieben :-)

1
#include <RunningMedian.h>
2
RunningMedian samples = RunningMedian(5);
3

4
unsigned long Nocken_time = 0;  
5
unsigned long last_Nocken_time = 0; 
6
unsigned long letzte_Nocken_time;
7
unsigned long rotation_time = 4294967295; 
8
unsigned long previousMillis = 0;
9
uint32_t rpm;            // rpm
10

11
byte zaehler = 0; 
12
const long interval = 1000; 
13
const byte Nocken = 2; 
14

15
void IRAM_ATTR isr() {
16
 
17
  zaehler ++;
18
  if (zaehler >= Nocken){                     // ganze Umdrehung erreicht?
19
  Nocken_time = micros();
20
  rotation_time = Nocken_time - last_Nocken_time;
21
  last_Nocken_time = Nocken_time;
22
  zaehler = 0;
23
   }
24
}
25

26
void setup() {
27
    Serial.begin(115200);
28
    pinMode(35, INPUT_PULLUP);
29
    attachInterrupt(35, isr, FALLING);
30
 
31
}
32

33
void loop() {
34

35
  // Serial.println(rotation_time);
36
    unsigned long currentMillis = millis();
37
  if (currentMillis - previousMillis >= interval) {
38
    previousMillis = currentMillis;
39
    samples.add(rotation_time);
40
     if (Nocken_time == letzte_Nocken_time) {  // hat der Interrupt ausgelöst?
41
      rpm = 0;
42
    } else {
43
      rpm = 60000000  / samples.getMedian();
44
    }
45
    Serial.println(rpm);
46
    letzte_Nocken_time = Nocken_time;
47
  }
48

49
}
#7852396
Lesenswert?

Jens G. schrieb:

Und das stellst Du nach paar Wochen erst fest?

Er liefert jetzt halt den Beleg, dass dein Vorwurf, es läge am von ihm gewählten schlechten zu billigen Sensor, falsch und unbegründet war, denn es lag am vergessenen pull up Widerstand.

Vorher konnte man auch schon ahnen dass dein Vorwurf völlig aus der Luft gegriffener Unsinn war, aber nun hat man halt den Beleg.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren