247 { |
247 { |
248 char buf[1024], *filename, target[40], heater[40], cooler[40], fan[40], door[40]; |
248 char buf[1024], *filename, target[40], heater[40], cooler[40], fan[40], door[40]; |
249 time_t now, last = (time_t)0; |
249 time_t now, last = (time_t)0; |
250 units_list *unit; |
250 units_list *unit; |
251 int rc, run = 1, seconds = 0, minutes = 0, piddelay = 0, temp, deviation; |
251 int rc, run = 1, seconds = 0, minutes = 0, piddelay = 0, temp, deviation; |
252 float err = 0.0, sp, pv, P_err, I_err = 0.0, D_err, Out; |
252 float err = 0.0, sp, pv, P_err, D_err, Out; |
253 #ifdef HAVE_WIRINGPI_H |
253 #ifdef HAVE_WIRINGPI_H |
254 struct tm *tm; |
254 struct tm *tm; |
255 int row; |
255 int row; |
256 #else |
256 #else |
257 long t = 0; |
257 long t = 0; |
444 sp = unit->prof_target; |
444 sp = unit->prof_target; |
445 } |
445 } |
446 |
446 |
447 unit->PID_err_old = err; |
447 unit->PID_err_old = err; |
448 err = sp - pv; |
448 err = sp - pv; |
449 if (err < unit->idle_rangeH && err > unit->idle_rangeL) |
449 if (err < unit->idle_rangeH && err > unit->idle_rangeL) { |
450 err = 0; |
450 err = 0; |
|
451 unit->PID_I_err -= unit->PID_err_old; |
|
452 } else { |
|
453 unit->PID_I_err += unit->PID_err_old; |
|
454 } |
|
455 /* Limit intergral error */ |
|
456 if (unit->PID_I_err < -10.0) |
|
457 unit->PID_I_err = -10.0; |
|
458 if (unit->PID_I_err > 10.0) |
|
459 unit->PID_I_err = 10.0; |
451 P_err = err; |
460 P_err = err; |
452 I_err += unit->PID_err_old; |
|
453 D_err = err - unit->PID_err_old; |
461 D_err = err - unit->PID_err_old; |
454 |
462 |
455 /* |
463 /* |
456 * A postive value means heating, a negative value cooling. |
464 * A postive value means heating, a negative value cooling. |
457 */ |
465 */ |
458 Out = (5.0*P_err) + (0.25*I_err) + (1.5*D_err); |
466 Out = (10.0*P_err) + (0.1*unit->PID_I_err) + (5*D_err); |
459 // Kp 0.1 Ki 0.3 Kd 0.02 |
467 // Kp 0.1 Ki 0.3 Kd 0.02 |
460 if (debug) |
468 if (debug) |
461 fprintf(stdout, "sp=%.2f pv=%.2f err_old=%.2f err=%.2f P_err=%.2f I_err=%.2f D_err=%.2f Out=%.2f\n", |
469 fprintf(stdout, "sp=%.2f pv=%.2f err_old=%.2f err=%.2f P_err=%.2f I_err=%.2f D_err=%.2f Out=%.2f\n", |
462 sp, pv, unit->PID_err_old, err, P_err, I_err, D_err, Out); |
470 sp, pv, unit->PID_err_old, err, P_err, unit->PID_I_err, D_err, Out); |
463 if (unit->heater_address) { |
471 if (unit->heater_address) { |
464 if (Out >= 2) |
472 if (Out >= 2) |
465 unit->heater_state = 100; |
473 unit->heater_state = 100; |
466 else |
474 else |
467 unit->heater_state = 0; |
475 unit->heater_state = 0; |