Index: firmware/App/Modes/ModeGenDialysate.c =================================================================== diff -u -r67731d57db9a620418b3b848d8f75ff204902c36 -r4b09605126f35b80406e95d079f3822c51a3ba25 --- firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 67731d57db9a620418b3b848d8f75ff204902c36) +++ firmware/App/Modes/ModeGenDialysate.c (.../ModeGenDialysate.c) (revision 4b09605126f35b80406e95d079f3822c51a3ba25) @@ -52,6 +52,12 @@ #define DIALYSATE_TEMP_UPPER_SAFETY_LIMIT_C 42.0F ///< Dialysate upper bound safety temperature limit in C. #define DIALYSATE_TEMP_LOWER_SAFETY_LIMIT_C 33.0F ///< Dialysate lower bound safety temperature limit in C. #define DIALYSATE_TEMP_CLEAR_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Dialysate temperature clear persistence timeout. +#define QUAD_FIRST_COEFFICIENT 0.0006F ///< First coefficient used in adjusted dialysate temperature quadratic calculation for low Qds +#define QUAD_SECOND_COEFFICIENT -0.1743F ///< Second coefficient used in adjusted dialysate temperature quadratic calculation for low Qds +#define QUAD_THIRD_COEFFICIENT 17.3F ///< Third coefficient used in adjusted dialysate temperature quadratic calculation for low Qds +#define LINEAR_SLOPE_FACTOR -0.0029F ///< Slope factor used in adjusted dialysate temperature linear calculation for high Qds +#define LINEAR_INTERCEPT_FACTOR 3.47F ///< Intercept factor used in adjusted dialysate temperature linear calculation for high Qds +#define LOW_DIAL_FLOW_RATE 150.0F ///< Dialysate flow rate lesser than 150 considered to be low Qds. //Testing #define DELAY_BC_SWITCHING_AT_START_UP ( 3 * MS_PER_SECOND ) ///< Provide a balancing chamber switching start up delay to stabilize pump speed etc., @@ -84,6 +90,7 @@ static DD_GEND_MODE_STATE_T handleGenDDialysateIsolatedUFState( void ); static F32 getGenDialysateTargetTemperature( void ); static void checkDialysateTemperature( void ); +static void calculateTargetDialysateTemp( void ); static void publishGenDialysateModeData( void ); /*********************************************************************//** @@ -191,7 +198,8 @@ //Previous state setValveState( DD_M4_VALV, VALVE_STATE_OPEN ); // Get the target temperature from TD - targetHydChamberFluidTemp.data = getTDTargetDialysateTemperature(); + //targetHydChamberFluidTemp.data = getTDTargetDialysateTemperature(); + calculateTargetDialysateTemp(); // Turn on the primary heater setHeaterTargetTemperature( D5_HEAT, getGenDialysateTargetTemperature() ); startHeater( D5_HEAT ); @@ -217,7 +225,8 @@ //Previous state setValveState( DD_M4_VALV, VALVE_STATE_OPEN ); // Get the target temperature from TD - targetHydChamberFluidTemp.data = getTDTargetDialysateTemperature(); + //targetHydChamberFluidTemp.data = getTDTargetDialysateTemperature(); + calculateTargetDialysateTemp(); setHeaterTargetTemperature( D5_HEAT, getGenDialysateTargetTemperature() ); startHeater( D5_HEAT ); setValveState( D14_VALV, VALVE_STATE_OPEN ); @@ -368,6 +377,37 @@ /*********************************************************************//** * @brief + * The calculateTargetDialysateTemp function calculate the delta temperature + * required for dialysate temperature to meet the set temperature at dialyzer. + * @details \b Inputs: Qd and target temperature. + * @details \b Outputs: Adjusted Target temperature + * @return none. + *************************************************************************/ +static void calculateTargetDialysateTemp( void ) +{ + // Get the dialysate flow rate from TD + F32 dialFlowrate = getTDDialysateFlowrate(); + F32 deltaTemp = 0.0F; + + if ( dialFlowrate >= LOW_DIAL_FLOW_RATE ) + { + // linear releationship seen against high dialysate flowrate Vs DeltaTemp + // deltaTemp = (-0.0029 * Qd) + 3.47 + deltaTemp = ( LINEAR_SLOPE_FACTOR * dialFlowrate ) + LINEAR_INTERCEPT_FACTOR; + } + else + { + // deltaTemp = (0.0006 * Qd * Qd)-(0.1743*Qd) + 17.3 + deltaTemp = ( QUAD_FIRST_COEFFICIENT * dialFlowrate * dialFlowrate ) + + ( QUAD_SECOND_COEFFICIENT * dialFlowrate ) + QUAD_THIRD_COEFFICIENT; + } + + // Adjust the D4 target temperature + targetHydChamberFluidTemp.data = getTDTargetDialysateTemperature() + deltaTemp; +} + +/*********************************************************************//** + * @brief * The handleGenDDialysateIsolatedUFState function performs the * Isolated ultrafiltration operations. * @details \b Inputs: none. @@ -535,7 +575,11 @@ updateBalChamberSwitchingPeriod(); // Get the target temperature from TD - targetHydChamberFluidTemp.data = getTDTargetDialysateTemperature(); + //targetHydChamberFluidTemp.data = getTDTargetDialysateTemperature(); + calculateTargetDialysateTemp(); + //Reset flag + signaltoResetAdjustedTargetTemp( D5_HEAT ); + // Update the target temperature for heater control setHeaterTargetTemperature( D5_HEAT, getGenDialysateTargetTemperature() );