- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 3 von 3

Thema: PID Regler

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.12.2007
    Beiträge
    280

    PID Regler

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.07.2004
    Ort
    bei Stuttgart
    Alter
    42
    Beiträge
    760
    hi,
    warum hast du beim i-anteil ki*abweichung*summe? des macht doch eigentlich net wirklich sinn.
    mfg jeffrey

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.12.2007
    Beiträge
    280
    Stimmt. Das ist der offtzitierte Fehlerteufel. Muss ich gelich ausbessern.

    Danke!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress