# [C] - PIDT1-Regler



## Exception1 (9. August 2010)

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:


```
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


----------



## Exception1 (10. August 2010)

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:


```
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


----------

