Hallo!
Ich hab endlich meinen PID Regler einigermaßen in den Griff bekommen.
Code:
//Definition der Konstanten
float Sollspannung1 = 2.10;
float Sollspannung2 = 5.00;
float Kp =
float Ki =
float Kd =
float Abweichung = 0;
float AbweichungAlt1 = 0;
float PWM1 = 0;
float Esum1 = 0;
float AbweichungAlt2 = 0;
float PWM2 = 0;
float Esum2 = 0;
float Spannung1 = 0;
float Spannung2 = 0;
int Regelkreis1 (float Sollwert, float Istwert)
{
Abweichung = Sollwert - Istwert; //Abweichung bestimmen
if ((PWM1 < 1023)&&(PWM1 > 0)) //Anti Windup
{
Esum1 = Esum1 + Abweichung;
}
PWM1 = Ki * Esum1; //I-Anteil
PWM1 += Kp * Abweichung; //P-Anteil
PWM1 += Kd * (Abweichung -AbweichungAlt1); //D-Anteil
if (PWM1 > 1023) PWM1 = 1023; //Begrenzung des Rückgabewertes
if (PWM1 < 0) PWM1 = 0;
AbweichungAlt1 = Abweichung;
return PWM1;
}
int Regelkreis2 (float Sollwert, float Istwert)
{
Abweichung = Sollwert - Istwert;
if ((PWM2 < 1023)&&(PWM2 > 0))
{
Esum2 = Esum2 + Abweichung;
}
PWM2 = Ki * Esum2;
PWM2 += Kp * Abweichung;
PWM2 += Kd * (Abweichung -AbweichungAlt2);
if (PWM2 > 1023) PWM2 = 1023;
if (PWM2 < 0) PWM2 = 0;
AbweichungAlt2 = Abweichung;
return PWM2;
}
int main(void)
{
...
while (1)
{
OCR1A = c; //PWM Anfangs mit dem Wert 0 ausgeben
OCR1B = d;
adcval = Spannungsmessung(0); //Spannungsmessung
Spannung1 = (float)adcval * 0.0319;
adcval = Spannungsmessung(1);
Spannung2 = (float)adcval * 0.0319;
sprintf(wert4, "%f", Spannung1); //Spannung auf dem LCD ausgeben
lcd_gotoxy(0,0);
lcd_puts(wert4);
lcd_gotoxy(14,0);
sprintf(wert, "%f", Sollspannung1);
lcd_puts(wert);
lcd_gotoxy(0,2);
sprintf(wert5, "%f", Spannung2);
lcd_puts(wert5);
wert[5] = '\n';
uart_puts(wert); //Daten an PC schicken
c = Regelkreis1(Sollspannung2,Spannung2); //Regelkreise aufrufen
d = Regelkreis2(Sollspannung1,Spannung1);
}
return 0;
}
Ich wollte ihn hier einfach kurz mal vorstellen. Vielleicht kann ja der ein oder andere etwas drann verbessern oder es hilft ihm sich mal den Durchzulesen. Die Konstanten müssen halt noch von jedem abgeändert werden. Achja damit wird ein Schaltnetzteil geregelt. Die Ausgangsspannung wird überwacht und durch das PWM Signal eingestellt. Was ich noch implementieren möchte ist eine Stromüberwachung für eine Konstantstromquelle.
Viel Spaß damit
Martin
Lesezeichen