Guten alle, ich habe ein PI Regler mit C programmiert. das algorithmud sieh einfach zu sein´.Alle 100µ werden die Werte gelesen. Wenn ich das Programm start läuft einige massen gut im leerlauf. die PWM (y)ist unruhig, wackelt. läuft aber auch unrihig. Beim start braucht viel Zeit(im Bereich zwischen 10 bis 20ms) bis der Stabiltät erreicht wird. beim belastet des Reglers läuft die I-Anteil nur im Minus und regelt nich nach. Ich habe danach ein Anti winup eingebaut, um das Verlauf von I-Anteil zu begrenzen, wenn dies den y überschreit ändert nicht am Problem. im leerlauf geht, aber bei der Belastungsinkt yi und bleibt den yMin. meine Führungsgröße liegt bei 2808 entspricht ein 24Guten alle, ich habe ein PI Regler mit C programmiert. das algorithmud sieh einfach zu sein´.Alle 100µ werden die Werte gelesen. Wenn ich das Programm start läuft einige massen gut im leerlauf. die PWM (y)ist unruhig, wackelt. läuft aber auch unrihig. Beim start braucht viel Zeit(im Bereich zwischen 10 bis 20ms) bis der Stabiltät erreicht wird. beim belastet des Reglers läuft die I-Anteil nur im Minus und regelt nich nach. Ich habe danach ein Anti winup eingebaut, um das Verlauf von I-Anteil zu begrenzen, wenn dies den y überschreit ändert nicht am Problem. im leerlauf geht, aber bei der Belastungsinkt yi und bleibt den yMin. meine Führungsgröße liegt bei 2500 digit entspricht eine u von 24v deswegen wähle ich 2000 und 3000 als Grenze. ist das zu große oder klein mit Parametr kp und ki habe ich schon viel gespielt. was kan das problem an diesem Regler sein? ich nehmme zum Beispiel an kp=1 und ki=1000(die sing von dem analoge system). ki*Ta ergibt 0,1. wie kann jetz meine begrenzung richtig eingestellt werden? kommt das Problem vielleicht von der I-Anteil odre ist der I-Anteil nur Folge? ich weiß nicht was passiert mit dem system. bitte um typs geben mit Parametr kp und ki habe ich schon viel gespeilt. was kan das problem an diesem Regler sein? ich nehmme zum Beispiel an kp=1 und ki=1000(die sing von dem analoge system). ki*Ta ergibt 0,1. wie kann jetz meine begrenzung richtig eingestellt werden? kommt das Problem vielleicht von der I-Anteil odre ist der I-Anteil nur Folge? ich weiß nicht was passiert mit dem system. bitte um typs geben
Hallo Gertro, hier ein sehr guter Artikel zum Thema. http://www.rn-wissen.de/index.php/Regelungstechnik Unter Punkt 7 wird auf Methoden zur Dimensionierung eingegangen. In Deinem Fall sollte bei dem empirischen Vorgehen zu Beginn nur der P - Anteil getestet werden. Danach nimmt man den I - Antei langsam dazu. Eigentlich dürfte es mit den PI - Regler keine grossen Schwierigkeiten geben. Beim PID - Regler wird es dann komplizierter. Gruss Klaus.
hallo zusammen, ich komme wieder mit dem gleichen Problem, aber jezt, um eine zustimmung meine Idee zu haben. im wikipedia habe ich heute was gelesen und ich denke, wenn dies Wahr ist, könnte es sein, der Grung Warum mein Regler nicht nachregelt. Im PI Regler habe ich eine Begrenzung von esum bzw. yi eingesetzt: Windu Effekt ki*Ta*esum= ymax --> esum=ymax/(ki*Ta) oder esum=yMin/(ki*Ta) In Mein Program wie Ganz oben beschrieben wurde, beim belasten geht die stellgröße in eine Richtung und bleibt an der Grenze. jetzt habe ich gelesen, dass die I-Anteil muss auf die Stellgröße-Grenzen entgegen begrenzt. wenn ich gut verstande , das bedeutet für mich: if (esum <yMin){ esum = -ymin; } else if(esum > yMax){ esum = -yMax } könnte jemand mir diese zustimmen? oder was dazu sagen Schönes Wochenende
1 | x_normiert= (x * 1000); // Normierung |
2 | w_normiert= (w * 1000); // |
3 | e_normiert=(x_normiert-w_normiert); |
4 | e= (e_normiert)/1000; |
Warum da erst mit 1000 multiplizieren um es dann wieder durch den Wert zu teilen? e = x - w ergibt genau das gleiche und e_normiert nutzt du ja sowieso nicht weiter. ----------------------------------------------------------------------
1 | yp_normiert/1000; |
Was macht diese Zeile? ----------------------------------------------------------------------
1 | int PID_Berechnung( int x, int w) |
2 | ...
|
3 | y=y_normiert/1000 ; // Stellglied der Regler |
4 | |
5 | if(y<2500){ |
6 | y=2500; |
7 | }
|
8 | else if(y>3000){ |
9 | y=3000 |
10 | }
|
11 | |
12 | return y; |
Dein Datentyp für y scheint int zu sein. Int wird je nach System anders interpretiert, je nach Wortbreite deines Systems. Bei einem 8-Bit-System hat int auch nur 8 Bit, beim 16-Bit-System dementsprechend 16 Bit usw. Da du nichts zu deinem System sagst, ist int ersteinmal nichtssagend. Was man nur sagen kann: Bei 8 Bit wäre sowieso bei 255 Schluss, da ist an Werte von 2500 oder 3000 nicht zu denken für y und bei 16-Bit wird dir deine komische 1000-Normierung Probleme bereiten, wenn dein y_normiert auch int ist. Als Tipp: Schau dir mal die Datentypen int8_t, int16_t, int32_t usw an, da siehste nämlich sofort wieviel Bit du in so einer Variable speichern kannst.
kann ich dir nicht zustimmen. Sah vorher besser aus. Aber da sind noch einige Zeilen seltsam... Ich muss ehrlich gesagt zugeben, dass dein Text etwas anstrengend zu lesen ist ;) folgende Vorschläge zum suchen: - wird das Ergebnis deiner Berechnungen jedesmal irgendeiner Variablen zugewiesen? - machen die Normierungen immer Sinn? nicht dass da mal ein Faktor 1000 übrig bleibt - ist die Abtastrate des Algorithmus konstant und richtig gewählt? - D-Anteile schwingen, I-Anteile können instabilität verursachen (bei niedriger Abtastrate sieht beides gleich aus)
Thorsten schrieb: > Warum da erst mit 1000 multiplizieren um es dann wieder durch den Wert > zu teilen? Festkommaarithmetik > Dein Datentyp für y scheint int zu sein. Int wird je nach System anders > interpretiert, je nach Wortbreite deines Systems. Bei einem 8-Bit-System > hat int auch nur 8 Bit, beim 16-Bit-System dementsprechend 16 Bit usw. Ääätsch, falsch. Int ist in einer 8 bit Architektur - entgegen der Suggestion durch den Namen - nicht 8 bit breit.
Michael H. schrieb: > Thorsten schrieb: >> Warum da erst mit 1000 multiplizieren um es dann wieder durch den Wert >> zu teilen? > Festkommaarithmetik War mir klar, dass das kommt. In diesem Fall ist das aber unnötig.
1 | x_normiert= (x * 1000); // Normierung |
2 | w_normiert= (w * 1000); // |
3 | e_normiert=(x_normiert-w_normiert); |
4 | e= (e_normiert)/1000; |
x_normiert und w_normiert sind beides Zahlen, die mit drei Nullen enden. Ziehe ich den einen vom anderen ab, bleiben bei e_normiert immer noch drei Nullen am Ende, wieder durch 1000 geteilt, ändert sich nichts im Vergleich zu dem Fall, wenn man direkt e = x-w gerechnet hätte.
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.