www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP PID- Regler

Autor: Benjamin Klimmek (benjaminklimmek)
Datum:

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
Autor: RoY (Gast)
Datum:

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
Autor: Stefan Gemmel (steg13)
Datum:

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?fa...)
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?
Autor: Benjamin Klimmek (benjaminklimmek)
Datum:

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
Autor: Olaf (Gast)
Datum:


> 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
Autor: SirFrancisDrake (Gast)
Datum:

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:
Z_{out} = K_{p_{kont}} e(t) + K_{i_{kont}} \int \limits_0^t{e(t)dt} + K_{d_{kont}} \frac{de(t)}{dt}
(2) daraus wird nun:
Z_{m} = K_{p_{dis}} e(m) + K_{i_{dis}} \sum \limits_{r = 0}^{m - 1}e(r) + K_{d_{dis}} (e(m) - e(m - 1))
bzw. (wenn man schon ahnt wohin die Reise geht und man an der Summe ein
wenig schraubt)
Z_{m} = K_{p_{dis}} e(m) + K_{i_{dis}} (e(m - 1) + \sum \limits_{r = 0}^{m - 2}e(r) + K_{d_{dis}} (e(m) - e(m - 1))
(3) sowie für den unmittelbar vornagehenden Zyklus
Z_{m - 1} = K_{p_{dis}} e(m - 1) + K_{i_{dis}} \sum \limits_{r = 0}^{m - 2}e(r) + K_{d_{dis}} (e(m - 1) - e(m - 2))
(4) jetzt subtrahiert man (3) von (2) und erhält damit
Z_{m} - Z_{m - 1} = K_{p_{dis}} (e(m) - e(m - 1)) + K_{i_{dis}} (e(m - 1)) + K_{d_{dis}} (e(m) - 2 e(m - 1) + e(m + 2))
Was man nun noch nach Z_{m} umformt und damit eine handliche kleine
Formel erhält, die sich leicht implementieren lässt:
Z_{m} = Z_{m - 1} + K_{p_{dis}} (e(m) - e(m - 1)) + K_{i_{dis}} (e(m - 1)) + K_{d_{dis}} (e(m) - 2 e(m - 1) + e(m + 2))
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:
extern int pidsetpoint;  
extern int pidoutput;    
extern int pidsense;

int err_0 = 0;  // current error (t =   0)
int err_1 = 0;  // prev.   error (t = - T)
int err_2 = 0;  // prev.   error (t = -2T)

// shift/calculate all errors for current cycle
err_2 = err_1;
err_1 = err_0
err_0 = pidsetpoint - pidsense;

// calculate new output
pidoutput = pidoutput + P * ( err_0 - err_1 )
                      + I * ( err_1 )
                      + 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
Autor: Uli (Gast)
Datum:

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.
Autor: Matthias (Gast)
Datum:

Autor: Thomas (Gast)
Datum:

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.
Autor: Matthias (Gast)
Datum:

ja, ein dead-beat-regler...
Autor: Benjamin Klimmek (benjaminklimmek)
Datum:

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
Autor: Frank (Gast)
Datum:

Sollte gehen. Allerdings wirst Du mit ziemlicher Sicherheit andere
Probleme haben. Stellgrößenbegrenzung und reset-windup zum Bleistift.
Autor: Thomas (Gast)
Datum:

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.
Autor: Benjamin Klimmek (benjaminklimmek)
Datum:

Guten Morgen Zusammen,

ich habe mich gestern noch einmal mit den Formeln beschäftigt. Dabei ist
mir  etwas aufgefallen. Hier noch einmal die Formeln:

>
> Z_{m} = Z_{m - 1} + K_{p_{dis}} (e(m) - e(m - 1)) + K_{i_{dis}} (e(m -
> 1)) + K_{d_{dis}} (e(m) - 2 e(m - 1) + e(m + 2))
>
>
> // 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
Autor: Chr. (Gast)
Datum:

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.
Autor: Maik (Gast)
Datum:

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.
Autor: Sepp (Gast)
Datum:

>>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
Autor: JÜrgen Grieshofer (psicom) Benutzerseite
Datum:

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
Autor: daniel (Gast)
Datum:

nochmals zu windup
seite 11
http://www.cds.caltech.edu/~murray/courses/cds101/...

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
Autor: Rome Rück (rome)
Datum:

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
Autor: JÜrgen Grieshofer (psicom) Benutzerseite
Datum:

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.
Autor: Johannes Schmitz (onion)
Datum:

> (1) im zeitkontinuierlichem System ist:
>
> Z_{out} = K_{p_{kont}} e(t) + K_{i_{kont}} \int \limits_0^t{e(t)dt} +
> K_{d_{kont}} \frac{de(t)}{dt}
>
> (2) daraus wird nun:
>
> Z_{m} = K_{p_{dis}} e(m) + K_{i_{dis}} \sum \limits_{r = 0}^{m - 1}e(r)
> + K_{d_{dis}} (e(m) - e(m - 1))
>

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.

>
> Z_{m} = Z_{m - 1} + K_{p_{dis}} (e(m) - e(m - 1)) + K_{i_{dis}} (e(m -
> 1)) + K_{d_{dis}} (e(m) - 2 e(m - 1) + e(m + 2))
>

Hier muss es wohl e(m - 2) heissen oder?
Autor: Pico Oschi (hacky)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net