Forum: Digitale Signalverarbeitung / DSP / Machine Learning PID Regler mit variabler Abtastrate


von Aaron K. (aaron_b_k)


Lesenswert?

Hi,

ich möchte einen Motor regeln.

Der Motor besitzt 2 Hall Sensoren zum Erfassen der Drehzahl. Bei jedem 
Auslösen eiens Hall-Sensors wird der Ausgangssignalwert getogglet, 
sprich von 1 auf 0 oder von 0 auf 1 geschaltet.

Die Zeitmessung, zum Ermitteln der Drehzahl, erfolgt jeweils bei einer 
vollen Umdrehung.

Um eine möglichst dynamische Regelung zu erreichen wird bei jedem 
Erfassen der Drehzahl die PID-Regler-Funktion aufgerufen. Somit besitzt 
das System jedoch keine Konstante Samplezeit mehr.

Mein Lösungsansatz ist die Samplezeit mit einzubeziehen.

-----------Formelzeichen----------------------------------------

out_pid(z): PID-Regler Ausgangswert (Stellgröße)

in_pid(z) : PID-Regler Eingangswert (Regelabweichung)

out_p(z)  : P-Regler Ausgangswert

out_i(z)  : I-Regler Ausgangswert

out_d(z)  : D-Regler Ausgangswert

K_p       : Proportional-Beiwert

K_i       : Integral-Beiwert

K_d       : Differenzier-Beiwert

t_samp    : Sample-Zeit

-----------Formel-----------------------------------------------

out_pid(z) = out_p(z) + out_i(z) + out_d(z)

out_p(z) = in_pid(z) * K_p

out_i(z) = out_i(z - 1) + (in_pid(z)  K_i  t_samp)

out_d(z) = -1 * ((in_pid(z-1) - in_pid(z)) / t_samp) * K_d

Meine Idee ist es, dass die Samplezeit mit beachtet wird, sodass sich im 
niedrigen Drehzahl bereich (bei hoher Sample-Zeit) ein weniger 
agressives Verhalten ergibt, da der Regler dort schwingt.

Sind meine Überlegungen richtig? Ziel ist es wie gesagt, das Schwingen 
im niedrigen Drehzahlbereich zu minimieren.

Vielen Dank für eure Antworten
Gruß Aaron

von Kevin M. (arduinolover)


Lesenswert?

Aaron K. schrieb:
> Ziel ist es wie gesagt, das Schwingen
> im niedrigen Drehzahlbereich zu minimieren.

Stell deinen Regler richtig ein, dann passiert das nicht.

Für einen Motor nimmt man eher eine kaskadierte Regelung, Stromregler 
mit überlagertem Drehzahl Regler.

PID ist hier in der Regel nicht nötig, PI reicht normal aus. 
Einstellkriterien wären Betragsoptimum (Strom) und symmetrisches Optimum 
(Drehzahl)

Eine Variable Abtastzeit würde ich persönlich vermeiden, ansonsten 
kannst du I und D mit dem entsprechenden dT berechnen sofern das bekannt 
ist.

Unabhänig davon wäre es interessant zu wissen welche Kommutierungsart du 
nutzt und woher der Rotorwinkel kommt. Oder handelt es sich um einen 
Gleichstrommotor?

PS: dein Integralanteil wird imho falsch berechnet.

: Bearbeitet durch User
von Aaron K. (aaron_b_k)


Lesenswert?

Den I-Anteil habe ich in der Zwischenzeit bereits verbessert. Er lautet 
jetzt:

out_i(z) = K_i * (out_i(z - 1) + in_pid(z) * t_samp)

Ich verwende einen Gleichstromotor, der mittels PWM angesteuert wird.

Ich kann meine Hardware leider nicht anpassen (altes Gerät usw...). 
Somit bin ich auf das Feedback der Hall-Sensoren beschränkt.

Warum würdest du keine variable Abtastzeit vermeiden?

von Kevin M. (arduinolover)


Lesenswert?

Aaron K. schrieb:
> Warum würdest du keine variable Abtastzeit vermeiden?

Weil man idr. gerne eine konstante Sample Zeit hat. Da mag es vielleicht 
auch unterschiedliche Meinungen geben. Ich sage nicht das es überhaupt 
nicht geht nur das ich es vermeiden würde.

