Hallo, wie gehe ich grundlegend an folgendes Problem und wo finde ich vielleicht einige Beispiele: Mein Regler erhält einmal pro Millisekunde sowohl einen Istwert, als auch einen neuen Sollwert. Daraus soll nun ein analoges Ausgangssignal zur Ansteuerung einer Motorelektronik erzeugt werden. Was muss ich jetzt in meiner Software mit den einstellbaren P-, I- und D-Reglerparametern machen, damit ein typischer PID-Regler entsteht?
Als näcstes benötigst du die Stellgröße, dass ist bei einem Motor zB die PWM mit der die Geschwigkeit oder Drehmoment bestimmt wird. Jetzt benötigst du einen mathematischen zusammenhang über den Fehler, also Abweichung zwischen Ist und Sollwert und der Stellgröße. Am einfachsten ist der P-Regler, da multiplizierst du den Fehler eben mit deinem P und das skalierst du diretk auf die PWM, um dann den statischen Restfehler zu bewältigen nimmt man den I-Teil, der reduziert diesen konstanten Anteil mehr oder weniger schnell gen 0 und schon hat man das richtige Ergebnis :) D-Anteil habe ich selber noch nicht benutzt, ich glabue der ist eher was für Sprunghafte Änderungen, also ich glaub mit PI solltes du bei einem Motor erstmal zurechtkommen.
>> Was muss ich jetzt in meiner Software mit den einstellbaren P-, I- und >> D-Reglerparametern machen, damit ein typischer PID-Regler entsteht? Entsteht? Wenn du einen Regler hast, bei dem du P, I und D einstellen kannst, hast Du schon einen PID Regler. Die Kunst ist es, die Parameter entsprechend an die Strecke anzupassen. Dazu solltest Du die Übertragungsfunktion der Strecke kennen. Was hat denn Deine Stecke für einen Charakter?
tom schrieb: > Was hat denn Deine Stecke für einen Charakter? Der Regler soll über seine Einstellparameter an unterschiedliche Strecken angepaßt werden können.
Peter H. schrieb: > tom schrieb: >> Was hat denn Deine Stecke für einen Charakter? > > Der Regler soll über seine Einstellparameter an unterschiedliche > Strecken angepaßt werden können. Ja das ist uns schon klar. kp, ki und kd sind die Parameter die angepasst werden müssen. Aber um diese Parameter für die verschiedenen Strecken herauszubekommen brauchst du die Übertragungsfunktion, Systemfunktion. Wenn man nach der Charakteristik frägt, dann geht es darum den Typ der Systemfunktion zumindest grob zu erkennen. http://www.rn-wissen.de/index.php/Regelungstechnik#Die_Regelstrecke PT1, PT2, Totzeit, ...
Übertragungsfunktion ist manchmal komplex herauszubekommen und sich von daher dann als Einsteiger die PArameter richtig auszurechnen nahezu unmöglich. Ich hhab mir damals meine erste regelstrecke eher mit gesundem Menschenverstand hergeleitet. Stell dir mal die Fragen vor, mit welcher Stellgröße willst du Einfluss auf deinen Aufbau nehmen, also einer PWM einer Spannung , einem Strom etc, udn dann als nächsten Schritt wo hast du vor einzugreifen isn System, mal das mal auf erklärs dir logisch dann kannste das ja auchheir posten, dann fällts den Leuten einfacher dir zu helfen.
wil schrieb: > dann fällts den Leuten einfacher dir zu helfen. Ich bekomme jede Millisekunde sowohl eine Ist-, als auch eine Sollposition. Mein Antrieb kann ein Elektromotor mit Frequenzumrichter, wie auch ein Pneumatikzylinder mit Ventil (incl. Ventilelektronik) sein. Die Übertragungsfunktionen sind je nach verwendeter Strecke unterschiedlich und vorweg nicht bekannt. Die Istposition sollte möglichst gut der vorgegebenen Sollposition folgen, wobei ein Schwingen sicher verhindert werden muß. Eine sich nicht ändernde Sollposition muß mit kleinem Fehler erreicht werden. Der Regler soll über seine Parameter an die verschiedenen Regelstecken von Elektrofachkräften (d.h., keine Regelungsprofis) angepaßt werden können.
Peter H. schrieb: > wil schrieb: >> dann fällts den Leuten einfacher dir zu helfen. > > Ich bekomme jede Millisekunde sowohl eine Ist-, als auch eine > Sollposition. Mein Antrieb kann ein Elektromotor mit Frequenzumrichter, > wie auch ein Pneumatikzylinder mit Ventil (incl. Ventilelektronik) sein. > Die Übertragungsfunktionen sind je nach verwendeter Strecke > unterschiedlich und vorweg nicht bekannt. Was dir nicht klar sein dürfte. Ein PID Regler ist algorithmisch immer gleich aufgebaut. Die Formeln sind immer dieselben. Die Anpassung an die konkrete Regelstrecke wird durch die Werte für Kp, Ki, Kd erreicht! Mach die einstellbar und du hast deine Anpassbarkeit. (und eventuell sind noch ein paar Hilfsgrößen notwendig bzw. sinnvoll, die man als Antiwindup-Begrenzungen einsetzt, damit sich der Regler bei großer Regelabweichung nicht selbst mit seinem Integralteil so weit ins Abseits aufschaukelt, dass er nur mit großen zeitlichen Versatz wieder in den eigentlichen Regelbereich zurückkommt. Aber vom Prinzip her sind Kp, Kd und Ki die Parameter, mit denen der Regler angepasst wird und sonst nichts.
Karl Heinz Buchegger schrieb: > Aber vom Prinzip her sind Kp, Kd und Ki die Parameter, mit denen der > Regler angepasst wird und sonst nichts. Und genau hierin liegt die große Kunst. Wenn das jemand machen soll, der davon keine Ahung hat, dann wird er scheitern. Man kann natürlich selbstlernende Regler programmieren, die dann durch Auswerten von Sprungantworten etc sich selbst diese Parameter bestimmen, aber derjenige, der so ein System programmiert, braucht dann umso mehr Erfahrung in Regelungstechnik und anhand deiner Fragestellung scheint es so, dass dir diese Erfahrung fehlt (Ohne dir auf die Füße stehen zu wollen)
Schlumpf schrieb: > Karl Heinz Buchegger schrieb: >> Aber vom Prinzip her sind Kp, Kd und Ki die Parameter, mit denen der >> Regler angepasst wird und sonst nichts. > > Und genau hierin liegt die große Kunst. > Wenn das jemand machen soll, der davon keine Ahung hat, dann wird er > scheitern. Nicht zuletzt aufgrund dieser Aussage ... > Was muss ich jetzt in meiner Software mit den einstellbaren P-, > I- und D-Reglerparametern machen, damit ein typischer PID-Regler > entsteht? ... denke ich mitlerweile, dass das Problem des TO darin besteht, in Google die Suchworte "PID Regler C Code" einzugeben und sich aus den x-tausend Beiträgen sich den Code rauszusuchen, der ihm am besten gefällt bzw. die ersten 10 Links mal anzuklicken und die Erläuterungen zu PID durchzulesen.
Und wie bekomme ich jetzt einen Regler hin, der den Anforderungen entspricht (bzw. möglichst nahe kommt)?
Peter H. schrieb: > Und wie bekomme ich jetzt einen Regler hin, der den Anforderungen > entspricht (bzw. möglichst nahe kommt)? Ich seh jetzt ehrlich gesagt nicht, was in der ganzen Diskussion noch nicht angesprochen wurde. Zu faul zum googeln? Programmieren musst du schon alleine. Die 5 Zeilen Code sind ja jetzt so schwer auch wieder nicht aus einer Vorlage zu extrahieren. Davon sind hier eigentlich alle ausgegangen, dass du den Teil alleine schaffst.
Peter H. schrieb: > Und wie bekomme ich jetzt einen Regler hin, der den Anforderungen > entspricht (bzw. möglichst nahe kommt)? Indem du das Wort "Ich" aus dem Satz streichst und durch "gute bezahlte Fachkraft" ersetzt... Es ist offensichtlich, dass du von Regelungstechnik nichtmal den Hauch einer Ahung hast und daher erlaube ich mir zu behaupten, dass du das Problem nicht lösen kannst. Entweder du machst dich mit den Grundlagen der Materie vertraut (Es gibt nahezu unendlich viel Literatur darüber), oder du machst deinen Geldbeutel auf und engagierst jemanden, der das für dich macht.
>> Aber vom Prinzip her sind Kp, Kd und Ki die Parameter, mit denen der >> Regler angepasst wird und sonst nichts. > > Und genau hierin liegt die große Kunst. > Wenn das jemand machen soll, der davon keine Ahnung hat, dann wird er > scheitern. Das stimmt so nicht. Einen PID Regler einzustellen ist keine große Kunst. Dazu muss man im Prinzip auch nichts über das System wissen. Jedenfalls nicht, so lange man nichts kaputt machen kann. Ein experimenteller Weg wie er im Tietze Schenk empfohlen wird geht so: * Ki = Kd = 0 * Kp so lange hochdrehen, bis eine schwach gedämpfte Sprungantwort resultiert. * Kd hochschrauben, das System das gewünschte Einschwingverhalten hat. * Ki hochschrauben, bis die Regelabweichung in minimaler Zeit ausgeglichen wird. Kann jeder angelernte Laie erledigen. Ob Peter das auch schafft werden wir sehen.
Weiter oben hatte doch schon jemand rn-wissen verlinkt. Der Artikel über die Regelungstechnik ist echt gut. Da wird super beschrieben, wie du auf die Werte kommst. Lesen musst du wirklich selbst. http://www.rn-wissen.de/index.php/Regelungstechnik , falls du auch zu faul bist, den Thread nochmal danach zu durchsuchen.. MfG Dennis
Thomas schrieb: > * Kp so lange hochdrehen, bis eine schwach gedämpfte Sprungantwort > resultiert. > * Kd hochschrauben, das System das gewünschte Einschwingverhalten hat. Setzt aber voraus, dass derjenige zumindest weiss, was ein PID-Regler ist und was ihn kennzeichnet. Außerdem sollten dann Begriffe wie Sprungantwort und Einschwingverhalten geläufig sein, bzw. mehr als nur "Begriffe" :-)
Thomas schrieb: > Ein experimenteller Weg wie er im Tietze Schenk empfohlen wird geht so: > ... Und das Ganze dann auch mal mit anderer Belastung, anderer Versorgungsspannung usw. ausprobieren. Denn Änderungen dort wirken sich dann durch andere Konstanten auf die Regelstrecke aus...
Lothar Miller schrieb: > Und das Ganze dann auch mal mit anderer Belastung, anderer > Versorgungsspannung usw. ausprobieren. Denn Änderungen dort wirken sich > dann durch andere Konstanten auf die Regelstrecke aus... Abgesehen davon sind Antriebsregler meist geschachtelte Regler, die eine gewisse Komplexität aufweisen, die man mit einer Faustformal garantiert nicht mehr in den Griff bekommt.
Schlumpf schrieb: > Abgesehen davon sind Antriebsregler meist geschachtelte Regler Es geht hier offenbar um einen relativ einfachen einstufigen PID-Regler. Ob der allerdings für die Aufgabe ausreicht und warum Andere viel mehr Aufwand treiben (müssen) steht auf einem anderen Blatt...
Thomas schrieb: > Einen PID Regler einzustellen ist keine große Kunst. > Dazu muss man im Prinzip auch nichts über das System wissen. > Jedenfalls nicht, so lange man nichts kaputt machen kann. Einen einstufigen vielleicht ja. Ansonsten ist diese Aussage per se eine Beleidung der Regelungstechnik. Das was du da schreibst ist eine "Fausformel" und funktioniert bei einfachen einstufigen halbwegs linearen Systemen. Das ist die Quick n' Dirty Variante.
Hier mal ein PID-Regler nach Brett Beauregard. Der Regler hat Vorkehrungen gegen Derivative Kick, Sprungänderungen bei on/off bzw. Parameteränderung. Leider gibt's die Webseite mit der Erklärung nimmer, zumindest fand ich sie nicht mehr, bei Bedarf kann ich aber helfen, ich hab sie mir mal für offline-Betrieb gesichert. Die Abtastzeit ist für den Sekundenbereich vorgesehen, wenn du alle Millisekunde abfragen wöchtest mußt du das entprechend anpassen. Prinzipiell ändert sich dadurch am Algorithmus aber nichts.
1 | C-Code |
2 | |
3 | /*working variables*/
|
4 | unsigned long lastTime; |
5 | double Input, Output, Setpoint; |
6 | double ITerm, lastInput; |
7 | double kp, ki, kd; |
8 | int SampleTime = 1000; //1 sec |
9 | double outMin, outMax; |
10 | bool inAuto = false; |
11 | |
12 | #define MANUAL 0
|
13 | #define AUTOMATIC 1
|
14 | |
15 | void Compute() |
16 | {
|
17 | if(!inAuto) return; |
18 | unsigned long now = millis(); |
19 | int timeChange = (now - lastTime); |
20 | if(timeChange>=SampleTime) |
21 | {
|
22 | /*Compute all the working error variables*/
|
23 | double error = Setpoint - Input; |
24 | ITerm+= (ki * error); |
25 | if(ITerm> outMax) ITerm= outMax; |
26 | else if(ITerm< outMin) ITerm= outMin; |
27 | double dInput = (Input - lastInput); |
28 | |
29 | /*Compute PID Output*/
|
30 | Output = kp * error + ITerm- kd * dInput; |
31 | if(Output> outMax) Output = outMax; |
32 | else if(Output < outMin) Output = outMin; |
33 | |
34 | /*Remember some variables for next time*/
|
35 | lastInput = Input; |
36 | lastTime = now; |
37 | }
|
38 | }
|
39 | |
40 | void SetTunings(double Kp, double Ki, double Kd) |
41 | {
|
42 | double SampleTimeInSec = ((double)SampleTime)/1000; |
43 | kp = Kp; |
44 | ki = Ki * SampleTimeInSec; |
45 | kd = Kd / SampleTimeInSec; |
46 | }
|
47 | |
48 | void SetSampleTime(int NewSampleTime) |
49 | {
|
50 | if (NewSampleTime > 0) |
51 | {
|
52 | double ratio = (double)NewSampleTime |
53 | / (double)SampleTime; |
54 | ki *= ratio; |
55 | kd /= ratio; |
56 | SampleTime = (unsigned long)NewSampleTime; |
57 | }
|
58 | }
|
59 | |
60 | void SetOutputLimits(double Min, double Max) |
61 | {
|
62 | if(Min > Max) return; |
63 | outMin = Min; |
64 | outMax = Max; |
65 | |
66 | if(Output > outMax) Output = outMax; |
67 | else if(Output < outMin) Output = outMin; |
68 | |
69 | if(ITerm> outMax) ITerm= outMax; |
70 | else if(ITerm< outMin) ITerm= outMin; |
71 | }
|
72 | |
73 | void SetMode(int Mode) |
74 | {
|
75 | bool newAuto = (Mode == AUTOMATIC); |
76 | if(newAuto && !inAuto) |
77 | { /*we just went from manual to auto*/ |
78 | Initialize(); |
79 | }
|
80 | inAuto = newAuto; |
81 | }
|
82 | |
83 | void Initialize() |
84 | {
|
85 | lastInput = Input; |
86 | ITerm = Output; |
87 | if(ITerm> outMax) ITerm= outMax; |
88 | else if(ITerm< outMin) ITerm= outMin; |
89 | }
|
Das ganze gilt natürlich nur für einfache Regelstrecken, die zumindest im Arbeitsbereich einigermaßen linear sind. Da funktioniert diese Methode aber auch sehr gut. Bei komplexen Prozessen und hochgradig nichtlinearen Strecken ist ein einfacher PID Regler dann vielleicht doch nicht die richtige Wahl. Dazu zähle ich jetzt auch eine Antriebsregelung, mit großen Laständerungen. Da hilft dann evtl. eine übergeordnete Steuerung oder Beobachter, der die Regelparameter kontinuierlich anpasst. Ich habe mal eine Antriebsregelung entwickelt in der bei jeder unerwarteten Abweichung die Streckenparameter neu identifiziert wurden. Damit wurde dann der Regler so neu berechnet, dass die Closed Loop Übertragungsfunktion stets gleich blieb. > Ansonsten ist diese Aussage per se eine Beleidung der Regelungstechnik. Na na, komm mal runter von deinem hohen Ross. > Das was du da schreibst ist eine "Fausformel" und funktioniert bei > einfachen einstufigen halbwegs linearen Systemen. Das ist aber die absolut größte Masse der Systeme. Und bei allen anderen Systemen reicht ein simpler PID Regler eh nicht mehr. > Das ist die Quick n' Dirty Variante. Nein, diese Lösung liefert für einfache Systeme eine halbwegs optimale Einstellung.
@Klaus Pobereit: So wie ich Peter verstanden habe hat er bereits einen Regler. Dieser muss nur noch parametriert werden.
Thomas schrieb: > So wie ich Peter verstanden habe hat er bereits einen Regler. Bisher habe ich noch keinen Regler. Ich möchte (einfach ausgedrückt) einen Regler erstellen, der unter den gegebenen Randbedingungen so gut es eben geht arbeitet. Natürlich wird er meist nicht so perfekt wie speziell auf die verschiedenen Regelstrecken abgestimmten Regler arbeiten, dafür soll er aber möglichst einfach (u.a. mit Kp, Ki, Kd) zu parametrieren sein.
Peter H. schrieb: > Ich möchte (einfach ausgedrückt) > einen Regler erstellen, der unter den gegebenen Randbedingungen so gut > es eben geht arbeitet. Und genau diese Randbedingungen sind offensichtlich doch sehr universell.. Thomas schrieb: > Natürlich wird er meist nicht so perfekt wie > speziell auf die verschiedenen Regelstrecken abgestimmten Regler > arbeiten Der Regler ist, wenn du ihn aus der Schachtel packst, dumm wie 10m Feldweg.. die Abstimmung auf die Regelstrecke musst DU mittels Ki, Kp und Kd selbst vornehmen. Und genau daran wird es scheitern!
Thomas schrieb: > Schon mal daran gedacht einen fertigen Regler zu kaufen? Neben vielen anderen Dingen soll der Regler mit in einem PIC32 laufen, der in einer "Motorsteuerung" mit recht spezieller Hardwarebeschaltung eingebaut ist. Zumindest eine Hardwarelösung wäre unvorteilhaft. Über eine gekaufte Softwarelösung denke ich durchaus nach.
Peter H. schrieb: > Bisher habe ich noch keinen Regler. Ich möchte (einfach ausgedrückt) > einen Regler erstellen, der unter den gegebenen Randbedingungen so gut > es eben geht arbeitet. Natürlich wird er meist nicht so perfekt wie > speziell auf die verschiedenen Regelstrecken abgestimmten Regler > arbeiten, dafür soll er aber möglichst einfach (u.a. mit Kp, Ki, Kd) zu > parametrieren sein. Auf Deutsch: Unter der Annahme, dass ein PID Regler für deine Aufgabenstellung das Richtige ist, suchst du jemanden der dir das Programm schreibt, weil du aus der RN-Code-Vorgabe eines PID_Reglers
1 | e = w - x; //Vergleich |
2 | esum = esum + e; //Integration I-Anteil |
3 | y = Kp*e + Ki*Ta*esum + Kd/Ta*(e – ealt); //Reglergleichung |
4 | ealt = e; |
keine komplette Funktion in der von dir benutzten Progammiersprache erstellen kannst. Nenn doch die Dinge beim Namen und hör auf um den heißen Brei herumzureden.
Peter H. schrieb: > Zumindest eine Hardwarelösung wäre unvorteilhaft. Über eine gekaufte > > Softwarelösung denke ich durchaus nach. dann nimm doch einfach die PID() function vom Microchip !! Es ist bestandteil ihrer dsp Bibliothek von pic30F/33F. wird aber auch aufm pic32 mit anpassungen laufen. HTH
noch was: schau dir die Code Example CE019 mal an. Es handelt um einem PID regler mit software dabei.
Peter H. schrieb: > Bisher habe ich noch keinen Regler. Ich möchte (einfach ausgedrückt) > einen Regler erstellen, der unter den gegebenen Randbedingungen so gut > es eben geht arbeitet. Natürlich wird er meist nicht so perfekt wie > speziell auf die verschiedenen Regelstrecken abgestimmten Regler > arbeiten, dafür soll er aber möglichst einfach (u.a. mit Kp, Ki, Kd) zu > parametrieren sein. Nochmal: Grundsätzlich basiert jeder PID-Regler basiert auf dem identischen Algorithmus (Berechungsvorschrift): Man berechnet den P-Anteil, den I-Anteil und den D-Anteil und addiert diese. Was das Regelverhalten ausmacht, sind die Parameter. (Vorausgesetzt, Du machst bei der Implementierung keine Fehler wie Variablenüberlauf.) Ähnlich einer ganz simplen Addition: Der Algorithmus ist immer der gleiche C = A + B. Das Ergebnis ändert sich, wenn Du A und B änderst, aber der Algorithmus ist immer identisch. Dein Annahme, daß Du den PID-Algorithmus auf die Regelstrecke anpassen mußt, ist gänzlich falsch: Der Algorithmus bleibt immer gleich. Eine ganz andere Frage ist, ob der PID für Deine Regelstrecke geeignet ist, oder ob es besser Regler gäbe (z.B. einen simplen 2-Punkt-Regler).
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.