mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage PID-Regler


Autor: Asmin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte einen geschlossenen Regelkreis mit PID-Regler und 
PT1-Regelstrecke simulieren. Das ganze in LabView mit Formelknoten, aber 
das ist erstmal egal.
Das ganze folgendermaßen:

float w[1000]   ist der Sollwert mit Sprung ab w[1000] von 3 auf 7
float y[1000]   ist die Regelabweichung
float x1[1000]  ist die Stellgröße
float x2[1000]  ist die Sollgröße

...

for(int i=0; i<1000; i++)
{
  if(i<998)
  {


    //Stelle 1

    x1[i+2] = xh1[i+1] + Kr*((1+dt/Ti + Td/dt)*y[i+2] +
              (-1-2*Td/dt)*y[i+1] + (Td/dt)*y[i]);       //PID-Regler
    x2[i+1] = x2[i] + dt/Ts*(Ks*x1[i]-x2[i]);            //PT1-Stecke

   //Stelle 2

   }
}

Die Frage ist, an welcher STelle wird jetzt die Regelabweichung 
berechnet?
An Stelle 1 oder Stelle 2, vor allem welche Komponente? y[i+2], y[i+1], 
oder y[i]? Würde y[i] = x2[i] - w[i] stimmen?

: Verschoben durch Moderator
Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nach meiner Weltanschauung muss zuerst die Regelabweichung berechnet 
werden, da diese das Eingangssignal des Reglers ist.

>Würde y[i] = x2[i] - w[i] stimmen?
Ja, wenn x2 die (gemessene) Ist-Größe wäre... und nicht wie oben 
beschrieben die Sollgröße!

Autor: Asmin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
>>Würde y[i] = x2[i] - w[i] stimmen?
>
> Ja, wenn x2 die (gemessene) Ist-Größe wäre... und nicht wie oben
>
> beschrieben die Sollgröße!

Ich meinte auch y[i] = w[i] - x2[i]. Habs auch so auch direkt 
substituiert in meiner Schleife, aber es funktioniert nicht.

Jetzt mal von PID abgesehen. Kann mir jemand die paar Zeilen 
Programmcode in der Schleife schreiben, für ein geschlossenen Regelkreis 
mit einem PI-Regler und einer PT1-Regelstrecke?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Asmin schrieb:
> Stefan schrieb:
>>>Würde y[i] = x2[i] - w[i] stimmen?
>>
>> Ja, wenn x2 die (gemessene) Ist-Größe wäre... und nicht wie oben
>>
>> beschrieben die Sollgröße!
>
> Ich meinte auch y[i] = w[i] - x2[i]. Habs auch so auch direkt
> substituiert in meiner Schleife, aber es funktioniert nicht.

Ich frag mich zb, wo du in
   Kr*((1+dt/Ti + Td/dt)*y[i+2]

das y[i+2] hernehmen willst, wo du doch gerade erst mal y[i] berechnet 
hast.

> Jetzt mal von PID abgesehen. Kann mir jemand die paar Zeilen
> Programmcode in der Schleife schreiben, für ein geschlossenen Regelkreis
> mit einem PI-Regler und einer PT1-Regelstrecke?

Fang schrittweise an.
Zunächst nur der PID Regler und da auch nur der P-Anteil.

Wenn wir mal annehmen, dass die Stellgröße gleich der 'gemessenen' 
Ist-Größe ist, dann lautet doch ein einfacher P-Regler


  for( i = 0; i < 1000; ++i ) {

    y[i] = w[i] - x[i];
    x[i+1] = Kp * y[i];
  }

den bringst du zum laufen.
Und dann ergänzt du den I-Anteil danach den D-Anteil etc.

Es bringt nichts gleich von vorne herein mit komplizierten Formeln 
loszulegen, nichts funktioniert und man weiß nicht wo man anfangen muss. 
Zumal ein PID Regler mit den Regelkoeffizienten steht und fällt.

Autor: xenon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Regelfrequenz spielt auch eine Rolle..

Autor: Asmin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Wenn wir mal annehmen, dass die Stellgröße gleich der 'gemessenen'
>
> Ist-Größe ist, dann lautet doch ein einfacher P-Regler
>
>
>
>
>
>   for( i = 0; i < 1000; ++i ) {
>
>
>
>     y[i] = w[i] - x[i];
>
>     x[i+1] = Kp * y[i];
>
>   }

Genau folgendes verstehe ich nämlich nicht:  x[i+1] = Kp*y[i];
Die Formel für einen P-Regler im Zeitbereich ist doch: x(t) = Kp*y(t).
Wieso rechnest du x[i+1] und nicht x[i]?
Also laut der allgemeinen Formel hätte ich jetzt x[i] = Kp*y[i] 
geschrieben.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Asmin schrieb:

> Genau folgendes verstehe ich nämlich nicht:  x[i+1] = Kp*y[i];
> Die Formel für einen P-Regler im Zeitbereich ist doch: x(t) = Kp*y(t).

Kannst du auch machen.

> Wieso rechnest du x[i+1] und nicht x[i]?

Weil ich gerne hätte, dass wenn ich die Daten auswerte ich die lesen 
kann als


   x      Wert der zum Stellglied ging
   y      Regelabweichung die sich daraus ergeben hat

sprich: in deinem Array - für ein ganz bestimmtes i hab ich in einer 
Zeile stehen, den Wert den ich als Stellgröße vorgegeben habe und im y 
daneben steht dann der daraus resultierende Fehler. Aus diesem Fehler 
ergibt sich der nächste Wert für die Stellgröße usw. usw.

D.h. der Lesefluss in den Arrays ist so
i     x                  y
----------------------------

0     o----------------> o
                         |
      +------------------+
      |
      v
 
1     o----------------> o
                         |
      +------------------+
      |
      v

2     o----------------> o
                         |


Für mich ist es logischer, die Zeile mit dem x anfangen zu lassen. Weil 
ich ja zunächst mal eine Stellgröße vorgeben muss, ehe ich überhaupt zu 
einem Fehler kommen kann. Für dich mag das anders aussehen.
Ich seh die Sache halt so: Am Anfang eines Zeitintervalls i stelle ich 
die Stellgröße ein und am Ende des Zeitintervalls hol ich mir den daraus 
resultierenden Ist-Wert um daraus die Stellgröße für das nächste 
Zeitintervall zu berechnen. Bei mir vergeht halt die Zeit nachdem ich 
die Stellgröße gestellt habe. Also praktisch gesehen im waagrechten 
Pfeil.

> Also laut der allgemeinen Formel hätte ich jetzt x[i] = Kp*y[i]
> geschrieben.

Kannst du auch machen.
Du musst nur für dich wissen, wie die Werte zusammenhängen und welcher 
Wert sich aus welchem anderen Wert ergibt, wenn du deine Log-Arrays 
studierst.

In einem realen PID Regler existieren ja die Arrays sowieso nicht mehr. 
Die sind ja jetzt sowieso nur für dich eine Hilfe, damit du im 
Nachhinein verfolgen kannst, was deine Regelgleichungen gemacht haben 
und wie sie den x-Wert nachgeführt haben.

Autor: Asmin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich dachte ich, dass es von der Rücktransformation aus der 
z-übertragungsfunktion abhängt, ob ich x[i+1] oder x[i] oder sonst was 
hinschreibe.

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.