Aaron K. schrieb:
> out_i(z) = K_i * (out_i(z - 1) + in_pid(z) * t_samp)

das ist imho immer noch falsch... da fehlt ein Faktor 0,5 und deine 
Klammer am Ende sitzt falsch.

Aaron K. schrieb:
> Ich verwende einen Gleichstromotor, der mittels PWM angesteuert wird.

Dann würde ich dennoch eine kaskadierte Regelung verwenden. Das ist 
einfacher einzustellen. Eine Strommessung vorausgesetzt.

Aaron K. schrieb:
> Ich kann meine Hardware leider nicht anpassen (altes Gerät usw...).
> Somit bin ich auf das Feedback der Hall-Sensoren beschränkt.

Gegen die Spricht auch nichts, der Regler kann ja trotzdem mit einer 
schnelleren Abtastzeit laufen.

von Aaron K. (aaron_b_k)


Lesenswert?

Wei sähe denn die richtige Gleichung aus?

von Kevin M. (arduinolover)


Lesenswert?

Aaron K. schrieb:
> Wei sähe denn die richtige Gleichung aus?

integral += 1/2 * (in_pid(z) + in_pid(z-1)) * t_samp
out_i(z) = ki * integral

Wichtig beim Integral, den anti windup nicht vergessen.

Alternativ kann man auch die Gleichung aus dem Laplace Bereich 
Z-Transformieren um direkt einen Algorithmus zu bekommen, das setzt aber 
eine konstante sample Zeit voraus.

: Bearbeitet durch User
von Klaus W. (mfgkw)


Lesenswert?

Den I-Anteil mit der sample-Zeit zu multiplizieren erscheint mir 
plausibel (bzw. wenn man seine Ks schon mit einer bestimmten sample-Zeit 
t_samp_0 ermittelt hatte, dann halt mit t_sample_aktuell/t_samp_0; so 
hat man für den Fall t_sample_aktuell==t_samp_0 das bisherige 
Verhalten).

Der P-Anteil ist ja zeitunabhängig, keine Korrektur.

Und entsprechend müsste man den D-Anteil durch die Samplezeit teilen 
bzw. durch  t_sample_aktuell/t_samp_0, um das bisherige Regelverhalten 
zu bekommen.

Nichtsdestotrotz kann es sein, daß sich das System bei unterschiedlichen 
Drehzahlen anders verhält (z.B. träger bei hohen Drehzahlen).
Dann wird der Ansatz, den I-Anteil mit der Samplezeit zu multiplizieren 
und den D-Anteil zu teilen, zu einfach sein.
Dann muß man wohl für 2 oder 3 unterschiedliche Drehzahlen getrennt über 
die Parameter nachdenken und sinnvolle Faktoren ermitteln.
Für andere Drehzahlen dazwischen dann interpolieren...

Kevin M. schrieb:
> Stell deinen Regler richtig ein, dann passiert das nicht.

Daß der für niedrige Drehzahlen "richtig" eingestellte Regler auch für 
hohe Drehzahlen optimal ist, ist nicht gesagt.

von Aaron K. (aaron_b_k)


Lesenswert?

Hi danke für die Antwort. Hab die Formel angepasst et voìla alles läuft.

Die varialbe Sample-Zeit läuft jetzt auch super. Man muss diese nur im 
Integral/Differenzial mitbetrachten.

Die Berechnung des D- und des P-Terms sind gleich geblieben.

von Kevin M. (arduinolover)


Lesenswert?

Aaron K. schrieb:
> Hab die Formel angepasst et voìla alles läuft.

Du hast halt nicht integriert, dadurch hast du immer einen statischen 
Fehler.

Klaus W. schrieb:
> Daß der für niedrige Drehzahlen "richtig" eingestellte Regler auch für
> hohe Drehzahlen optimal ist, ist nicht gesagt.

Hat auch keine behauptet, mit genug Phasenreserve ist das aber idr. kein 
Problem. Zumindest hatte ich bisher mal keins. Aber 100% Garantie gibt 
es halt nie.

Aaron K. schrieb:
> Die Berechnung des D-

