Forum: Digitale Signalverarbeitung / DSP / Machine Learning Robuste Erkennung der Peaks nahe der Hüllkurve eines Signals


von Paul H. (powl)


Angehängte Dateien:

Lesenswert?

Hi, ich arbeite aktuell daran, die Geschwindigkeit eines DC-Motors 
anhand des Verlaufs seiner Stromaufnahme zu erkennen. Aktuell verfahre 
ich folgendermaßen:
1) Motorstrom über Shunt mit 4kHz abtasten
2) Moving Average Filter mit 100 Taps auf das Signal anwenden
3) Differenzieren
4) Korrelation der letzten 2000 Samples mit dem gesamten Signal (16000 
Samples) bilden.
dabei kommt der Signalverlauf im Anhang raus.

Theoretisch kann ich die aktuelle Drehzahl einfach anhand des Abstands 
der erkennbaren Peaks abschätzen.

Mit bloßem Auge klar auszumachen sind die hohen Peaks abseits des 
Grundrauschens. Quasi die obere Hüllkurve. Welcher Algorithmus hilft mir 
dabei, diese Peaks zu erkennen? Und zwar in Echtzeit.

Aktuell habe ich ja einfach eine Kurve mit dem Oszi aufgenommen aber am 
Ende möchte ich das gerne auf einem Mikrocontroller implementieren, der 
mir die Drehzahl möglichst robust in Echtzeit ausgibt. Spontane 
Drehzahländerungen sind nicht vorgesehen. Ich bräuchte wohl eine Art 
Clustering-Algorithmus, der die oberen Peaks, nahe der Hüllkurve von dem 
unteren Geschlonz trennen kann.

Ideen?

: Bearbeitet durch User
von Paul H. (powl)


Angehängte Dateien:

Lesenswert?

Hier mal noch die
1) stromaufnahme
2) stromaufnahme nach MA-Filter 100 Taps
3) 2) differenziert.

von Thomas (kosmos)


Lesenswert?

wenn der Wert eine bestimmten Schwelle überschreitet startest du einen 
Timer bis zur nächsten Schwelle. Aus dem Timerwert kannst du dann die 
Zeit bzw. Drehzahl ableiten.

Ein DC Motor erzeugt doch Bürstenfeuer und Induktionsspitzen dieses 
steht in einem festen Verhältniss zur Drehzahl.

Da würde ich nicht über deine Strommessung und die Abtastung des ADC 
gehen sondern direkt die Zeit zw. den Peaks auswerten.

von Paul H. (powl)


Lesenswert?

Thomas O. schrieb:
> wenn der Wert eine bestimmten Schwelle überschreitet startest du
> einen

Den Ansatz mit der festen Schwelle hab ich schnell wieder verworfen. 
Manchmal erzeugt der Motor halt auch Signalformen, die zu einer 
Korrelation führen, deren Amplitude sehr stark schwankt. Erstens weiß 
ich gar nicht, wie ich die Schwelle dann festlegen soll und zweitens 
kann es sein, dass wenn bei einer zu niedrigen Schwelle die Amplitude zu 
groß wird auf einmal Signalanteile der Korrelation über die Schwelle 
geraten, die ich gar nicht erfassen wollte.

> Ein DC Motor erzeugt doch Bürstenfeuer und Induktionsspitzen dieses
> steht in einem festen Verhältniss zur Drehzahl.
>
> Da würde ich nicht über deine Strommessung und die Abtastung des ADC
> gehen sondern direkt die Zeit zw. den Peaks auswerten.

hm, also quasi eher die Gegen-EMK vom Motor messen? Aber wenn ich den 
Motor mit Konstantspannung füttere müssten sich ja alle Spannungen, die 
der Motor erzeugt auch im Stromverlauf invers wiederfinden, oder?

: Bearbeitet durch User
von Thomas (kosmos)


Lesenswert?

was soll diese einheit dv/dt bedeutet ist das die Geschwindigkeit des 
Spannungsanstieges/abfalles während der Kommutierung?

Nimm doch irgendeine Gabellichtschranke um die Drehzahl zu erfassen oder 
zur Not einen IC der eine drehzahlabhängige Spannung ausgibt falls du es 
Analog erfassen willst.

von Paul H. (powl)


Lesenswert?

Thomas O. schrieb:
> was soll diese einheit dv/dt bedeutet ist das die Geschwindigkeit des
> Spannungsanstieges/abfalles während der Kommutierung?

Ja, das ist die numerische differenziation der geglätteten 
Shuntspannung.

Thomas O. schrieb:
> Nimm doch irgendeine Gabellichtschranke um die Drehzahl zu erfassen oder
> zur Not einen IC der eine drehzahlabhängige Spannung ausgibt falls du es
> Analog erfassen willst.

Klar. Aber es geht weniger darum, das Problem irgendwie zu lösen sondern 
ich würde es gerne sensorless schaffen. :-)

von Hermann K. (r2d2)


Lesenswert?

