thermferm/thermferm.c

changeset 185
4f34271cf1e7
parent 184
db997a04fde3
child 188
4fc17ef4593f
equal deleted inserted replaced
184:db997a04fde3 185:4f34271cf1e7
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;
474 unit->cooler_state = 0; 482 unit->cooler_state = 0;
475 device_out(unit->cooler_address, unit->cooler_state); 483 device_out(unit->cooler_address, unit->cooler_state);
476 } 484 }
477 } else { 485 } else {
478 err = 0.0; 486 err = 0.0;
479 I_err = 0.0; 487 unit->PID_I_err = 0.0;
480 unit->PID_err_old = 0.0; 488 unit->PID_err_old = 0.0;
481 } 489 }
482 } 490 }
483 } 491 }
484 492

mercurial