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