Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -rff0edadf0c6f161a0a092ddaf94d1940d64f7d5e -r4f85c7f9ea610584566e869723874bbeffd6b41e --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision ff0edadf0c6f161a0a092ddaf94d1940d64f7d5e) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 4f85c7f9ea610584566e869723874bbeffd6b41e) @@ -45,10 +45,15 @@ // ********** private definitions ********** #define AC_HEATER_TX_MAX_DUTY_CYCLE 0.50F ///< AC Heater treatment mode max duty cycle (50% of 1400W : 700W ) -#define AC_HEATER_HEAT_MAX_DUTY_CYCLE 0.70F ///< AC Heater heat disinfect mode max duty cycle (70% of 1400W : 980W ) +#define AC_HEATER_LOW_HEAT_MAX_DUTY_CYCLE 0.70F ///< AC Heater heat disinfect mode max duty cycle (70% of 1400W : 980W ) +#define AC_HEATER_UPPER_HEAT_MAX_DUTY_CYCLE 0.50F ///< AC Heater heat disinfect mode reduced duty cycle (50% of 1400W : 700W ) +#define AC_HEATER_REDUCED_DUTY_CYCLE 0.40F ///< AC Heater heat disinfect mode reduced duty cycle (40% of 1400W : 700W ) #define AC_HEATER_MAX_DUTY_CYCLE 1.0F ///< AC Heater max duty cycle (100.0%) or ON state #define DC_HEATER_MAX_DUTY_CYCLE 1.0F ///< DC Heater max duty cycle (100%) or ON state #define HEATERS_MIN_DUTY_CYCLE 0.0F ///< Heaters minimum duty cycle (0.00%) or OFF state +#define HEATERS_DISINFECT_TEMPERATURE_VERY_HIGH_DRIFT_C 10.0F ///< Heaters disinfect temperature very high drift in C. +#define HEATERS_DISINFECT_TEMPERATURE_HIGH_DRIFT_C 7.0F ///< Heaters disinfect temperature high drift in C. +#define HEATERS_DISINFECT_TEMPERATURE_MED_DRIFT_C 5.0F ///< Heaters disinfect temperature medium drift in C. #define HEATERS_DISINFECT_TEMPERATURE_DRIFT_C 3.0F ///< Heaters disinfect temperature drift in C. #define HEATERS_ZERO_DELTA_TEMP_C 0.0F ///< Heaters zero delta temperature in C. #define HEATERS_DUTY_CYCLE_CONVERSION_FACTOR 100.0F ///< Heaters duty cycle 0: OFF, 100: 100% duty cycle. @@ -983,6 +988,8 @@ else { // TODO : Calculate required duty cycle + // Start Open loop control with max power for heating + control[ heater ].data = AC_HEATER_LOW_HEAT_MAX_DUTY_CYCLE; state = HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET; } } @@ -1156,11 +1163,38 @@ { HEATERS_STATE_T state = HEATER_EXEC_STATE_CONTROL_TO_DISINFECT_TARGET; - //TODO : update dutycycle for the heat disinfect state + if ( D5_HEAT == heater ) + { + F32 currentTemperature = getFilteredTemperatureValue( D78_TEMP ); + F32 heaterTemperature = getFilteredTemperatureValue( D4_TEMP ); + F32 targetTemperature = getHeaterTargetTemperature( heater ); + F32 deltaTemp = currentTemperature - targetTemperature; - setHeaterControl( D45_HEAT ); - setHeaterControl( D5_HEAT ); + if ( heaterTemperature > HEATER_TARGET_TEMPERATURE_MAX ) + { + control[ D5_HEAT ].data = HEATERS_MIN_DUTY_CYCLE; + } + else if ( deltaTemp > HEATERS_DISINFECT_TEMPERATURE_VERY_HIGH_DRIFT_C ) + { + control[ D5_HEAT ].data = HEATERS_MIN_DUTY_CYCLE; + } + else if ( currentTemperature < targetTemperature ) + { + control[ D5_HEAT ].data = AC_HEATER_LOW_HEAT_MAX_DUTY_CYCLE; + } + else if ( deltaTemp > HEATERS_DISINFECT_TEMPERATURE_HIGH_DRIFT_C ) + { + control[ D5_HEAT ].data = AC_HEATER_REDUCED_DUTY_CYCLE; + } + // TODO : if the current temp goes beyond the set limit + threshold, reduce the PWM Cycle + else if ( deltaTemp > HEATERS_DISINFECT_TEMPERATURE_DRIFT_C ) + { + control[ D5_HEAT ].data = AC_HEATER_UPPER_HEAT_MAX_DUTY_CYCLE; + } + setHeaterControl( D5_HEAT ); + } + return state; }