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); }
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.