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

Thema: Heizungsregelung mit PID

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #5
    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 21:08 Uhr)

Ähnliche Themen

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

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad