Gast
#1251296
Hallo Ihr,
ich steh mal wieder auf dem Schlauch.
Versuche gerade einen PI-Regler zu programmieren. Prinzipiell tuts auch.
Ich bekomme nur meine Regelabweichung nicht weg.
Wenn ich den I-Regler alleine betreibe, dann bleibt auch eine Differenz
übrig.
Das ganze Regelt die Drehzahl eines Motors. Der Code sieht
folgendermaßen aus. Vielleicht hab ich ja einen Dennkfehler drin:
global: s32 y_I=0;
#define NMAX 3500
#define Kp 0
#define Ki 6 //schwingt bei 7 (besteht eigentlich aus TA*Ki TA ist 1ms)
w ist der Sollwert 0-100%
x ist der Istwert 0- 30.000 (U/min) im Moment nur bis 4000 U/min
u32 closed_loop_control(u32 w, u32 x)
{
s32 y; //neue Stellgröße
s32 e; //Regelabweichung
s32 y_P; //Stellgröße des P Anteils
//w in Drehzahl umrechnen
w = w * NMAX / 100; //Sollwert
e = (s32) w - (s32) x; //Drehzahldifferenz zwischen Soll und Ist
y_P = Kp * e; //Proportionalwert
y_I = Ki * (y_I + e); //alter I-Wert + aktuelle Regelabweichung
y_I /= 10; //Ki <1
y = y_P + y_I;
/* Rückrechnung auf % */
y = y * 100 / NMAX;
if (y > 100)
{
y = 100;
}
if (y < 1)
{
y = 0;
}
return((u32)y);
}
Grüße,
Michael