PID-Regler

Dependencies:   mbed

Committer:
corsa1600
Date:
Mon Feb 04 17:02:55 2019 +0000
Revision:
0:4a10c261f328
PID-Regler

Who changed what in which revision?

UserRevisionLine numberNew contents of line
corsa1600 0:4a10c261f328 1
corsa1600 0:4a10c261f328 2
corsa1600 0:4a10c261f328 3 #include "mbed.h"
corsa1600 0:4a10c261f328 4
corsa1600 0:4a10c261f328 5 double Xp = 0, Xi = 0, Xd = 0; //Ausgabewerte der einzelnen Regler
corsa1600 0:4a10c261f328 6 double Xe = 0, XeAlt = 0, Xa = 0; //Störgröße, Alte Störgröße, Ausgabewert
corsa1600 0:4a10c261f328 7 const double kp = 1, ki = 1, kd = 8; //Verstärkungskonstanten für P, I und D
corsa1600 0:4a10c261f328 8 const double dt = 1; //Zeitkonstante in Sekunden
corsa1600 0:4a10c261f328 9 const double maxi = 1023, mini = 0; //Max.- und Min.- Werte für Ausgabe
corsa1600 0:4a10c261f328 10
corsa1600 0:4a10c261f328 11 const double TestIn = 100; //Künstlicher Sprung (lt. Vorgabe)
corsa1600 0:4a10c261f328 12
corsa1600 0:4a10c261f328 13
corsa1600 0:4a10c261f328 14 AnalogIn Input(p17); //Analoger Eingang
corsa1600 0:4a10c261f328 15 AnalogOut Output(p18); //Analoger Ausgang
corsa1600 0:4a10c261f328 16
corsa1600 0:4a10c261f328 17
corsa1600 0:4a10c261f328 18 int main(){
corsa1600 0:4a10c261f328 19 printf("--- PID - Regler ---\r\n");
corsa1600 0:4a10c261f328 20 printf("--- Kundegraber ---\r\n");
corsa1600 0:4a10c261f328 21
corsa1600 0:4a10c261f328 22 wait(2); // Zwei Sekunden warten vor Start
corsa1600 0:4a10c261f328 23
corsa1600 0:4a10c261f328 24 while(true){
corsa1600 0:4a10c261f328 25 //Xe = Input.read(); // Analogeingeng Einlesen 0...1
corsa1600 0:4a10c261f328 26
corsa1600 0:4a10c261f328 27 Xe = TestIn; // Eingang auf 100 (Künstlicher Sprung)
corsa1600 0:4a10c261f328 28
corsa1600 0:4a10c261f328 29 Xp = kp * Xe; // P-Regler
corsa1600 0:4a10c261f328 30 Xi = Xi + ki * Xe * dt; // I-Regler
corsa1600 0:4a10c261f328 31 Xd = kd * (Xe - XeAlt)/dt; // D-Regler
corsa1600 0:4a10c261f328 32
corsa1600 0:4a10c261f328 33
corsa1600 0:4a10c261f328 34 XeAlt = Xe; // Eingang für nächsten Zyklus merken
corsa1600 0:4a10c261f328 35
corsa1600 0:4a10c261f328 36 Xa = Xp + Xi + Xd; // PID Regler-Werte zusammenführen
corsa1600 0:4a10c261f328 37
corsa1600 0:4a10c261f328 38 if (Xi > maxi) Xi = maxi; // Begrenzung des I-Reglers auf Maximum
corsa1600 0:4a10c261f328 39 if (Xa > maxi) Xa = maxi; // Begrenzung des Ausgangs auf Maximum
corsa1600 0:4a10c261f328 40 else if (Xa < mini) Xa = mini; // Begrenzung des Ausgangs auf Minimum
corsa1600 0:4a10c261f328 41
corsa1600 0:4a10c261f328 42
corsa1600 0:4a10c261f328 43 Output = Xa/1023; // Ausgang in 0 bis 1 ausgeben (0...3,3V)
corsa1600 0:4a10c261f328 44
corsa1600 0:4a10c261f328 45 // Serielle Ausgabe der einzelnen Regler-Werte
corsa1600 0:4a10c261f328 46 printf("Xp = %4.1f, Xi = %4.1f, Xd = %4.1f \r\n",Xp,Xi,Xd);
corsa1600 0:4a10c261f328 47
corsa1600 0:4a10c261f328 48 // Serielle Ausgabe des 10bit Ausganswertes 0...1023
corsa1600 0:4a10c261f328 49 printf(" In: %4.1f Out: %4.1f\r\n \r\n", Xe, Xa);
corsa1600 0:4a10c261f328 50
corsa1600 0:4a10c261f328 51 wait(dt); // Warten mit Zeitkonstante
corsa1600 0:4a10c261f328 52 }
corsa1600 0:4a10c261f328 53 }