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.
Lesezeichen