Forum: Digitale Signalverarbeitung / DSP / Machine Learning PID- Regler


von Benjamin K. (benjaminklimmek)


Lesenswert?

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

von RoY (Gast)


Lesenswert?

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

von Stefan G. (steg13)


Lesenswert?

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?

von Benjamin K. (benjaminklimmek)


Lesenswert?

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

von Olaf (Gast)


Lesenswert?


> 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

von SirFrancisDrake (Gast)


Lesenswert?

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

von Uli (Gast)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?


von Thomas (Gast)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

ja, ein dead-beat-regler...

von Benjamin K. (benjaminklimmek)


Lesenswert?

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

von Frank (Gast)


Lesenswert?

Sollte gehen. Allerdings wirst Du mit ziemlicher Sicherheit andere 
Probleme haben. Stellgrößenbegrenzung und reset-windup zum Bleistift.

von Thomas (Gast)


Lesenswert?

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.

von Benjamin K. (benjaminklimmek)


Lesenswert?

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

von Chr. (Gast)


Lesenswert?

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.

von Maik (Gast)


Lesenswert?

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.

von Sepp (Gast)


Lesenswert?

>>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

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

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

von daniel (Gast)


Lesenswert?

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

von Rome R. (rome)


Lesenswert?

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

von JÜrgen G. (Firma: 4CKnowLedge) (psicom) Benutzerseite


Lesenswert?

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.

von Johannes S. (onion)


Lesenswert?

> (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?

von Purzel H. (hacky)


Lesenswert?

Einen 3 jaehrigen Thread wieder ausgraben fuer so ne Trivialitaet ...

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.