Forum: Digitale Signalverarbeitung / DSP / Machine Learning Nadelimpuls mit schwankendem Amplituden und Zeitverlauf erkennen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Rainer P. (rapa)


Angehängte Dateien:

Lesenswert?

Hallo Freundinnen und Freunde der Signalerkennung,

ich habe ein Problem, welches mich schon Tage beschäftigt und ich keine 
zufriedenstellende Lösung finde. Es geht um die optische Abtastung bzgl. 
einer relativ genauen Drehzahlermittlung einer Welle die sich recht 
langsam dreht (max. 1 U/sek oder sogar stehen bleibt). Die Welle hat 
eine optische Kennzeichnung und ist nur über eine Art Schaufenster zu 
erkennen. Leider ist die Oberfläche der Welle mit der Kennzeichnung 
nicht ideal sauber und somit entsteht kein "sauberer" Impuls.

Das größte Problem ist jedoch, dass die Amplitude mit zunehmender 
Drehzahl auch einbricht, der Funktionsverlauf jedoch bleibt. Siehe 
Bilder. Ein einfacher absoluter Trigger ist daher wohl eher nicht 
zielführend. Abgetastet wird das Signal alle 10ms. Das ist auch die 
einzig bekannte Konstante.

Gleitender Mittelwert, sammeln der letzten Höchstwerte, Varianz, etc. 
brachten keinen Erfolg, da ja die max. Periode theoretisch unendlich 
lang sein kann.

Bei plötzlicher Drehzahländerung nach oben werden keine Impulse mehr 
erkannt, bei Änderung der Drehzahl nach unten, doppelte durch die 
"Vorspitze".

Dachte nicht, dass es so kompliziert ist - oder ich sehe den Wald vor 
Bäumen nicht. Jemand eine Idee?

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Ich würde mal die Geschwindigkeits-Hallsensoren von Allegro anschauen, 
die haben in den neueren Typen eine ausgetüftelte Impulsformung:
https://www.allegromicro.com/en/products/sense/magnetic-speed
Bei manchen in der Tabelle steht "self-calibrating", das könnten sie 
sein.

von Rainer P. (rapa)


Lesenswert?

Christoph db1uq K. schrieb:
> Ich würde mal die Geschwindigkeits-Hallsensoren von Allegro anschauen,
> die haben in den neueren Typen eine ausgetüftelte Impulsformung:
> https://www.allegromicro.com/en/products/sense/magnetic-speed
> Bei manchen in der Tabelle steht "self-calibrating", das könnten sie
> sein.

