diff -r 31b14c9ac625 -r 750f2468dec5 thermferm/pid.c --- a/thermferm/pid.c Sat Mar 05 12:50:23 2016 +0100 +++ b/thermferm/pid.c Fri Mar 11 20:27:02 2016 +0100 @@ -26,7 +26,7 @@ void InitPID(pid_var *pid, int type) { - pid->Err = pid->ErrLast = pid->iState = 0.0; + pid->Err = pid->InputLast = pid->iState = 0.0; pid->Input = pid->OutP = pid->SetP = 0.0; pid->pGain = pid->iGain = pid->dGain = 0.0; pid->idleRange = 0.4; @@ -41,7 +41,7 @@ { if (pid->Mode == PID_MODE_AUTO) { - double pTerm, dTerm, iTerm; + double dTerm; if (pid->Type == PID_TYPE_HEAT) pid->Err = pid->SetP - pid->Input; @@ -52,24 +52,22 @@ * Calculate the integral state with appopriate limiting. * Use ErrLastLast as iState */ - pid->iState += pid->Err; - if (pid->iState > PID_WINDUP_GUARD) - pid->iState = PID_WINDUP_GUARD; - else if (pid->iState < -PID_WINDUP_GUARD) - pid->iState = -PID_WINDUP_GUARD; + pid->iState += (pid->iGain * pid->Err); + if (pid->iState > pid->iMax) + pid->iState = pid->iMax; + else if (pid->iState < 0) + pid->iState = 0; - pTerm = pid->pGain * pid->Err; - iTerm = pid->iGain * pid->iState; - dTerm = pid->dGain * (pid->Err - pid->ErrLast); + dTerm = (pid->Input - pid->InputLast); - pid->OutP = pTerm + dTerm + iTerm; - pid->ErrLast = pid->Err; + pid->OutP = (pid->pGain * pid->Err) + pid->iState - (pid->dGain * dTerm); + pid->InputLast = pid->Input; } else if (pid->Mode == PID_MODE_BOO) { /* * Mode Bang On Off */ - pid->ErrLast = pid->Err; + pid->InputLast = pid->Input; if (pid->Type == PID_TYPE_HEAT) pid->Err = pid->SetP - pid->Input; @@ -88,7 +86,7 @@ * While in manual mode, stay ready for bumpless switch to * auto. */ - pid->ErrLast = pid->Err = 0.0; + pid->InputLast = pid->Input; pid->OutP = pid->iState = 0.0; }