Nur ne Idee: Du könntest dir Höhe des letzten Peaks merken und alles was 
höher als z.B. 2/3 davon ist wird als der nächste Peak erkannt.

von Thomas (kosmos)


Lesenswert?

Kannst du mal mit dem Oszi die Versorgungsspannung direkt am Motor und 
an der Freilaufdiode messen und mal ein Bild davon reinstellen?

von Paul H. (powl)


Lesenswert?

Thomas O. schrieb:
> Kannst du mal mit dem Oszi die Versorgungsspannung direkt am Motor und
> an der Freilaufdiode messen und mal ein Bild davon reinstellen?

Naja das siehst du quasi an der stromaufnahme.png. Das ist die Spannung 
die über dem lowside-Shunt am Motor anliegt. Eine Freilaufdiode gibt es 
nicht, der Motor wird mit Konstantspannung betrieben.

von Thomas (kosmos)


Lesenswert?

Dann hast du ja schon was zum Triggern. Pass es ggf. mit einem 
Widerstand und einer Z-Diode an und geb es auf auf einen 
Interrupteingang.

von Paul H. (powl)


Angehängte Dateien:

Lesenswert?

Nein, das funktioniert so einfach nicht. Die Stromaufnahme zeigt nicht 
immer so schöne Peaks im Signalverlauf, auf die ich einfach triggern 
könnte. Um die Berechnung der Korrelation werde ich wohl leider nicht 
drum rum kommen. Siehe Signalverlauf im Anhang. Man erkennt zwar schön 
ein Muster, aber jede Periode hat mehrere in etwa gleich hohe Peaks, die 
man nicht auseinanderhalten kann.

Wenn es so einfach wäre hätte ich mir ja nicht die Mühe gemacht, einen 
so komplexen Lösungsansatz zu verfolgen. ?

: Bearbeitet durch User
von Tobias P. (hubertus)


Lesenswert?

Evt könnte man mit einer FFT was machen?

Die Hüllkurve kannst du auch mit einem Hilberttransformator bestimmen.

Oder mit einem einfachen Algorithmus:

x = neuer ADC-Wert
wenn x > x_huell: x_huell = x
sonst x_huell = x_huell*tau

eine sehr rudimentäre Hüllkurve erhälst du dann in x_huell. Die 
"Zeitkonstante" tau gibt an, wie schnell diese Umhüllende dem Signal 
folgt. Damit wird dann eine Art Einweggleichrichtung wie bei einem 
AM-Demodulator nachgebildet.

Aber ich glaub nicht, dass das zielführend ist. Aber das Spektrum des 
Motorstroms könnte evt. interessant sein.

Des Weiteren könntest du einen einfachen Luenberg-Beobachter basteln. 
Die Spannung am Motor kennst du ja, den Strom ebenfalls. Der Beobachter 
schätzt die Zustandsvariablen - in dem Fall die Drehzahl. Die ist ja mit 
der Spannung und dem Strom über Differentialgleichungen verknüpft. Die 
bildet der Beobachter nach und liefert als Output eben beispielsweise 
die Drehzahl. Ein Modell (Übertragungsfunktion) des Motors hast du? ich 
hatte mal das umgekehrte Problem - Drehzahl war von einem Geber bekannt, 
nicht aber der Strom. Der konnte aus Spannung und Drehzahl geschätzt 
werden und als Input für einen Drehmomentregler verwendet werden. Wenn 
das geht, dann müsste das Umgekehrte ja auch möglich sein. Ich schau mal 
ob ich die Simulinkdatei noch finde.

von jan (Gast)


Lesenswert?

Warum korrelierst du überhaupt? Wie kommst du von der Spannung auf die 
Drehzahl? Rein theoretisch und im idealen Falle?

Falls die numerische Ableitung zu rauschanfällig ist, nimm Savitzky 
Golay Ableitungsfilter: 
https://de.mathworks.com/help/signal/ref/sgolay.html und 
https://de.wikipedia.org/wiki/Savitzky-Golay-Filter.

Ist als einfacher FIR Filter zu implementieren.

von Jens U. (Gast)


Lesenswert?

jan schrieb:
> Warum korrelierst du überhaupt? Wie kommst du von der Spannung auf die
> Drehzahl? Rein theoretisch und im idealen Falle?

Bei einem reinen DC geht das nicht, aber die Spannungsrückwirkung ist 
bei einer realen Spannnungsquelle mit Ri immer vorhanden und messbar. 
Daran kann man sich leicht aufhängen. Das Thema ist ja bereits mehrfach 
gelöst.

jan schrieb:
> Falls die numerische Ableitung zu rauschanfällig ist, nimm Savitzky
> Golay Ableitungsfilter:

Das halte ich für deplaziert, weil zur Dämpfung der peaks eine 
Ordnungszahl nötig wäre, die Krummungen nach sich ziehen würde, die nur 
zu falschen Ableitungen führt. Es ist sinnvoller die Spannungskurven mit 
der tatsächlichen Rückwirkung der Spannung, als eine E-Funktion gefaltet 
mit der Ansteuerung zu korrellieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.