Sicherlich interessant, aber leider muss bzw. kann es nur über das 
optische Prinzip gehen. :-(

von Christoph db1uq K. (christoph_kessler)


Angehängte Dateien:

Lesenswert?

Mir geht es nur um die aufwendige Impulsaufbereitung, die man auch auf 
eine optische Abtastung anwenden könnte.

von Robert K. (robert_kl)


Lesenswert?

Rainer P. schrieb:
> Das größte Problem ist jedoch, dass die Amplitude mit zunehmender
> Drehzahl auch einbricht, der Funktionsverlauf jedoch bleibt. Siehe
> Bilder. Ein einfacher absoluter Trigger ist daher wohl eher nicht
> zielführend.

den Triggerwert so setzen, dass die hohen Impulse erkannt werden. Nach 
einem Impuls den Triggerwert um 200mV absenken und innerhalb von 5s 
wieder linear auf den Ursprungswert ansteigen lassen.

kommt auch drauf an, wie schnell sich die Drehzahl ändern kann. Wenn die 
Welle aus dem Stand anläuft und beim ersten Impuls schon die maximale 
Drehzahl erreicht ist, funktioniert es so nicht.

von Rainer P. (rapa)


Lesenswert?

Christoph db1uq K. schrieb:
> Mir geht es nur um die aufwendige Impulsaufbereitung, die man auch auf
> eine optische Abtastung anwenden könnte.

Leider kann ich den Dokus aber nicht entnehmen, wie die das machen.

von Jan K. (jan_k776)


Lesenswert?

Haste mal die Daten? Dann kann man etwas ausprobieren...

Aus der DSP Ecke fallen mir Sachen ein wie
- Savitzky Golay Filter, ggf. als Ableitungsfilter
- Hochpass/Bandpass
- Hilbert Filter um die Einhüllende zu berechnen
- Pattern matching?
- Wie sieht der Frequenzbereich aus?

Das sollte alles irgendwie gehen, besonders weil deine Abtastrate fix 
ist.

Wie schnell muss die Info der Drehzahl denn vorliegen? Worauf wird 
gerechnet?

von Rainer P. (rapa)


Lesenswert?

Robert K. schrieb:
> den Triggerwert so setzen, dass die hohen Impulse erkannt werden. Nach
> einem Impuls den Triggerwert um 200mV absenken und innerhalb von 5s
> wieder linear auf den Ursprungswert ansteigen lassen.
>
> kommt auch drauf an, wie schnell sich die Drehzahl ändern kann. Wenn die
> Welle aus dem Stand anläuft und beim ersten Impuls schon die maximale
> Drehzahl erreicht ist, funktioniert es so nicht.

Es ist ja so, dass bei höheren Drehzahlen die Amplitude bzw. der gesamte 
Funtionsverlauf gestaucht wird. (Die Periode natürlich auch.) Die Welle 
kann recht schnell die Drehzahl ändern.

Das Markante an dem Funktionsverlauf ist ja die immense Rückflanke des 
Hauptimpulses. Ich habe dahingehend experimentiert, dass ein Wert 
mitläuft, der solange um den aktuellen Messwert inkrementiert wird, wenn 
dieser kleiner als der vorherige war. Steigt der Messwert, wird der 
"Mitläufer" auf null gesetzt. Damit "filtere" ich zwar die kleinen 
Schwankungen sehr gut raus, bin auch von der Periodendauer unabhängiger, 
aber irgendwie müsste der Triggerwert für den "Mitläufer" sich auch 
ändern - aber wie?

von Rainer P. (rapa)


Lesenswert?

Jan K. schrieb:
> Haste mal die Daten? Dann kann man etwas ausprobieren...

CSV wäre OK?

> Aus der DSP Ecke fallen mir Sachen ein wie
> - Savitzky Golay Filter, ggf. als Ableitungsfilter
> - Hochpass/Bandpass
> - Hilbert Filter um die Einhüllende zu berechnen
> - Pattern matching?

... genau auf sowas habe ich gewartet lieber Jan. Davon habe ich nämlich 
keine Ahnung. Bin kein Nachrichtentechniker.

> - Wie sieht der Frequenzbereich aus?
Das geht ja aus den beiden Bildern hervor. Wenn die Welle steht, ist die 
Periode quasie unendlich lang. 10 Sekunden wären aber realistisch. Mit 
mehr wie 2 Hertz (0,5 Sek.) ist nicht zu rechnen.

> Das sollte alles irgendwie gehen, besonders weil deine Abtastrate fix
> ist.

Ja, aber ich habe nur begrenzten Speicher um die Samples/Werte 
vorzuhalten. Derzeit sample ich mit 10ms.

> Wie schnell muss die Info der Drehzahl denn vorliegen? Worauf wird
> gerechnet?

Vollkommen unkritisch. Es soll nur möglichst zuverlässig gezählt werden.

von Jan K. (jan_k776)


Lesenswert?

Rainer P. schrieb:
> CSV wäre OK?

klar :)

Ich kann man mit Matlab reinschauen, erwarte keine Wunder. Ich denke, 
die Kunst ist, das hinterher auf Hardware laufen zu lassen - oder kann 
das auch ein PC berechnen?

von Rainer P. (rapa)


Angehängte Dateien:

Lesenswert?

Jan K. schrieb:
> Rainer P. schrieb:
> Ich kann man mit Matlab reinschauen, erwarte keine Wunder. Ich denke,
> die Kunst ist, das hinterher auf Hardware laufen zu lassen - oder kann
> das auch ein PC berechnen?

Nö, sollte kein PC berechnen.

Anbei die Daten aus dem ADC und mit Excel mal ein Diagramm dazu, um es 
noch ein wenig visueller zu machen.