Wenn dein System nicht zum Schwingen neigt, würde ich den D-Anteil 
weglassen. Der ist für das System nicht nötig und macht es schwerer den 
Regler robust einzustellen. Ein D-Anteil wird optimaler Weise auch 
gefiltert, diskret zu differenzieren ist allgemein keine sonderlich 
schöne Sache.

: Bearbeitet durch User
von Aaron K. (aaron_b_k)


Lesenswert?

> Du hast halt nicht integriert, dadurch hast du immer einen statischen
> Fehler.

Mein Fehler war, dass ich anstelle des Integrals das letzte Ergebnis des 
I-Anteils verwendet habe, das meintes du oder?

Meine Formeln lauten jetzt:

-----------Formelzeichen----------------------------------------


PID-Regler Ausgangswert (Stellgröße):

PID-Regler Eingangswert (Regelabweichung):

P-Regler Ausgangswert:

I-Regler Ausgangswert:

D-Regler Ausgangswert:

Proportional-Beiwert:

Integral-Beiwert:

Differenzier-Beiwert:

Sample-Zeit:

-----------Formel-----------------------------------------------





Damit sollte jetzt alles stimmen, oder nicht?

Das bilden des Integral geschieht nach Trapezregel:
https://de.wikipedia.org/wiki/Trapezregel

Das Differenzial wird durch die Änderung des letzten- zum jetzigen Wert 
errechnet.

von Kevin M. (arduinolover)


Lesenswert?

Aaron K. schrieb:
> Mein Fehler war, dass ich anstelle des Integrals das letzte Ergebnis des
> I-Anteils verwendet habe, das meintes du oder?

Ja.

Aaron K. schrieb:
> Damit sollte jetzt alles stimmen, oder nicht?

Die Formel für den Integralanteil finde ich seltsam, wo genau hast du 
die im Wikipedia Artikel gefunden?

von Aaron K. (aaron_b_k)


Angehängte Dateien:

Lesenswert?

Kevin M. schrieb:

> Die Formel für den Integralanteil finde ich seltsam, wo genau hast du
> die im Wikipedia Artikel gefunden?

Die habe ich dort gar nicht gefunden. Aber an sich besagt die 
Trapezregel ja nichts anders, als dass das Integral als ein Rechteck mit 
der Höhe des letzten Wertes, der breite des Abtastintervalls und ein 
Dreieck mit der Änderung des letzten Wertes zum jetzigen Wert, 
approximiert wird.

So hat man einen geringeren Fehler, als wenn man einfach den letzten 
oder jetzigen Wert mit einer Rechteckapproximation verwendet.

Ich habe mal alle Fälle gezeichnet und im Anhang beigefügt.

Oder verstehe ich das falsch? Verbesser mich bitte falls ich einen 
Fehelr gemacht habe.

Bisher Danke für die Antworten hat aufjedenfall weitergeholfen ;-)

von Aaron K. (aaron_b_k)


Lesenswert?

Mir fällt gerade auf ich habe ein Plus bei der Formel vergessen!!!

es lautet:

Ausgeschrieben also:

Das entspricht approximativ demhier:

von jemand (Gast)


Lesenswert?

Öhhm, wenn man zeitdiskret rechnet, werden aus integralen stimmen (wenn 
man das schon so aufschreiben möchte).

von jemand (Gast)


Lesenswert?

Ich meine Summen.

von jemand (Gast)


Lesenswert?

Wenn ich mich nicht vertue, macht Kevins Formel das gleiche und ist 
kürzer :)
Kann man ineinander umformen, wenn man dein Delta einsetzt.

von Kevin M. (arduinolover)


Lesenswert?

Aaron K. schrieb:
> Oder verstehe ich das falsch? Verbesser mich bitte falls ich einen
> Fehelr gemacht habe.

An sich rechnest du das gleiche, die Notation ist imho recht 
ungewöhnlich. Das Delta ist an der Stelle eher ungewöhnlich.

von WS (Gast)


Lesenswert?

Hallo,
wie umgeht man bei variabler Abtastrate ein Aliasing im Messignal?

WS

von Aaron K. (aaron_b_k)


Lesenswert?

jemand schrieb:
> Öhhm, wenn man zeitdiskret rechnet, werden aus integralen stimmen

