WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

PID Regler - Was läuft hier falsch?

 

eey
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 31.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2014, 15:24     Titel: PID Regler - Was läuft hier falsch?
  Antworten mit Zitat      
Hallo,

ich versuche mich seit einiger Zeit den PID-Regel Algorithmus für ein simples PT1 Glied iterativ zu implementieren (also ohne die Verwendung irgendwelcher Toolboxen oder fertiger Funktionen).

Mein Code sieht momentan so aus:

Code:

% Erzeuge Zeitvektor
t = linspace(0, 500, 500)';

% Erzeuge Inputvektor (Sprunganregung)
u = ones(size(t, 1), 1);

% PID Regelparameter
Kp = 1;
Ki = 1;
Kd = 1;

% Bestimme die "Abtastzeit"
dt = t(2) - t(1);

% Initialisiere den Outputvektor
y = zeros(length(t), 1);

% Initialisiere diverse Variablen
y_prev = 0;
err_sum = 0;
err_old = 0;

for k = 1:length(t)
    % Bestimme die aktuelle Regelabweichung
    current_err = u(k) - y_prev;

    % Integriere den Fehler auf (I-Anteil des PID Reglers)
    err_sum = err_sum + current_err;

    % Berechne den Output des PID Reglers
    pid_output = Kp*current_err + Ki*err_sum*dt + (Kd/dt)*(current_err - err_old);

    % Speichere den alten Fehler (für D-Anteil des PID Reglers)
    err_old = current_err;

    % Gebe diesen Output auf das PT1-Glied (Formel nach Wikipedia)
    y_prev = (pid_output + (1/dt)*y_prev)*dt/(dt + 1);

    % Speichere den aktuellen Output des Closed-Loop Systems in y
    y(k) = y_prev;
end
 


Leider kommt dabei ein komplett falsches Ergebnis raus... dies kann leicht verifiziert werden wenn man statt der iterativen Lösung das Closed-Loop System mittels der Funktionen "feedback" und "tf" bzw. "pid" aufbaut und mittels "lsim" berechnen lässt.

Die Formeln sollten aber so stimmen, hab die auch schon mehrmals nachgerechnet...

Wo könnte hier der Fehler liegen?
Private Nachricht senden Benutzer-Profile anzeigen


vega1013
Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2014, 08:43     Titel:
  Antworten mit Zitat      
Hallo eey,

auf die schnelle würde ich hier den Fehler in der im PT1 Glied vermuten. Was ist mit der Verstärkung und des Zeitkonstanten? Hast du die zu eins gesetzt und die Formel umgestellt? Vielleicht kannst du mal den Link angeben wo du diese Formel her hast bzw. wenn du sie umgestellt hast dann wie?
Auch der Code zum prüfen wäre hilfreich, dann könnte man selber mal experimentieren...

VG
Vega
Private Nachricht senden Benutzer-Profile anzeigen
 
eey
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 31.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2014, 09:18     Titel:
  Antworten mit Zitat      
Hallo,

also das wäre der Code zum überprüfen:

Code:

F = tf(1, [1, 1]); % PT1 Glied aufstellen
C = pid(Kp, Ki, Kd); % PID Regler aufstellen
G = feedback(F*C, 1, -1); % Closed-Loop aufstellen
y_correct = lsim(G, u, t); % Systemantwort berechnen
 


wenn man das macht sieht man eben dass mein y != y_correct, also irgendwo was nicht stimmen kann.

Die Formel für das PT1 Glied habe ich von hier (müsste so stimmen), die Formel für den PID Regler ist ja (denke ich) allgemein bekannt.

Aber irgendwas muss hier trotzdem noch falsch sein...
Private Nachricht senden Benutzer-Profile anzeigen
 
AKNOT
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 12.10.11
Wohnort: Bochum
Version: R2018a
     Beitrag Verfasst am: 03.07.2014, 11:17     Titel:
  Antworten mit Zitat      
Nimmst du 0.1 statt 1 als Reglerparameter, dann läuft es, ansonsten ist es instabil.

Die Formel für PT1 scheint mir nicht ganz korrekt...schau nochmal bei Wiki. Allerdings fällt es nicht ins Gewicht, da die fragwürdigen Teile auch bei dir alle 1 sind.
Private Nachricht senden Benutzer-Profile anzeigen
 
vega1013
Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2014, 11:27     Titel:
  Antworten mit Zitat      
Die Formel ist m.M.n. richtig umgesetzt und umgestellt, also für T=K=1.
Und das sollte dann auch das Problem sein, dass deine Abtastzeit gleich der Zeitkonstanten ist...versuch mal diese zu reduzieren
Private Nachricht senden Benutzer-Profile anzeigen
 
eey
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 31.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2014, 18:30     Titel:
  Antworten mit Zitat      
