Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r56ba1b163b0cbf6953638065b2108f745b17ec8f -r885c00adcbedd23bea67e495d6f2ee291f878b37 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 56ba1b163b0cbf6953638065b2108f745b17ec8f) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 885c00adcbedd23bea67e495d6f2ee291f878b37) @@ -779,10 +779,12 @@ { // Duty cycle = ( 69.73 * flow rate * deltaT / primary heater maximum power ) ^ 1/2 // Multiply the duty cycle to the heater efficiency - F32 dutyCycle = sqrt( ( WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES * fabs( targetTemperature - currentTemperature ) * flow ) / PRIMARY_HEATERS_MAXIMUM_POWER_WATTS ); - dutyCycle *= heatersStatus[ DG_PRIMARY_HEATER ].heaterEstGain; - dutyCycle = MIN( dutyCycle, HEATERS_MAX_DUTY_CYCLE ); - dutyCycle = MAX( dutyCycle, HEATERS_MIN_DUTY_CYCLE ); + F32 deltaTempC = targetTemperature - currentTemperature; + F32 capDeltaTempC = MAX( deltaTempC, 0.0F ); + F32 dutyCycle = sqrt( ( WATER_SPECIFIC_HEAT_DIVIDED_BY_MINUTES * capDeltaTempC * flow ) / PRIMARY_HEATERS_MAXIMUM_POWER_WATTS ); + dutyCycle *= heatersStatus[ DG_PRIMARY_HEATER ].heaterEstGain; + dutyCycle = MIN( dutyCycle, HEATERS_MAX_DUTY_CYCLE ); + dutyCycle = MAX( dutyCycle, HEATERS_MIN_DUTY_CYCLE ); return dutyCycle; }