Hallo Zusammen, ich wollte mal rumfragen, ob mir jemand vielleicht Hilfestellung geben kann!? Ich möchte eine Regelung auf Basis eines PID- Reglers aufbauen bzw. programmieren, aber ich habe sowas noch nie mit einem Controller gemacht. Ich habe schon im Forum gesucht und nur einen Beitrag hierzu gefunden. Kann mir vielleicht auch jemand die "Tücken" bei einer Regallung mit einem uC erklären? Ich hatte von Benedikt einen Kommentar in den Beitrag gesehen, dass er Probleme mit dem D- Anteil hatte. Kann man ausmachen warum das so ist? Zur Hintergundinformation. Ich werde drei Analogwerte einlesen, zwei von von Inclinometern (Lagebestimmung) und einen mit dem ich Druck messen möchte. Diese Werte sollen zur Berechnung eine PWM eingelesen werden. Die PWM Signale sollen durch den Regler beeinflusst werden. Ich würde mich freuen wenn Ihr mir helfen könntet. Gruß Benjamin
PID auch noch digital und das auch nur ohne einen blassen schimmer davon zu haben das wird einfach nix. also ich finde du solltest wie alle hier erstmal klein anfangen (z.B. ne led blinken lassen oder mal nen sinus pwm ausgeben lauflicht) auserdem solltest du erstmal den MC kennenlernen und seine vor und nachteile realisieren. wenn du deinen MC erstmal kennst, dann kommen dir auch die ideen wie du etwas am besten damit in griff bekommst. PID regelungen sind alles andere als einfach. bzw eigentlich sind sie suuper simpel, aber du brauchst schon ne menge wissen (differentialgleichungen) ein mathematisches modell von dem was du am ende mit dem pid regeln willst und viel zeit und ambitionen um aus beidem am ende die P,I und D parameter zu bestimmen. alles in allem keine einfache sache. mfg roy
ich bin auch gerade dabei sowas zu machen für meine Lötstation Beitrag "Lötstation" zu machen Ich habe mal die AVR221 implementiert (http://www.atmel.com/dyn/products/app_notes.asp?family_id=607) und einfach etwas rumgespielt. Das geht so aber nicht, man muss doch zuerst das System analysieren und die PID-Anteile richtig berechnen. Gerade mit dem I-Anteil gab es Probleme. Bis der Lötkolben warm ist, ist der I-Anteil bereits zu groß. Ich hatte noch nicht die Zeit mich näher damit zu beschäftigen, sicher lässt sich da was einstellen. Eine Begrenzung in den Atmel-Code einbauen wollte ich nicht. Hat vielleicht jemand gute Unterlagen für Einsteiger? Benutzt jemand die Appnote?
RoY wrote: > PID auch noch digital und das auch nur ohne einen blassen schimmer davon > zu haben das wird einfach nix. > also ich finde du solltest wie alle hier erstmal klein anfangen (z.B. ne > led blinken lassen oder mal nen sinus pwm ausgeben lauflicht) auserdem > solltest du erstmal den MC kennenlernen und seine vor und nachteile > realisieren. > wenn du deinen MC erstmal kennst, dann kommen dir auch die ideen wie du > etwas am besten damit in griff bekommst. > PID regelungen sind alles andere als einfach. bzw eigentlich sind sie > suuper simpel, aber du brauchst schon ne menge wissen > (differentialgleichungen) ein mathematisches modell von dem was du am > ende mit dem pid regeln willst und viel zeit und ambitionen um aus > beidem am ende die P,I und D parameter zu bestimmen. alles in allem > keine einfache sache. > mfg roy Hallo Roy, also erstens habe ich keine blassen Schimmer und zweitens habe ich schon Regler berechnet. Ich habe diese nur noch nie digital realisiert! Ich habe schon einige Projete mit uC- Controllern realisiert, nur waren das mehr "Steuerungssachen", also "ein & aus" Schalten. Ganz "unbeleckt" gehe ich nicht an solche Projekte! Mir geht es mehr um die Praktische Ausführung! Ich meine ich weiß, wie der Ausgangseffekt auf das zu regelnde Objekt aussehen muss, aber mir stellt sich die Frage wie rechne ich digital meine Werte um, um auch das Ergbnis zu bekommen, welches ich erziehlen will!!! Gruß Benjamin
> also erstens habe ich keine blassen Schimmer und zweitens habe ich > schon Regler berechnet. Ich habe diese nur noch nie digital realisiert! Also in meinem Falle bestand Regelungstechnik aus drei Semestern mit 3Wochenstunden Vorlesung. Davon war 1Semester nur Mathe weil der Prof meinte die drei Semester Mathe die wir davor hatten wuerden noch nicht reichen. Und das einzige Fach wo es noch mehr Zaehneklappern gab war theoretische Nachrichtentechnik. :-) Und du glaubst das kann dir jemand mal eben in einer Mail/News erklaeren? Vielleicht mag es den einen oder anderen Ueberraschen, aber man kann sich noch immer Baeume in Scheiben mit Schrift drin kaufen die dafuer besser geeignet sind. Allerdings gibt es ein Problem. Die Regelungstechnikbuecher erschlagen dich erstmal mit einer Menge Theorie. Die musst du zwar darauf haben um verstehen zu koennen was du da machst, in der Praxis steht man aber meist vor dem Problem das man seine Strecke nicht so einfach beschreiben kann wie das der Prof in seiner Uebung vorgegeben hat. Und nicht jede Strecke uebersteht einen Einschaltsprung. :-) Das fuehrt dann lustigerweise dazu das man doch viel nach Gefuehl dimensioniert oder Dinge tut die man Mathematisch nur schwer begruenden kann die aber in der Praxis zum Erfolg fuehren. Dazu brauchst du aber dann Erfahrung und die lernt man auch nicht einer News. > Gerade mit dem I-Anteil gab es Probleme. Bis der Lötkolben warm ist, ist > der I-Anteil bereits zu groß. Ich hatte noch nicht die Zeit mich näher Das ist ein haeufiges Problem. Begrenze einfach den Maximalwert deines I-Anteils. Das hast du in der Analogtechnik ja genauso, da z.B ein Operationsverstaerker auch nicht mehr als seine Betriebsspannung ausgibt. Olaf
Hallo Benjamin, wenn es Dir um den reinen Quelltext geht (oder wenigstens um eine grundsätzliche Art wie es gehen könnte), dann hoffe ich Dir ein wenig weiter helfen zu können. @Olaf: also ich würde jetzt was die Regelungstechnik anbelangt nicht zu sehr übertreiben. Natürlich ist da eine ganze Menge Mathematik drin und man kann das ganze auch beliebig komplex aufziehen (Zustandsschätzer, Kalman, adaptive Systeme...); PID Regler (analog oder digital) sind nun aber wirklich nicht die Welt und eh nur der Anfang der Regelungstechnik. Grundsätzlich zum Hintergrund: wenn Du den analogen Teil schon kennst, dann brauche ich nicht all zu weit auszuholen. Wenn Du nun vom zeitkontinuierlichen zum zeitdiskreten System übergehst ist es wirklich nicht viel. Wenn Du zeitlich äquidistant abtastest, dann kannst Du die vorher kontinuierlichen Werte als Folge darstellen, also als x(t) wird x(n*T) oder einfach x(m). Das Proprotionalglied bleibt wie es immerschon war, Integral und Differenzierer gibt es allerdings so nicht sondern müssen durch eine Summennäherung bzw. einen Differentenquotienten ausgedrückt werden. Dazu kommt ein kleiner Trick: (1) im zeitkontinuierlichem System ist:
(2) daraus wird nun:
bzw. (wenn man schon ahnt wohin die Reise geht und man an der Summe ein wenig schraubt)
(3) sowie für den unmittelbar vornagehenden Zyklus
(4) jetzt subtrahiert man (3) von (2) und erhält damit
Was man nun noch nach Z_{m} umformt und damit eine handliche kleine Formel erhält, die sich leicht implementieren lässt:
Hierbei war e(t) bzw. e(m) natürlich die Regelabweichung, also e = Soll - Ist. Dazu ein kleiner Literaturtip: Thomas Bräunl, Embedded Robotics, Springer Verlag. Nun verbleibt ein recht einfacher Code:
1 | extern int pidsetpoint; |
2 | extern int pidoutput; |
3 | extern int pidsense; |
4 | |
5 | int err_0 = 0; // current error (t = 0) |
6 | int err_1 = 0; // prev. error (t = - T) |
7 | int err_2 = 0; // prev. error (t = -2T) |
8 | |
9 | // shift/calculate all errors for current cycle
|
10 | err_2 = err_1; |
11 | err_1 = err_0 |
12 | err_0 = pidsetpoint - pidsense; |
13 | |
14 | // calculate new output
|
15 | pidoutput = pidoutput + P * ( err_0 - err_1 ) |
16 | + I * ( err_1 ) |
17 | + D * ( err_0 - 2 * err_1 + err_2 ); |
Die PID Reglerparameter muss man natürlich noch bestimmen und sind abhängig von der Regelstrecke, was wahrscheinlich nach allem der mit Abstand schwerste Teil sein dürfte. Entweder man probiert da mal etwas mit Gefühl oder aber man versucht es mit Theorie bzw. Versuchen. Eine Möglichkeit ist das klassische Trial and Error. Aber man könnte auch ein Verfahren z.B. nach Ziegler-Nichols versuchen. Hoffe das hilft weiter... Gruß Jörg
Einen praktischen Hinweis zum Integrator. Wenn die Stellgroesse an die Begrenzung (max) gelaufen ist darf der Integrator nicht weiter integrieren. Der Integrator muss dann stoppen.
Wow, schöne Zusammenfassung, sollte man vielleicht in die Artikelsammlung übernehmen. Noch einen Nachtrag zum Integrator: Den braucht man nur aus einem einzigen Grund: Um Steady-State Fehler zu beseitigen, sonst macht der nur schlechtes. Es ist also sinnvoll den Einfluss des I-Anteils so klein wie möglich zu halten. Das erste was man tun kann ist, wie Uli schon schrieb, den Integratorausgang auf den Gültigkeitsbereich des Stellgliedes zu begrenzen. Noch besser ist es jedoch, ihn auf den Wert zu begrenzen, der nötig ist um Steady-State Fehler zu eliminieren. Zum Differentiator: Wenn man den in den Feedback-Kanal legt ändert man nichts am dynamischen Verhalten des Systems, verhindert aber den sog. Set-Point-Peak, der sonst immer entsteht, wenn sich die Stellgröße schlagartig ändert. Kleine Fehlerkorrektur: in den letzten beiden Gleichungen der Herleitung muss der letzte Term e(m-2) lauten. Anmerkung: Wenn man eh digital regelt gibt es weit bessere Lösungen als PID. PID hat natürlich den Vorteil, dass er (entgegen einigen Behauptungen hier) auch von Laien kinderleicht zu implementieren und kalibrieren ist und für die meisten Systeme in der Praxis auch völlig ausreicht. Zur Kalibrierung von PID-Reglern ist übrigens im Tietze-Schenk ein guter Weg beschrieben.
Hallo Zusammen, ich bedanke mich für Eure ausführlichen Beschreibungen!! Damit hätte ich jetzt nicht gerechnet! Vielen Dank vorallem an Jörg. Jetzt verstehe ich auch die mathematische Umsetzung auf die Strecke. Der Quellcode ist nicht schlecht! Ich habe mir jetzt auch das von Jörg empfohlene Buch besorgt. Mal schauen... In der Beschreibung habe ich schon gesehen, dass dieses Buch auch den Themenkreis einschließt den ich angehen will. Für mich steht nur noch eine Frage offen. Klar habe ich mit dem oben aufgezeigten Quellcode einen PID- Regler, aber wie sieht es aus wenn ich einen der Werte komplett auf "0" drehe z.B. den I-Anteil. Habe ich dann einen PD- Regler, oder bekomme ich Probleme, weil mir der Anteil mit "0" einen undefinierten Wert in die Regelgröße schmeißt!? Ich hoffe Ihr versteht was ich damit meine!? Ich will ein allgemeines Regelverhalten erzeugen. Das der Regler die nur Anteile nutzt, welche auch nur vorgegeben wurden. Danke noch einmal an Euch alle!! Gruß Benjamin
Sollte gehen. Allerdings wirst Du mit ziemlicher Sicherheit andere Probleme haben. Stellgrößenbegrenzung und reset-windup zum Bleistift.
Du kannst die PID-Werte ganz genauso benutzen, wie bei nem analogen Regler. Bei hinreichend schneller Abtastzeit wird der sich dann auch so verhalten. Du musst dann allerdings I*Ts und D/Ts eintragen.
Guten Morgen Zusammen,
ich habe mich gestern noch einmal mit den Formeln beschäftigt. Dabei ist
mir etwas aufgefallen. Hier noch einmal die Formeln:
>
> > // calculate new output > pidoutput = pidoutput + P * ( err_0 - err_1 ) > + I * ( err_1 ) > + D * ( err_0 - 2 * err_1 + err_2 ); Kann es sein das ich in den C-Code das nicht so berechnen muss??? // calculate new output pidoutput = (pidoutput-1) + P * ( err_0 - err_1 ) + I * ( err_1 ) + D * ( err_0 - 2 * err_1 + err_2 ); Vielleicht sehe ich das auch falsch! Aber ich muss doch Z_{m} = Z_{m - 1} umsetzen. Oder nicht?? Gruß Benjamin
Ja, Mathegleichungen und Programmierzuweisungen sind nicht dasselbe. i:=i+1 ist eine Zuweisung, keine Gleichung. Aber bvor du irgendwas eintippst : Hast Du begriffen worum's geht ? Falls ja, sollte das doch keine Problem sein.
Schau doch mal, ob Du das ganze nicht auch mit einem PI-Regler realisieren kannst. Ist für den Anfang etwas einfacher, vor allem bzgl. der Parametrierung. PID-Regler klingt zwar gut, ist aber meistens kaum nötig.
>>extern int pidsetpoint; >>extern int pidoutput; >>extern int pidsense; >> ... kann man diesen code auch für einen PIC verwenden (initialisierung muss natürlich geändert werden), oder funzt das da gar nicht?? Wenn nicht, habt Ihr da vielleicht nen Vorschlag?? Ich muss das ganze auf einem PIC16F767 realisieren
Der Artikel ist allerdings schon einiges älter aber ich will trotzdem noch was an den ganzen Codefetzen bemängeln bzw. ein wenig zum denken anregen: Stichwort: Anti-Windup
nochmals zu windup seite 11 http://www.cds.caltech.edu/~murray/courses/cds101/fa02/caltech/astrom-ch6.pdf an sich auch nett zu lesen " Controllers designed by the ZieglerNichols rules thus inherently give closed loop systems with poor robustness. It also turns out that it is not sufficient to characterize process dynamics by two parameters only. The methods developed by Ziegler and Nichols have been been very popular in spite of these drawbacks. Practically all manufacturers of controller have used the rules with some modifications in recommendations for controller tuning. One reason for the popularity of the rules is that they are simple and easy to explain. " hab an der stelle eine mehr theoretische frage Gs=Gstrecke Gc=Gcontrol dann ergibt sich in close loop die übertragungsfunktion w ---+---|control|---|strecke|-----> - | |--------------------------| G = Gc*Gs/(1+Gc*Gs) ich würde so vorgehen, dass ich mir ein kriterium definitiere was ich überhaupt als gute regelung ansehe. wenn ich keine folgeregelung ereichen will, sondern mein w sich gelegentlich sprunghaft ändert, dann würde ich naiverweise Q wie folgt ansetzen. Q=integral von 0 bis unendlich abs(w-e(t))*t*dt mal t bewirkt, dass abweichungen von w zum späteren zeitpunkt stärker gewichtet werden als anfängliche oszillationen zb. Q hängt nun von Kp,Ki,Kd an und muss minimiert werden also dQ/dKp=0, dQ/dKi=0, dQ/dKd=0 hmm weiter komme ich (noch) nicht meine intuition sagt mir, dass Gs mit ordunung > 2 mit PID kaum zu regeln sind ich suche dies irgendwie allgemein zu zeigen. grüsse, daniel
Hi Leute Also ich möchte eine Widerstandsheizung in einem Reaktor regeln. Als Software benutze ich Measurefoundry von data translation. Der Regler selbst wird in einer art C programmiert. error := soll - ist p := error - internal1 I := ki dt error d := (kd / dt) * (error - (2 * internal1) + internal2) internal2 := internal1 internal1 := error Output := Output + gain * (p + I + d) so gibt das Programm den PID Regler vor. Der d Anteil ist aber immer 0 was der rechnet versteh ich auch nicht genau qasi abweichung -2*alte abweichung + ganz alte abweichung??? Der p Anteil rechnet hier: alte abweichung- neue abweichung sollte er nicht nur soll-ist rechnen? das macht hier der I-Teil. Was sagt Ihr zu diesem PID bzw PI Regleransatz?? Eigentlich soll ich eine möglichst saubere Rampenfunktion für die Temperatur fahren. Gibt es da bessere regler als normale pid um die Rampensteigung zu regeln? Danke Roman
Rome Rück wrote: > Eigentlich soll ich eine möglichst saubere Rampenfunktion für die > Temperatur fahren. > Gibt es da bessere regler als normale pid um die Rampensteigung zu > regeln? Temperaturregelungen sind meist nur PI-Regler... Um die Rampe (Sollwert ändern) ist natürlich der PI auch viel "genügsamer". Der PIDT "bricht" da bei jeder Sollwertänderung aus.
> (1) im zeitkontinuierlichem System ist: >
> (2) daraus wird nun: >
Muss die Summer hier nicht von 0 bis m, statt von 0 bis (m - 1) gehen?
Will das grad in Matlab implementieren und frage mich deshalb ob die
Summe korrekt ist.
>
Hier muss es wohl e(m - 2) heissen oder?
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.