Momentan mache ich es rein statisch, ich warte bis der Wert über 155 
liegt, und wenn er dann unter 74 liegt, dann habe ich es als Impuls 
erkannt. Ist aber kritisch, weil bei den "großen Nadeln" das ggf. bei 
dem "Vorimpuls" auch schon eintreten könnte :-(

von Günter L. (Firma: Privat) (guenter_l)


Lesenswert?

von Rainer P. schrieb:
>Leider ist die Oberfläche der Welle mit der Kennzeichnung
>nicht ideal sauber und somit entsteht kein "sauberer" Impuls.

Dann schickt man eben die Impulse durch ein Tiefpass und der
Impuls ist schon sauberer. Dann folgt ein Schmitt-Trigger
mit gleitenden Mittelwert, und du hast saubere Rechteckimpulse.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?


von Robert K. (robert_kl)


Angehängte Dateien:

Lesenswert?

ich habe hier eingezeichnet, wie der Verlauf des Triggerwertes nach 
meinem Vorschlag oben aussieht. Es werden alle Impulse korrekt erkannt.

Rainer P. schrieb:
> Die Welle
> kann recht schnell die Drehzahl ändern.

wenn du hier eine konkrete Angabe machen könntest, so mit Zahlen und so, 
könnte man sagen, ob es so geht.
Also welche Drehzahl kann die Welle aus dem Stillstand innerhalb 1 
Umdrehung erreichen? Ist das in deinem Beispiel die maximale 
Beschleunigung?

von Rainer P. (rapa)


Lesenswert?

Günter L. schrieb:
> Dann schickt man eben die Impulse durch ein Tiefpass und der
> Impuls ist schon sauberer. Dann folgt ein Schmitt-Trigger
> mit gleitenden Mittelwert, und du hast saubere Rechteckimpulse.

Tatsächlich geht der Impuls schon durch einen Tiefpass, aber ich werde 
die Kapazität nochmals erhöhen, evt. bekomme ich dann den Vorimpuls weg.

Den Trigger mach ich ja jetzt schon softwaremäßig, das mit dem 
gleitenden Mittelwert ist aber so eine Sache, weil der ja immer 
hinterherläuft und dann bei einer plötzlichen Änderung mglw. nicht mehr 
im aktuellen Amplitudenbereich  oder zu tief liegt.

Werde das aber nochmal ausprobieren.

von Rainer P. (rapa)


Angehängte Dateien:

Lesenswert?

Robert K. schrieb:
> ich habe hier eingezeichnet, wie der Verlauf des Triggerwertes nach
> meinem Vorschlag oben aussieht. Es werden alle Impulse korrekt erkannt.
>
> wenn du hier eine konkrete Angabe machen könntest, so mit Zahlen und so,
> könnte man sagen, ob es so geht.
> Also welche Drehzahl kann die Welle aus dem Stillstand innerhalb 1
> Umdrehung erreichen? Ist das in deinem Beispiel die maximale
> Beschleunigung?

In meinem Diagramm sind die Y-Werte links ganz klein zu sehen. In der 
Textdatei die Werte dazu.
Bei der kurzen Periode liegt der Minwert bei ca. 60 und der Maxwert bei 
ca. 175. Bei der Langen Periode 50 /350.

Die Welle kann aus dem Stillstand ganz langsam starten, max. aber mit 2 
U/sek.

Vielen Dank für deine Mühe mit der Zeichnung, aber es wird nicht 
funktionieren, wenn die Beschleunigung einmal ein wenig schneller ist, 
würde der Wert erst wieder bei langsamer Umdrehung greifen (siehe grün 
im Bild). Weiterhin, wenn der Vorimpuls noch höher wäre, könnte das 
doppelt gezählt werden (siehe rot im Bild).

von Captain Zulu am Wochenende (Gast)


Lesenswert?

Rainer P. schrieb:
> Momentan mache ich es rein statisch, ich warte bis der Wert über 155
> liegt, und wenn er dann unter 74 liegt,

so wird das nichts.

Man muss mehrere Samples mit der Impulsform falten.
Nimm sowas wie eine x2 und ziehe den Gleichanteil ab, also

-10.5
-9.5
-7.5
-4.5
-0.5
4.5
10.5
17.5

Summe = 0

Das liefert dir ein Maximum an der Stelle, wo der Puls etwa sitzt. 
Sobald einer dieser Summenwerte zweimal kleiner ist, als einer davor, ->

Peak gefunden!

von Rainer P. (rapa)


Lesenswert?

Captain Zulu am Wochenende schrieb:
> Man muss mehrere Samples mit der Impulsform falten.
> Nimm sowas wie eine x2 und ziehe den Gleichanteil ab, also
>
> Das liefert dir ein Maximum an der Stelle, wo der Puls etwa sitzt.
> Sobald einer dieser Summenwerte zweimal kleiner ist, als einer davor, ->
....
> Peak gefunden!
SORRY, das verstehe ich nicht. Kannst Du mir das bitte mal genauer 
erklären oder hast du einen Link dazu? Wie gesagt, bin kein 
Nachrichtentechniker bzw. DSP-Spezi.

>".... mit der Impulsform falten ...." ?????

von Captain Zulu am Wochenende (Gast)


Lesenswert?

Du nimmst immer die letzten 8 samples und multiplizierst sie mit den 
Werten und addierst alles.

also Samples 0 ... 7,  1 ... 8, 2 ... 9

Der jeweilige Wert ist demnach:

-10.5 * x(t-7)
-9.5 * x(t-6)
-7.5 * x(t-5)
-4.5 * x(t-4)
-0.5 * x(t-3)
4.5 * x(t-2)
10.5 * x(t-1)
17.5 * x(t)

Das ergibt die Kurve

von ... (Gast)


Lesenswert?

Was du brauchst, sind die gleitenden Mittelwerte des Signalminimums
und des Signalmaximums. Dann kannst du auf eine prozentuale Schwelle
in dieser Differenz zuverlaessig triggern.
Die Mittelwertbildung darf natuerlich nicht zu lang erfolgen.
Gegebenenfalls muss man auch eine Gewichtung in die Mittelwertbildung
einbeziehen.

von hufnala (Gast)


Lesenswert?

Rainer P. schrieb:
> Das größte Problem ist jedoch, dass die Amplitude mit zunehmender
> Drehzahl auch einbricht

Gibt es dafür einen Grund? Vielleicht wäre es möglich dieses Verhalten 
zu ändern -> Ursache abstellen. Einen Tiefpass gibt es ja schon, ggf. 
mit nicht ganz optimalen Parametern?

//hufnala

von Rainer P. (rapa)


Angehängte Dateien:

Lesenswert?

Captain Zulu am Wochenende schrieb:
> Du nimmst immer die letzten 8 samples und multiplizierst sie mit den
> Werten und addierst alles.
> Das ergibt die Kurve
Achso, die Werte -10,5 usw. sind also absolut ernst gemeint. Dachte es 
wären Beispielzahlen. Aber es handelt sich wohl um ein Polynom y=0,5x^2 
- 0,5x -10,5

Warum auch immer ... :-)

