Oliver Ainhirn
/
pid-regler
PID-Regler
main.cpp@0:4a10c261f328, 2019-02-04 (annotated)
- Committer:
- corsa1600
- Date:
- Mon Feb 04 17:02:55 2019 +0000
- Revision:
- 0:4a10c261f328
PID-Regler
Who changed what in which revision?
User | Revision | Line number | New 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 | } |