Gast
#36805
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); }