Ich habe das mal mit den Werten gemacht und mit Excel geplottet (Bild 
T8). Blau der originale Wertbereich, Orange das Berechnete. Dann habe 
ich das nochmal mit 32 Werten gemacht ( y=0,5x^2 - 0,5x -170,5), in der 
Hoffnung das es irgendwie "glatter" wird, da ja mehr historische 
Messpunkte in die Berechnung einfließen, siehe Bild T32

Aber irgendwie eindeutig ist das auch nicht, bei x um die 5611 und 6711 
sieht es aus wie bei 2600 bis 4500.

> Sobald einer dieser Summenwerte zweimal kleiner ist, als einer davor, ->
> Peak gefunden!

Wird nicht funktionieren - oder ich habe es nicht verstanden.

von Rainer P. (rapa)


Lesenswert?

hufnala schrieb:
> Rainer P. schrieb:
>> Das größte Problem ist jedoch, dass die Amplitude mit zunehmender
>> Drehzahl auch einbricht
>
> Gibt es dafür einen Grund? Vielleicht wäre es möglich dieses Verhalten
> zu ändern -> Ursache abstellen. Einen Tiefpass gibt es ja schon, ggf.
> mit nicht ganz optimalen Parametern?

Das ist ein sehr guter Hinweis bzw. Anstoß. Ich werde mal den 
Wertverlauf aus dem ADC in Volt umrechnen und dann mit LT-Spice in den 
Tiefpass schicken und ein wenig experimentieren und vor allem die 
"Grenzfrequenz" deutlich erhöhen. Dann sollte die Amplitude auch nicht 
(merkenswert) einbrechen und ich kann sicher mit statischen Werten (80% 
vom Maxwert / 20% über den Minwert) einen Impuls triggern.

