[C] - PIDT1-Regler

  • Themenstarter Themenstarter Exception1
  • Beginndatum Beginndatum
E

Exception1

Hi Community,

ich bin zur Zeit an dabei eine Regelung eines Ventils zu erstellen.
Wie ein PID- bzw. PIDT1-Regler funktioniert ist klar.

Einen Algorithmus für einen PID-Regler habe ich bereits erstellt und getesetet, leider führt der D-Anteil zu unschönen Peaks und nun möchte ich den vorhandenen D- durch einen DT1-Anteil austauschen.

Leider habe ich nicht raus gefunden, wie ich den Algorithmus umsetzen kann.

Mein momentaner Regler:

Code:
double dPID (double dError, Parameter* PID)
{
  double dPAnteil, dIAnteil, dDAnteil;

  //Berechnung der einzelnen Anteile
  dPAnteil = PID->KP * dError;
  dIAnteil = PID->dESum * ( PID->KP / PID->TI );
  
  //Der D-Anteil, welcher durch ein DT1-Element ersetzt werden soll
  dDAnteil = ( dError - PID->dErrorOld ) * ( PID->KP * PID->TD );
  
  //Berechnung des Stellsignals
  PID->dU = dPAnteil + dIAnteil + dDAnteil;
  //Alten Fehler speichern
  PID->dErrorOld = dError;

  return PID->dStellsignal;
}

Der Regelalgorithmus ist ja kein großes Geheimnis.
Die Gleichung des DT1-Elements lautet:

T1*(dU(t)/dt)+U(t) = Kd*(de(t)/dt)

Mir bereitet der vordere Teil Schwirigkeiten. Wie kann ich das dU(t)/dt umsetzten?

Vielleicht steh ich momentan auch einfach nur auf dem Schlauch,
ich hoffe Ihr könnt mir helfen, danke.

Gruß
Alex
 
Hi, ich hab mich wohl einen Tag zu früh gemeldet.
Kollege konnte mich auf den (hoffentlich) richtigen Weg führen.

Für Interessierte:
Gleichung für den DT1-Anteil in eine Differenzengleichung umwandeln und umformen.
Als Ergebnis erhält man:

Code:
U(k) = [KD * (e(k) - e(k-1)) - T1 * U(k-1)] / (T1+TTakt)

Dabei entspricht k-1 dem Vorgängerwert von k, TTakt ist die Zykluszeit, in welcher der Algorithmus aufgerufen wird

Gruß Alex
 
Zurück