Mahlzeit zusammen,
ich habe etwas die Berechnung angepasst, sieht jetzt aus:
Damit rechnet er schon mal genau so wie ich es von ihm erwarte... hatte noch einen anderen kleinen Bug...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; }
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.







Zitieren

Lesezeichen