von Rainer P. (rapa)


Lesenswert?

... schrieb:
> Was du brauchst, sind die gleitenden Mittelwerte des Signalminimums
> und des Signalmaximums. Dann kannst du auf eine prozentuale Schwelle
> in dieser Differenz zuverlaessig triggern.
> Die Mittelwertbildung darf natuerlich nicht zu lang erfolgen.
> Gegebenenfalls muss man auch eine Gewichtung in die Mittelwertbildung
> einbeziehen.

Das waren auch meine ersten Überlegungen und es funktioniert nicht 
wirklich, wenn die Welle zum stehen kommt bzw. sich sehr langsam dreht.

von ... (Gast)


Lesenswert?

Ganz sicher funktioniert ein Trigger auf einen Wert zwischen
Minimum und Maximum. Man darf dann eben keine ungewichtete
Mittelwertbildung fuer die Ermittlung benutzen, sondern muss
sie in S/H gewissermassen statisch speichern.
Der Trigger selbst loest dann die Freigabe fuer eine neue
Ermittlung von Minimum und Maximum fuer das naechste Ereignis
aus. So passt sich das ganze von alleine an.

von W.S. (Gast)


Lesenswert?

Captain Zulu am Wochenende schrieb:
> Du nimmst immer die letzten 8 samples und multiplizierst sie mit den
> Werten und addierst alles.

Rainer P. schrieb:
> Aber es handelt sich wohl um ein Polynom y=0,5x^2

Finde den Fehler!

Solche Filter funktionieren bekanntlich so:

Y(n) = X(n) * a(k) + X(k-1) * a(k-1) + ... + X (k-N+1) * a(k-N+1)

demnach:

Y(23) = X(23) * a(7) + X(22) * a(6) + ... + X(16) * a(0)

von Rainer P. (rapa)


Lesenswert?

hufnala schrieb:
> Rainer P. schrieb:
>> Das größte Problem ist jedoch, dass die Amplitude mit zunehmender
>> Drehzahl auch einbricht
>
> Gibt es dafür einen Grund? Vielleicht wäre es möglich dieses Verhalten
> zu ändern -> Ursache abstellen. Einen Tiefpass gibt es ja schon, ggf.
> mit nicht ganz optimalen Parametern?
>
> //hufnala

Hallo Hufnala,

ja, den Wald vor lauten Bäumen nicht gesehen: Tiefpass optimiert, und 
schon sind alle Amplituden gleich groß und können einfach ausgewertet 
werden.

Das System "lernt" den größten und niedrigsten Wert, was nach ein paar 
Umdrehungen erledigt ist. Mit einem Software-Trigger der bei 80% bzw. 
20% auslöst arbeitet das System sehr zuverlässig, selbst wenn nun die 
Welle steht.

DANKE AN ALLE !!!!

von Hp M. (nachtmix)


Lesenswert?

Rainer P. schrieb:
> Drehzahlermittlung einer Welle die sich recht
> langsam dreht (max. 1 U/sek oder sogar stehen bleibt). Die Welle hat
> eine optische Kennzeichnung und ist nur über eine Art Schaufenster zu
> erkennen. Leider ist die Oberfläche der Welle mit der Kennzeichnung
> nicht ideal sauber und somit entsteht kein "sauberer" Impuls.

Ideale Bedingungen für eine optische Computermaus.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.