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; } Index: firmware/App/Monitors/Temperature.c =================================================================== diff -u -r9eae2f683887bededd2240f51ddfc667d8c1d566 -r4f85c7f9ea610584566e869723874bbeffd6b41e --- firmware/App/Monitors/Temperature.c (.../Temperature.c) (revision 9eae2f683887bededd2240f51ddfc667d8c1d566) +++ firmware/App/Monitors/Temperature.c (.../Temperature.c) (revision 4f85c7f9ea610584566e869723874bbeffd6b41e) @@ -46,6 +46,7 @@ #define D28_D30_DATA_COLLECTION_TIME_MS ( 1 * MS_PER_SECOND ) ///< Dialysate temperature sensors data collection time in milliseconds. #define D28_D30_TEMP_SENSORS_MAX_DEVIATION_C 3.0F ///< Dialysate temperature sensors maximum allowed deviation in C. #define DIALYSATE_TEMP_SNSRS_OUT_OF_RANGE_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Dialysate temperature sensors drift timeout in milliseconds. +#define TEMP_SNSRS_FILTERING_SAMPLE_TIME_SEC 5.0F ///< Dialysate temperature sensors sample interval into moving average filter. #define D28_D30_TEMP_SENSORS_MAX_DEVIATION_IN_HEAT_DIS_C 5.0F ///< Dialysate temperature sensors maximum allowed deviation in heat disinfect in C. /// Dialysate temperature sensors enums @@ -450,9 +451,18 @@ *************************************************************************/ static void getTempMovingAverageTimeInterval( void ) { + DD_OP_MODE_T opMode = getCurrentOperationMode(); + U32 sampleInterval; F32 period = (F32)SEC_PER_MIN / ( getTDDialysateFlowrate() / BAL_CHAMBER_FILL_VOLUME_ML ) ; - U32 sampleInterval = (U32)( ( period / (F32)TEMP_MOVING_AVG_NUM_OF_SAMPLES ) * MS_PER_SECOND ); + if ( DD_MODE_HEAT == opMode ) + { + sampleInterval = (U32)( ( TEMP_SNSRS_FILTERING_SAMPLE_TIME_SEC / (F32)TEMP_MOVING_AVG_NUM_OF_SAMPLES ) * MS_PER_SECOND ); + } + else + { + sampleInterval = (U32)( ( period / (F32)TEMP_MOVING_AVG_NUM_OF_SAMPLES ) * MS_PER_SECOND ); + } tempDataCollectionTimeInterval = (U32) ( sampleInterval / TASK_PRIORITY_INTERVAL ); }