Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -r4eab0a5086a5fddeea6cbdf3f79ce1067851b4be -rc28fa96d9ed38b8bfa793eb9096e32967e2e40cb --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 4eab0a5086a5fddeea6cbdf3f79ce1067851b4be) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision c28fa96d9ed38b8bfa793eb9096e32967e2e40cb) @@ -8,7 +8,7 @@ * @file Heaters.c * * @author (last) Dara Navaei -* @date (last) 03-Feb-2023 +* @date (last) 09-Feb-2023 * * @author (original) Dara Navaei * @date (original) 23-Apr-2020 @@ -55,6 +55,7 @@ #define HEATERS_MIN_EST_GAIN 0.2F ///< Heaters minimum estimation gain. #define HEATERS_MAX_EST_GAIN 5.0F ///< Heaters maximum estimation gain. #define HEATERS_NEUTRAL_EST_GAIN 1.0F ///< Heaters neutral estimation gain. +#define HEATERS_ZERO_DELTA_TEMP_C 0.0F ///< Heaters zero delta temperature in C. #define HEATERS_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Heaters data publish interval. @@ -68,6 +69,7 @@ #define TRIMMER_HEATER_MAX_POWER_W 66.5F ///< Trimmer heater maximum power in Watts. #define TRIMMER_HEATER_INITIAL_CONTROL_INTERVAL_COUNT ( ( 10 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Trimmer heater initial control interval count. #define TRIMMER_HEATER_CONTROL_INTERVAL_COUNT ( ( 30 * MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Trimmer heater control interval count. +#define TRIMMER_HEATER_MIN_DIALYSATE_FLOWRATE_LPM 0.05F ///< Trimmer heater minimum dialysate flow rate in L/min. #define DELTA_TEMPERATURE_TIME_COSNTANT_C 8.6F ///< Delta temperature calculated from time constant. #define PRIMARY_HEATER_DUTY_CYCLE_PER_TEMPERATURE_C 0.015F ///< Primary heaters duty cycle per temperature in C. @@ -373,7 +375,7 @@ { alarm = ALARM_ID_DIALYSATE_FLOW_TOO_LOW_WHILE_TRIMMER_HEATER_IS_ON; measFlow = getMeasuredRawFlowRateLPM( DIALYSATE_FLOW_SENSOR ); - minFlow = MIN_DIALYSATE_FLOWRATE_LPM; + minFlow = TRIMMER_HEATER_MIN_DIALYSATE_FLOWRATE_LPM; isFlowLow = ( measFlow > minFlow ? FALSE : TRUE ); } @@ -782,10 +784,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, HEATERS_ZERO_DELTA_TEMP_C ); + 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; }