Forum: Analoge Elektronik und Schaltungstechnik P-Regler (Verstärkung zu niedrig?)


von Stefan G. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich hatte hier schonmal zu meinem Problem unter "PI-Regelung bleibt
hängen..." gepostet. Lange Zeit bin ich da nicht weitergekommen. Nun
habe ich mich nochmal an die Regelung eines Gasdurchflusses mittels
Proportionalventil (PWM angesteuert) rangesetzt.
Bisher bekam ich immer ein total instabiles Regelverhalten. Nach
drastischem Reduzieren des k_p Faktors (von 1 auf 0,01) bekam ich
zunächst ein halbwegs anständiges Verhalten (zumindest dachte ich das,
da der Regelkreis zumindest nicht  mehr instabil war).
Nach etwas genauerem Hinschauen stellte ich jedoch fest, daß bei sehr
langem Laufenlassen der Regelung sich das Ventil immer weiter schließt.
Ihr könnt das Ergebnis in dem Excel File daß ich angehöngt habe unter
"Diagramm für k_p=0,01 (langzeit)" ansehen. Auf der Y-Achse ist der
A/D gewandelte Ouput meines Flusssensors aufgetragen (200 entpricht 1
Volt entspricht kein Durchfluss). Auf der X Achse ist einfach die
Anzahl der A/D Wandlungen aufgetragen (das geschieht per ISR ca. alle
70 millisekunden).

Habt ihr eine Ahnung was hier schiefläuft? Ist vielleicht die
Verstärkung zu gering? Jedoch verstehe ich nicht ganz, weshalb er das
Ventil dann immer weiter zu macht. Würde ein I-Anteil zusätzlich zum P
mir hier weiterhelfen?
Über jede art von Tipps wäre ich dankbar.
Gruß, Stefan

PS: ich hänge hier nochmal den Code für meine Regelung an (ich benutze
übrigens den ATmega323 sowie Codevision AVR):

interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;  //in adc_data wird das Ergebnis gespeichert
// Read the AD conversion result
adc_data=ADCW;

  // aktuelle Spannung einlesen (Wert zwischen 0 und 1023):
  v_ist = adc_data;


  // Regelabweichung e_k berechnen:
   e_k = v_soll - v_ist;


   // P-Regler (mit "gleitendem" Offset v_soll)
    u_p = (int) (e_k * k_p + v_soll);


      // Stellgrößenbegrenzung:
       if (u_p > 600) u_p = 600;
       else if (u_p < 400) u_p = 400;

       // Stellgröße in entsprechenden PWM Wert umrechnen und
       // Pulsbreite setzen:
       OCR1A = (int) u_p;


       // u_p_alt = u_p;
       // e_k_alt = e_k;


       itoa(v_ist,istwert);
       puts(istwert);
}

von Uwe (Gast)


Lesenswert?

Hi Stefan!

Was sagt denn dein Ausgang dazu? Ventiel warm werden und Begrenzung
PWM? Wo hast du denn die ganzen Werte her. RS232? Wenn ja, lasse mal
die Rechen und Stellwerte mit ausgeben. Übrigens Schwankungen zwischen
1023 und 203 bei den Messwerten sind sehr eigenartig.

MFG Uwe

von Stefan G. (Gast)


Lesenswert?

Hallo,
ich habe mir das nochmal genauer angesehen. Die Erwärmung des Ventils
und damit die Erwärmung des Luftstroms (-> Beeinflussung des Sensors)
ist mir nun auch eingefallen. Jedoch konnte ich nicht wirklich
feststellen, daß die Luft erwärmt wurde (mit Thermoelement gemessen).
Das merkwürdige an der ganzen Geschichte ist, daß es auf dem Oszi so
aussieht, als ob die Pulsbreite meiner PWM unverändert bleibt. Ich
werde nun nochmal einen anderen Flussmesser probieren, und mir auch mal
die Stellgröße auf dem Terminal ausgeben lassen. Vielleicht läßt sich
dort was ablesen.
Die Werte lasse ich mir übrigens nach jedem Interrupt (-> Durchführen
der Regelroutine) auf dem Terminal ausgeben. Die Werte die ich somit
vom A/D Wandler bekomme, stimmen auch mit den vom Multimeter gemessenen
Werten überein...
Gruß,
Stefan

von Jens Renner (Gast)


Lesenswert?

Hallo Stefan,

ich habe mir Deinen Code noch nicht im Detail angeschaut, aber eine
bleibende Regelabweichung bei einem P-Regler ist ja normal. Und die ist
umso größer, je kleiner dein Kp ist.
Ein I-Anteil würde da definitiv Abhilfe schaffen.
Ob das jetzt spezifisch auf Dein Problem zutrifft, weiß ich leider
nicht.

Ist Deine Stellgrößen-Berechnung beim PI eigentlich identisch zu dieser
hier?
u_k = u_k_alt + k_p*(e_k + ((t_0/t_i) - 1)*e_k_alt);

Jens

von Stefan G. (Gast)


Lesenswert?

Ich habe nun nochmal ein wenig an meinem Code rumgebastelt und siehe da,
es sieht nun ganz gut aus, bis auf daß ich ordentlich Überschwinger
habe, aber da kann man wohl noch ein wenig an den Parametern
rumoptimieren. (s. Excel File)

Ich habe nun einen PI Regler folgendermaßen realisiert:

interrupt [ADC_INT] void adc_isr(void)
{
unsigned int adc_data;  //in adc_data wird das Ergebnis gespeichert
// Read the AD conversion result
adc_data=ADCW;

  // aktuelle Spannung einlesen (Wert zwischen 0 und 1023):
  v_ist = adc_data;


  // Regelabweichung e_k berechnen:
   e_k = v_soll - v_ist;


   // P-Anteil
        u_p = (int) (e_k * k_p);

        // I_Anteil
    u_i += (int) (e_k * k_i);

    // gesamte Stellgröße:
        u_g = u_i + u_p;


       // Stellgröße in entsprechenden PWM Wert umrechnen und
       // Pulsbreite setzen:
       OCR1A = (int) u_g;

       itoa(v_ist,istwert);
       puts(istwert);
}

Werde da nochmal etwas rumtesten. Erst schonmal vielen Dank.
Stefan

von Gerhard Humer (Gast)


Lesenswert?

Hallo Stefan ,


daß ein PI-Regler zum Überschwingen neigt ist normal.
Hab die selbe Erfahrung mit meinen Servomotor-Reglern gemacht.
Abhilfe gibts hier nur durch einbinden des D-Anteiles ,der für die
notwendige Dämpfung der Regelung verantwortlich ist.

Gruss Gerhard

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.