diff -r db997a04fde3 -r 4f34271cf1e7 thermferm/thermferm.c --- 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; } }