Martin.
07.09.2010, 21:11
Hallo!
Ich habe leider Probleme mit dem Integralteil meines PID Reglers:
Initialisierung und variablen Definition:
uint16_t ADC0;
uint16_t ADC1;
uint16_t ADC2;
uint16_t ADC3;
uint16_t ADC4;
uint16_t ADC5;
long int Strom;
long int m_Sollwert;
long int m_Kp;
long int m_Ki;
long int m_Kd;
long int m_Abweichung;
long int m_Abweichung_Summe;
long int m_Abweichung_Alt;
long int m_Stellwert;
long int IAnteil = 0;
void Init_Regler(uint16_t Sollwert)
{
m_Sollwert = 90;
m_Kp = 15900; //Kp kritisch 28500 Tkritisch = 6ms Abtastung 0.45ms
m_Ki = 2100;
m_Kd = 14300;
m_Abweichung = 0;
m_Abweichung_Summe = 0;
m_Abweichung_Alt = 0;
m_Stellwert = 0;
}
Der Regelalgorithmus ans sich:
int PID_Berechnung (uint16_t Istwert)
{
m_Abweichung = m_Sollwert - Istwert;
if ((m_Stellwert < 1023)&&(m_Stellwert > 0))
m_Abweichung_Summe += m_Abweichung;
m_Stellwert = m_Kp*m_Abweichung;
m_Stellwert += m_Ki*m_Abweichung_Summe;
m_Stellwert += m_Kd*(m_Abweichung - m_Abweichung_Alt);
m_Abweichung_Alt = m_Abweichung;
m_Stellwert /= 10000;
if (m_Stellwert > 1023)
m_Stellwert = 1023;
if (m_Stellwert < 1)
m_Stellwert = 0;
return m_Stellwert;
}
Symptomatik:
ich wollte den Regler nach Ziegler Nichols Schwingungsmethode einstelle. Integralteil habe ich weggelassen und konnte schön Kp kritisch und Tkritisch bestimmen. Daraus habe ich Ki und Kd ausgerechnet. Leider geht der Regler sofort an den oberen Anschlag. Also habe ich Kd=0 gesetzt und Ki sehr klein. Nun kann ich zuschauen wie der Asymptotische Wert des Proportionalreglers langsam nach oben geschoben wird. Jedoch Steigt der Istwert wieder bis ans maximum an und verharrt oben. Auch nach langer Zeit sinkt er nicht wieder ab.
Deswegen dachte ich wärs das Anti windup.
Bei den Software-Reglern habe ich an dieses Thema gehalten: http://www.mikrocontroller.net/topic/82685#new
Irgendwie habe ich das gefühl, dass der I-Anteil immer weiter nach oben regeln möchte.
Da das ganze eine Regelung für ein Schaltnetzteil werden soll, habe ich nur (long) ints verwendet um ein bisschen Rechenzeit und Speicherplatz zu sparen. Wer Optimierungsmöglichkeiten sieht, darf das gerne auch sagen!
Danke
Martin
PS: Mit kleinen Sollwerten funktionierte es eigentlich schon ganz gut, nur bei größeren hats aufgehört.[/code]
Ich habe leider Probleme mit dem Integralteil meines PID Reglers:
Initialisierung und variablen Definition:
uint16_t ADC0;
uint16_t ADC1;
uint16_t ADC2;
uint16_t ADC3;
uint16_t ADC4;
uint16_t ADC5;
long int Strom;
long int m_Sollwert;
long int m_Kp;
long int m_Ki;
long int m_Kd;
long int m_Abweichung;
long int m_Abweichung_Summe;
long int m_Abweichung_Alt;
long int m_Stellwert;
long int IAnteil = 0;
void Init_Regler(uint16_t Sollwert)
{
m_Sollwert = 90;
m_Kp = 15900; //Kp kritisch 28500 Tkritisch = 6ms Abtastung 0.45ms
m_Ki = 2100;
m_Kd = 14300;
m_Abweichung = 0;
m_Abweichung_Summe = 0;
m_Abweichung_Alt = 0;
m_Stellwert = 0;
}
Der Regelalgorithmus ans sich:
int PID_Berechnung (uint16_t Istwert)
{
m_Abweichung = m_Sollwert - Istwert;
if ((m_Stellwert < 1023)&&(m_Stellwert > 0))
m_Abweichung_Summe += m_Abweichung;
m_Stellwert = m_Kp*m_Abweichung;
m_Stellwert += m_Ki*m_Abweichung_Summe;
m_Stellwert += m_Kd*(m_Abweichung - m_Abweichung_Alt);
m_Abweichung_Alt = m_Abweichung;
m_Stellwert /= 10000;
if (m_Stellwert > 1023)
m_Stellwert = 1023;
if (m_Stellwert < 1)
m_Stellwert = 0;
return m_Stellwert;
}
Symptomatik:
ich wollte den Regler nach Ziegler Nichols Schwingungsmethode einstelle. Integralteil habe ich weggelassen und konnte schön Kp kritisch und Tkritisch bestimmen. Daraus habe ich Ki und Kd ausgerechnet. Leider geht der Regler sofort an den oberen Anschlag. Also habe ich Kd=0 gesetzt und Ki sehr klein. Nun kann ich zuschauen wie der Asymptotische Wert des Proportionalreglers langsam nach oben geschoben wird. Jedoch Steigt der Istwert wieder bis ans maximum an und verharrt oben. Auch nach langer Zeit sinkt er nicht wieder ab.
Deswegen dachte ich wärs das Anti windup.
Bei den Software-Reglern habe ich an dieses Thema gehalten: http://www.mikrocontroller.net/topic/82685#new
Irgendwie habe ich das gefühl, dass der I-Anteil immer weiter nach oben regeln möchte.
Da das ganze eine Regelung für ein Schaltnetzteil werden soll, habe ich nur (long) ints verwendet um ein bisschen Rechenzeit und Speicherplatz zu sparen. Wer Optimierungsmöglichkeiten sieht, darf das gerne auch sagen!
Danke
Martin
PS: Mit kleinen Sollwerten funktionierte es eigentlich schon ganz gut, nur bei größeren hats aufgehört.[/code]