AKNOT hat Folgendes geschrieben:
Nimmst du 0.1 statt 1 als Reglerparameter, dann läuft es, ansonsten ist es instabil.

Die Formel für PT1 scheint mir nicht ganz korrekt...schau nochmal bei Wiki. Allerdings fällt es nicht ins Gewicht, da die fragwürdigen Teile auch bei dir alle 1 sind.


Also die Formel müsste schon richtig sein (Habs extra nochmal überprüft). Ist halt der Spezialfall dass K=T=1, für Testzwecke, aber das müsste ja irrelevant sein.

vega1013 hat Folgendes geschrieben:
Die Formel ist m.M.n. richtig umgesetzt und umgestellt, also für T=K=1.
Und das sollte dann auch das Problem sein, dass deine Abtastzeit gleich der Zeitkonstanten ist...versuch mal diese zu reduzieren


Hab ich schon probiert, aber auch bei einer Abtastzeit von 0.0001 mittels t = linspace(0, 500, 5000000); ist es falsch und instabil.
Private Nachricht senden Benutzer-Profile anzeigen
 
vega1013
Forum-Century

Forum-Century


Beiträge: 162
Anmeldedatum: 26.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2014, 22:38     Titel:
  Antworten mit Zitat      
Zitat:
Hab ich schon probiert, aber auch bei einer Abtastzeit von 0.0001 mittels t = linspace(0, 500, 5000000); ist es falsch und instabil.


Wenn du die Abtastzeit auf 0.1 setzt sieht der Verlauf schon mal tendenziell richtig aus. Jetzt spuckt dir nur noch der D-Anteil in die Suppe. Setze den auf 0.1 und es funzt...
Private Nachricht senden Benutzer-Profile anzeigen
 
eey
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 31.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.07.2014, 22:41     Titel:
  Antworten mit Zitat      
vega1013 hat Folgendes geschrieben:

Wenn du die Abtastzeit auf 0.1 setzt sieht der Verlauf schon mal tendenziell richtig aus. Jetzt spuckt dir nur noch der D-Anteil in die Suppe. Setze den auf 0.1 und es funzt...


Ja schon, aber das sollte doch nicht so sein oder? Denn mit der lsim Variante funktioniert es ja auch mit einem D-Anteil von 1, also sollte es doch so auch klappen?

Mir gehts hier auch weniger darum es irgendwie zum laufen zu bringen als vielmehr zu verstehen was da eigentlich schief läuft.
Private Nachricht senden Benutzer-Profile anzeigen
 
AKNOT
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 12.10.11
Wohnort: Bochum
Version: R2018a
     Beitrag Verfasst am: 04.07.2014, 07:56     Titel:
  Antworten mit Zitat      
Dann sind die in lsim verwendeten Methoden zur Integration/Differentiation vermutlich einfach robuster. Gefiltert wird der D-Anteil ja in beiden Fällen nicht, da könnte eine kleine Zeitkonstante vielleicht noch Abhilfe schaffen.
Private Nachricht senden Benutzer-Profile anzeigen
 
eey
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 31.03.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2014, 18:30     Titel:
  Antworten mit Zitat      
AKNOT hat Folgendes geschrieben:
Dann sind die in lsim verwendeten Methoden zur Integration/Differentiation vermutlich einfach robuster. Gefiltert wird der D-Anteil ja in beiden Fällen nicht, da könnte eine kleine Zeitkonstante vielleicht noch Abhilfe schaffen.


Hm ok... Aber das sind ja die Standard Formeln zur Berechnung des PID-Outputs die man überall findet... Diese sind dann ja quasi relativ schlecht??

Oder anders gefragt: Warum verwendet jeder diese (sehr schlechte) Approximation des PID-Reglers wenn es doch mit Funktionen wie lsim viel bessere und genauere Ergebnisse gibt? Macht dies in der Praxis keinen Sinn? Oder versteh ich jetzt was falsch?
Private Nachricht senden Benutzer-Profile anzeigen
 
AKNOT
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 12.10.11
Wohnort: Bochum
Version: R2018a
     Beitrag Verfasst am: 08.07.2014, 08:28     Titel:
  Antworten mit Zitat      
Das kann schon einfach an einer anderen Diskretisierungsmethode liegen (Vorwärts- oder Rückwärts-Euler oder Trapezoidal...), dein PID-Algorithmus dürfte komplett Vorwärts-Euler (expliziter Euler) sein, der instabiler und empfindlicher bzgl. der Abtastzeit ist als der implizite (Rückwärts), dafür aber einfacher zu implementieren.

Wenn du den Simulink PID-Block her nimmst, kannst du die Methoden auswählen und wirst genau solche Stabilitätsunterschiede feststellen. In der Hilfe ist das bestimmt auch dokumentiert, sodass du es selbst implementieren kannst...ansonsten weiß Google bestimmt noch mehr Details Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.