Hallo!
Ich hab endlich meinen PID Regler einigermaßen in den Griff bekommen.
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.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; }
Viel Spaß damit
Martin







Zitieren

Lesezeichen