thermferm/pid.c

changeset 492
750f2468dec5
parent 363
468ec0d96cce
child 495
712984fdd26b
--- 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;
     }
 

mercurial