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
Hier mal noch die 1) stromaufnahme 2) stromaufnahme nach MA-Filter 100 Taps 3) 2) differenziert.
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.
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
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.
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. :-)
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.
Kannst du mal mit dem Oszi die Versorgungsspannung direkt am Motor und an der Freilaufdiode messen und mal ein Bild davon reinstellen?
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.
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.
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.