diff --git a/src/pid.c b/src/pid.c --- a/src/pid.c +++ b/src/pid.c @@ -35,7 +35,7 @@ float pid_process(void) // Get ssr output for next time int16_t power_percent = pid_update(); - if(flash_getsettings()->val.plant_type == PLANT_HEATER) + if(flash_getsettings()->val.plant_type == PLANT_COOLER) power_percent *= -1; //power-percent is 0-1000? @@ -43,9 +43,9 @@ float pid_process(void) // put ssr output on display ssd1306_drawstring(" ", 0, 90); //fixme: this is bad, but I can't get the old digits to clear otherwise - char tempstr[6]; - snprintf(tempstr, 6, "%g", ssr_output); - ssd1306_drawstring(tempstr, 0, 90); + char tempstr[8]; + snprintf(tempstr, 8, "%4.1f%%", ssr_output/10.0); + ssd1306_drawstring(tempstr, 0, 85); } else { @@ -64,7 +64,8 @@ int16_t pid_update(void) float temp = status->temp; // Calculate instantaneous error - int16_t error = status->setpoint - temp; // TODO: Use fixed point fraction + // EMZ FIXME: was regulating to 1 degree below the setpoint! +1 accomadates for this + int16_t error = (status->setpoint+1) - temp; // Proportional component int32_t p_term = set->val.k_p * error; @@ -78,7 +79,7 @@ int16_t pid_update(void) // it cant help be cold despite its best efforts) // not necessary, but this makes windup guard values // relative to the current iGain - int32_t windup_guard_res = (set->val.windup_guard) / set->val.k_i; + int32_t windup_guard_res = (set->val.windup_guard * 10) / set->val.k_i; // Calculate integral term with windup guard if (state.i_state > windup_guard_res) @@ -86,6 +87,10 @@ int16_t pid_update(void) else if (state.i_state < -windup_guard_res) state.i_state = -windup_guard_res; + // Discard I if we've achieved the setpoint (TODO: add setting disable/enable) + if(error <= 0) + state.i_state = 0; + int32_t i_term = set->val.k_i * state.i_state; // Calculate differential term (slope since last iteration)