- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 9 von 9

Thema: Heizungsregelung mit PID

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    25.05.2008
    Ort
    Korntal-Münchingen
    Alter
    42
    Beiträge
    15
    Mahlzeit zusammen,

    ich habe etwas die Berechnung angepasst, sieht jetzt aus:

    Code:
    uint16_t calc_pid (uint16_t referenceValue, uint16_t measuredValue, bool inverted)
    {
        float pTerm = 0, iTerm = 0, dTerm = 0;
        // calculation error:
        int16_t error = (int16_t) referenceValue - (int16_t) measuredValue;
        int16_t position = (int16_t) measuredValue;
        
        // calculate p-term;
        if (inverted)
        {
            pTerm = -pidController.pGain * error;
        } else {
            pTerm = pidController.pGain * error;
        }
        
        
        //Calculate the integral state
        pidController.iState += error;
        
        // check limits of iState
        if (pidController.iState > pidController.iMax) pidController.iState = pidController.iMax;
        if (pidController.iState < pidController.iMin) pidController.iState = pidController.iMin;
        
        //Calculate the integral term.
        if (inverted)
        {
            iTerm = -pidController.iGain * pidController.iState;
        } else {
            iTerm = pidController.iGain * pidController.iState;
        }
        
        //Calculate the derivative term.
        if (inverted)
        {
            dTerm = -pidController.dGain * (pidController.dState - position);
        } else {
            dTerm = pidController.dGain * (pidController.dState - position);
        }
        pidController.dState = position;
        
        //Calculate regulation (PI).
        int16_t RegulationOutput = pTerm + iTerm + dTerm;
        
        // check limits of pwm here....
        
        if (RegulationOutput > pidController.pwmMax) 
        {
            RegulationOutput = pidController.pwmMax;
        }
        
        if (RegulationOutput < pidController.pwmMin)
        {
             RegulationOutput = pidController.pwmMin;
        }
            
        return  (uint16_t) RegulationOutput;
    }
    Damit rechnet er schon mal genau so wie ich es von ihm erwarte... hatte noch einen anderen kleinen Bug...
    Memo an mich: VS verhält sich bei manchen Sachen (Datentypkonvertierung) anders als Microchip Studio...


    Habe jetzt pidController.iGain und pidController.dGain auf 0 gesetzt und spiele nur mit dem pidController.pGain rum.

    So sieht es mit pidController.pGain = 3.1 aus. Die Heizung wird alle 100ms überprüft (referenz vs. aktuell) und nachgeregelt.
    (sorry muss das Bild extern hosten, die Forumsoftware macht es mini und da sieht man nichts):

    Bild hier  

    gelbe Linie: der Referenzwert. Der liegt bei kostant 208.
    grüne Linie: der aktuelle Wert. Der schwankt zwischen 226 und 237.
    rote Linie: PWM-Wert (Ausgabe des PID-Reglers, andere Auflöung) pendelt zwischen 68 und 86.

    Ich würde sagen, ich kann mit dem pidController.pGain noch ein Stückchen höher gehen oder?

    EDIT:
    So sieht die Linie mit pidController.pGain = 7.1 und pidController.iGain = 0.18 aus:

    Bild hier  

    gelbe Linie: der Referenzwert. Der liegt bei kostant 208.
    grüne Linie: der aktuelle Wert. Der schwankt zwischen 209 und 216.
    rote Linie: PWM-Wert (Ausgabe des PID-Reglers, andere Auflöung) pendelt zwischen 59 und 102.
    Geändert von Hemi (08.09.2022 um 22:08 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    899
    Eigentlich schon nicht schlecht, kann aber sein, dass die Parameter im wahren Leben (wenn die Lambdasonde im heißen Abgasstrom hängt) noch einmal angepasst werden müssen (weniger p, mehr i).
    Etwas mehr i würde der Sache wahrscheinlich eh nicht schaden, idealerweise schwingt der Ist-Wert dann einmal kurz über den Sollwert, ohne in Dauerschwingung überzugehen. Dann würde Ist auch um den Soll herum geregelt, nicht nur darunter.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    25.05.2008
    Ort
    Korntal-Münchingen
    Alter
    42
    Beiträge
    15
    Ich habe ein kleines Video gemacht, wo man den Regelverlauf sieht.
    PID Werte sind im Video: P = 5, I = 0.8 und D = 3.2 (ist ein spontaner Wert).



    Die PID-Regelung fängt bei 0:50 an zu arbeiten, da sieht man einen gelben Pick. Im unteren Fenster (Titel: Grafik) sieht man die Linien:
    -> PID (gelb) ist PWM-Wert
    -> Ur_raw (grün) ist aktueller Wert
    -> Ur_ref_raw (rot) ist die Referenz

    Man sieht, dass die grüne Linie überwiegend auf der roten liegt. Ich habe den Sensor kräftig angepustet und gesehen, dass die grüne Linie nur kurz und leicht über der roten lag. PWM ging direkt hoch.

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    899
    Schick.
    Jetzt könnte man noch des Lerneffektes wegen versuchen, die Parameter nach Ziegler/Nichols mathematisch aus der Sprungantwort zu ermitteln und mit den Eigenen (Werte und Ergebnisse) vergleichen.
    Geändert von Holomino (12.09.2022 um 10:28 Uhr)

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    25.05.2008
    Ort
    Korntal-Münchingen
    Alter
    42
    Beiträge
    15
    Okay, das ist dann für Fortgeschrittene

Ähnliche Themen

  1. Mega 32 Heizungsregelung
    Von motch im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 04.12.2005, 17:23

Berechtigungen

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

12V Akku bauen