Zwei Algorithmen für digitalen PID

Gast #2006060
Abend,

ich beschäftige mich gerade mit digitalen PID-Reglern. Ich bin mit 
einiger Mühe in der Lage, den Stellalgorithmus aus der 
Differenzengleichung für den zeitdiskreten PID herzuleiten.

Nun findet man jedoch als Codeumsetzung meist zwei Möglichkeiten für den 
digitalen PID.

Zum einen die Möglichkeit, die sich an die PID-Differenzengleichung 
anlehnt: (http://www.rn-wissen.de/index.php/Regelungstechnik#PID-Regler)
1
e = w - x;        
2
esum = esum + e;        
3
y = Kp*e + Ki*Ta*esum + Kd/Ta*(e – ealt);
4
ealt = e;
(schön einfach und übersichtlich)

Oder durch andere Herleitung (siehe 
Beitrag "Re: PID- Regler")
1
e = w - x;        
2
y = yalt + q0*e + q1*ealt + q2*ealt2;  
3
ealt2 = ealt;
4
ealt = e;
5
yalt = y;
wobei
q0=Kp+Ki*Ta+Kd/Ta
q1=-Kp-2*Kd/Ta
q2=Kd/Ta
(irgendwie komplexer)


Ich verstehe nicht den Unterschied zwischen beiden Algorithmen. Gibt es 
da Vor/Nachteile?
Kann ich jetzt einfach sagen, ich nehmen Lösung 1 da diese einfacher und 
kürzer ist? Welche Nachteile nehme ich dafür in Kauf?
Der Integrator im Regler ist an 2 verschiedenen Stellen "verbaut":

Bei Variante 1 steckt er in
esum = esum + e;
ealt = e;

Bei Variante 2 steckt er in
y = yalt + (...);
yalt = y;

Die beiden "ealt"s bei Variante 2 bringen nur eine zusätzliche 
Verzögerung.
Ich zeichne mir das mal als Blockschaltbild auf.
mfg mf
Gast
hai

ich bin's noch mal


Ich glaube, ich bin ein wenig weiter :/

Bei dem ersten Algorithmus handelt es sich offenbar um einen sog. 
"PID-Stellungsalgorithmus". Die Stellgröße y ist dabei dann immer 
absolut.
An Rechenaufwand braucht man 4 MULs, 2 ADDs, 1 SUB und eine DIV.
Relativ hoher Aufwand pro Zyklus also.

Der zweite Algo wird bei den Amis als PID-Geschwindigkeits-Algo 
bezeichnet.
Das Ding arbeitet rekursiv über die letzten beiden Regelabweichungen. 
Die Stellgröße wird außerdem immer relativ zur vorigen (yalt) gebildet.
Wind-Up-Effekt kann wegen fehlender Variable zur Summenbildung nicht 
auftreten. Der Algo ist recht flott, da nur 3 ADDs und 3MULs mit festen 
Konstanten nötig sind.


Konstruktive Kritik meiner Behauptung sind erwünscht.
Ist das nicht eigentlich so gemeint:
y = Kp*e + Ki*Ta*esum + (Kd/Ta)*(e - ealt);

(Kd/Ta) ist eine Konstante, das wird ein guter Compiler erkennen und 
entsprechend umsetzen.

Ich komme auf folgendes:
   Erster Algo:
   5ADD, 3MUL (Ob + oder - immer noch eine Addition)

   Zweiter Algo:
   4ADD, 3MUL
   Allerdings wird hier ein Wert mehr zwischengespeichert.

mfg mf
Gast
Guten Morgen

Ich arbeite ebenfalls diesen Software-PID in meinen AVR zu packen.

Wie schauts aus, hattet ihr schon den gewünschten Erfolg? Könnt ihr 
Tipps bei der Umsetzung geben?

Benutzt ihr 8- oder 16-bit Register?

Gruss

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.