Hast recht. Zur Vollständigkeit nochmal:

es lautet:


Ausgeschrieben also:


Das entspricht approximativ demhier:

Folgender Ausdruck entspricht lediglich der durch ein Trapez 
approximierten Fläche. Kann man sicherlich schicker berechnern (z.B. mit 
der Formel von Wikipedia oder der Trapezflächen-Formel etc...), aber am 
Ende sollte sowieso dasselbe rauskommen. Bei mir passt diese Formel 
gerade gut in die Software. Sonst wäre eine andere Formel sicherlich 
auch möglich.

von Aaron K. (aaron_b_k)


Lesenswert?

WS schrieb:
> wie umgeht man bei variabler Abtastrate ein Aliasing im Messignal?

Naja in meinem Fall ist die variable Abtastrate stets die maximal 
mögliche. Ich regle einen Motor der 2 mal pro Umdrehung ein Event 
auslöst. Die Zeiten zwischen diesesn Events messe ich.

Da somit die Abtatsfrequenz maximal der 2-fachen Frequenz des zu 
messenden Signals entspricht, bin ich gerade so über der Grenze des 
Shannon-Nyquist Theorems. Dies besagt ja, dass die Abtastfrequenz mehr 
als das 2-fache der Frequenz des zu messenden Signals zu betragen hat.

Die Drehzahl wird Teifpassgefiltert, sodass Anti-Aliasing und Rauschen 
abgeschwächt werden.

von Aaron K. (aaron_b_k)


Lesenswert?

Ansonsten fällt mir noch ein variables Filter ein, dass ebenfalls die 
Abtastzeit mitbeachtet und dementsprechend die Grenzfequenzen 
verschiebt. Dann muss man aber die Koeffizienten während der Runtime 
berechnen...

Um ehrlich zu sein habe ich keine Ahnung, wie man die Koeffizienten 
händisch/numerisch berechnet, scheint mir aber doch relativ aufwändig zu 
sein.

Belehrt mich gerne etwas besserem ;D

von Eins N00B (Gast)


Lesenswert?

WS schrieb:
> Hallo,
> wie umgeht man bei variabler Abtastrate ein Aliasing im Messignal?
>
> WS

In dem Fall: Gar nicht, weil man den Wert vor der AD-Wandlung ja nicht 
weiter Filtern kann. Aliasing kann man doch nach der Abtastung höchstens 
ja nur noch abschwächen, zB über Fensterfunktionien.
So ein Drehzahlsignal sollte durch die Masseträgheit allerdings eh doch 
schon nach oben im Frequenzbereich limitiert sein, oder?

von Jayden Bubblegum Blue (Gast)


Lesenswert?

Aaron K. schrieb:
> Um ehrlich zu sein habe ich keine Ahnung, wie man die Koeffizienten
> händisch/numerisch berechnet, scheint mir aber doch relativ aufwändig zu
> sein.

Indem man die kontinuierlichen Übertragungsfunktionen mittels bilinearer 
Transformation (akaTustin) in den z-Bereich wandelt und dann mittels 
Verschiebungssatz den Regelalgorithmus erhält.

von Wolfgang (Gast)


Lesenswert?

Jayden Bubblegum Blue schrieb:
> Indem man die kontinuierlichen Übertragungsfunktionen mittels bilinearer
> Transformation (akaTustin) in den z-Bereich wandelt

Gibt es irgendeine Notwendigkeit, einen zeitkontinuierlichen Regler zu 
verwenden, um ihn dann per Bilineartransformation so halbwegs in ein 
ähnliches Abtastsystem zu transformieren.
Warum nicht gleich einen Regler, der zeitdiskret formuliert ist.

von Tippgeber (Gast)


Lesenswert?

Wolfgang schrieb:
> Warum nicht gleich einen Regler, der zeitdiskret formuliert ist.
Weil man bei hohen Drehzahlen eben einen engeren Regelkreis braucht und 
die dynamisch eingespeisten Regelfehler, eher hinnehmbar sind, während 
bei geringeren Drehzahlen mehr Laufruhe förderlich ist und man mit 
geringeren Abtastraten davon profitiert, dass sich Fehler nicht 
akumulieren.

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.