Index: firmware/App/Controllers/Heaters.c =================================================================== diff -u -ref511196d29f6b0de6ade9ea113d91164d938c88 -r7d4711edd7b40cd3e29f43e766f79a8a09586fe9 --- firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision ef511196d29f6b0de6ade9ea113d91164d938c88) +++ firmware/App/Controllers/Heaters.c (.../Heaters.c) (revision 7d4711edd7b40cd3e29f43e766f79a8a09586fe9) @@ -1,14 +1,14 @@ /************************************************************************** * -* Copyright (c) 2020-2023 Diality Inc. - All Rights Reserved. +* Copyright (c) 2020-2024 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file Heaters.c * * @author (last) Dara Navaei -* @date (last) 20-May-2023 +* @date (last) 23-Sep-2023 * * @author (original) Dara Navaei * @date (original) 23-Apr-2020 @@ -27,6 +27,7 @@ #include "Heaters.h" #include "MessageSupport.h" #include "ModeFill.h" +#include "ModeHeatDisinfect.h" #include "NVDataMgmt.h" #include "OperationModes.h" #include "PersistentAlarm.h" @@ -51,6 +52,7 @@ #define HEATERS_MAX_DUTY_CYCLE 1.00F ///< Heaters max duty cycle (100%). #define HEATERS_MIN_DUTY_CYCLE 0.00F ///< Heaters minimum duty cycle (0.00%). #define HEATERS_DISINFECT_DUTY_CYCLE 0.80F ///< Heaters disinfect cycle. +#define HEATERS_DISINFECT_TRANSFER_DUTY_CYCLE 0.60F ///< Heaters disinfect transfer duty cycle. #define HEATERS_DISINFECT_TEMPERATURE_DRIFT_C 3.0F ///< Heaters disinfect temperature drift in C. #define HEATERS_MIN_EST_GAIN 0.2F ///< Heaters minimum estimation gain. #define HEATERS_MAX_EST_GAIN 5.0F ///< Heaters maximum estimation gain. @@ -62,7 +64,8 @@ #define MINIMUM_TARGET_TEMPERATURE 10.0F ///< Minimum allowed target temperature for the heaters. #define MAXIMUM_TARGET_TEMPERATURE 90.0F ///< Maximum allowed target temperature for the heaters. -#define HEATERS_ON_NO_FLOW_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Heaters on with no flow time out in milliseconds. +#define PRIMARY_HEATER_ON_NO_FLOW_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Primary heater on with no flow time out in milliseconds. +#define TRIMMER_HEATER_ON_NO_FLOW_TIMEOUT_MS ( 12 * MS_PER_SECOND ) ///< Trimmer heater on with no flow time out in milliseconds. #define HEATERS_MAX_OPERATING_VOLTAGE_V 24.0F ///< Heaters max operating voltage in volts. #define HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Heaters voltage out of range time out in milliseconds. #define HEATERS_MAX_VOLTAGE_OUT_OF_RANGE_TOL 0.2F ///< Heaters max voltage out of range tolerance. @@ -161,11 +164,11 @@ } // Initialize the persistent alarms - initPersistentAlarm( ALARM_ID_DG_MAIN_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS, HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_DG_SMALL_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS, HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_DG_TRIMMER_HEATER_VOLTAGE_OUT_OF_RANGE, HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS, HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_DG_RO_FLOW_TOO_LOW_WHILE_PRIMARY_HEATER_IS_ON, HEATERS_ON_NO_FLOW_TIMEOUT_MS, HEATERS_ON_NO_FLOW_TIMEOUT_MS ); - initPersistentAlarm( ALARM_ID_DG_DIALYSATE_FLOW_TOO_LOW_WHILE_TRIMMER_HEATER_IS_ON, HEATERS_ON_NO_FLOW_TIMEOUT_MS, HEATERS_ON_NO_FLOW_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DG_MAIN_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, 0, HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DG_SMALL_PRIMARY_HEATER_VOLTAGE_OUT_OF_RANGE, 0, HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DG_TRIMMER_HEATER_VOLTAGE_OUT_OF_RANGE, 0, HEATERS_VOLTAGE_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DG_RO_FLOW_TOO_LOW_WHILE_PRIMARY_HEATER_IS_ON, 0, PRIMARY_HEATER_ON_NO_FLOW_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DG_DIALYSATE_FLOW_TOO_LOW_WHILE_TRIMMER_HEATER_IS_ON, 0, TRIMMER_HEATER_ON_NO_FLOW_TIMEOUT_MS ); // Initialize the FPGA persistent alarm initFPGAPersistentAlarm( FPGA_PERS_ERROR_MAIN_PRIMARY_HEATER_VOLTAGE_ADC, ALARM_ID_DG_MAIN_PRIMARY_HEATER_FPGA_FAULT, @@ -617,28 +620,30 @@ F32 currentTemperature = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); F32 targetTemperature = heatersStatus[ heater ].targetTempC; - if ( currentTemperature < targetTemperature ) + if ( TRUE == isHeatDisinfectInTransitionHotWater() ) { + heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle.data = HEATERS_DISINFECT_TRANSFER_DUTY_CYCLE; + heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle.data = HEATERS_DISINFECT_TRANSFER_DUTY_CYCLE; + } + else if ( currentTemperature < targetTemperature ) + { heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle.data = HEATERS_MAX_DUTY_CYCLE; heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle.data = HEATERS_MAX_DUTY_CYCLE; - setHeaterDutyCycle( DG_TRIMMER_HEATER ); - setHeaterDutyCycle( DG_PRIMARY_HEATER ); } else if ( currentTemperature - targetTemperature < HEATERS_DISINFECT_TEMPERATURE_DRIFT_C ) { heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle.data = HEATERS_DISINFECT_DUTY_CYCLE; heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle.data = HEATERS_DISINFECT_DUTY_CYCLE; - setHeaterDutyCycle( DG_TRIMMER_HEATER ); - setHeaterDutyCycle( DG_PRIMARY_HEATER ); } else { heatersStatus[ DG_TRIMMER_HEATER ].dutyCycle.data = HEATERS_MIN_DUTY_CYCLE; heatersStatus[ DG_PRIMARY_HEATER ].dutyCycle.data = HEATERS_MIN_DUTY_CYCLE; - setHeaterDutyCycle( DG_TRIMMER_HEATER ); - setHeaterDutyCycle( DG_PRIMARY_HEATER ); } + setHeaterDutyCycle( DG_TRIMMER_HEATER ); + setHeaterDutyCycle( DG_PRIMARY_HEATER ); + return state; } @@ -787,7 +792,7 @@ setMainPrimaryHeaterPWM( duty ); setSmallPrimaryHeaterPWM( duty ); } - else if ( DG_TRIMMER_HEATER == heater ) + else { setTrimmerHeaterPWM( duty ); }