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
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
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?
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.
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
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.
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.
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
> 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.
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?
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 ;-)
Mir fällt gerade auf ich habe ein Plus bei der Formel vergessen!!! es lautet:
Ausgeschrieben also:
Das entspricht approximativ demhier:
Öhhm, wenn man zeitdiskret rechnet, werden aus integralen stimmen (wenn man das schon so aufschreiben möchte).
Wenn ich mich nicht vertue, macht Kevins Formel das gleiche und ist kürzer :) Kann man ineinander umformen, wenn man dein Delta einsetzt.
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.
Hallo, wie umgeht man bei variabler Abtastrate ein Aliasing im Messignal? WS
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.
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.
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
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?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.