thermferm/thermferm.c

changeset 185
4f34271cf1e7
parent 184
db997a04fde3
child 188
4fc17ef4593f
--- a/thermferm/thermferm.c	Tue Aug 05 16:24:17 2014 +0200
+++ b/thermferm/thermferm.c	Tue Aug 05 21:33:06 2014 +0200
@@ -249,7 +249,7 @@
     time_t		now, last = (time_t)0;
     units_list		*unit;
     int			rc, run = 1, seconds = 0, minutes = 0, piddelay = 0, temp, deviation;
-    float		err = 0.0, sp, pv, P_err, I_err = 0.0, D_err, Out;
+    float		err = 0.0, sp, pv, P_err, D_err, Out;
 #ifdef HAVE_WIRINGPI_H
     struct tm		*tm;
     int			row;
@@ -446,20 +446,28 @@
 
 			unit->PID_err_old = err;
 			err = sp - pv;
-			if (err < unit->idle_rangeH && err > unit->idle_rangeL)
+			if (err < unit->idle_rangeH && err > unit->idle_rangeL) {
 			    err = 0;
+			    unit->PID_I_err -= unit->PID_err_old;
+			} else {
+			    unit->PID_I_err += unit->PID_err_old;
+			}
+			/* Limit intergral error */
+			if (unit->PID_I_err < -10.0)
+			    unit->PID_I_err = -10.0;
+			if (unit->PID_I_err > 10.0)
+			    unit->PID_I_err = 10.0;
 			P_err = err;
-			I_err += unit->PID_err_old;
 			D_err = err - unit->PID_err_old;
 
 			/*
 			 * A postive value means heating, a negative value cooling.
 			 */
-			Out = (5.0*P_err) + (0.25*I_err) + (1.5*D_err);
-			//     Kp 0.1        Ki 0.3        Kd 0.02
+			Out = (10.0*P_err) + (0.1*unit->PID_I_err) + (5*D_err);
+			//     Kp 0.1        Ki 0.3                   Kd 0.02
 			if (debug)
 			    fprintf(stdout, "sp=%.2f pv=%.2f err_old=%.2f err=%.2f P_err=%.2f I_err=%.2f D_err=%.2f Out=%.2f\n",
-						sp, pv, unit->PID_err_old, err, P_err, I_err, D_err, Out);
+						sp, pv, unit->PID_err_old, err, P_err, unit->PID_I_err, D_err, Out);
 			if (unit->heater_address) {
 			    if (Out >= 2)
 				unit->heater_state = 100;
@@ -476,7 +484,7 @@
 			}
 		    } else {
 			err = 0.0;
-			I_err = 0.0;
+			unit->PID_I_err = 0.0;
 			unit->PID_err_old = 0.0;
 		    }
 		}

mercurial