Index: firmware/App/Modes/ModeFill.c =================================================================== diff -u -r1c74566ff86f1df5e1929b8715d68715dc21a93b -ra1877093454dc5252c43f5ab11b005a85e293167 --- firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision 1c74566ff86f1df5e1929b8715d68715dc21a93b) +++ firmware/App/Modes/ModeFill.c (.../ModeFill.c) (revision a1877093454dc5252c43f5ab11b005a85e293167) @@ -47,16 +47,15 @@ #define DIALYSATE_BICARB_CONCENTRATE_RATIO ( 4.06812 / FRACTION_TO_PERCENT_FACTOR ) ///< Ratio between RO water and bicarbonate concentrate. #define DIALYSATE_FILL_TIME_OUT ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Time out period when reservoir is not filled with correct dialysate. -#define EMPTY_BOTTLE_DETECT_PERSISTENT_PERIOD_MS ( 3 * MS_PER_SECOND ) ///< Persistent period for empty bottle detect. +#define EMPTY_BOTTLE_DETECT_PERSISTENT_PERIOD_MS ( 5 * MS_PER_SECOND ) ///< Persistent period for empty bottle detect. ///< Persistent time interval for concentrate pumps prime. #define CONCENTRATE_PUMP_PRIME_INTERVAL ( 3 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) #define ACID_BICARB_CONCENTRATE_ADDITION_MULTIPLER 1.06 ///< Acid and bicarbonate concentrates make up around 6% to total volume. #define FLOW_INTEGRATED_VOLUME_CHECK_TOLERANCE 0.1 ///< Flow integrated volume has 10% tolerance compare to load cell reading. -#define BICARB_CONCENTRATE_PUMP_PRIME_SPEED_ML_MIN 40.0 ///< Bicarb concentrate pump speed during priming in mL/min. -#define ACID_CONCENTRATE_PUMP_PRIME_SPEED_ML_MIN 30.0 ///< Acid concentrate pump speed during priming in mL/min. -#define CONCENTRATE_TEST_TIME_OUT_MS ( 30 * MS_PER_SECOND ) ///< Concentrate test time out period in ms. +#define CONCENTRATE_PUMP_PRIME_EXTRA_SPEED_ML_MIN 5.0 ///< Concentrate pump additional speed during priming in mL/min. +#define CONCENTRATE_TEST_TIME_OUT_MS ( 45 * MS_PER_SECOND ) ///< Concentrate test time out period in ms. #define WATER_QUALITY_CHECK_TIME_OUT_MS ( 30 * MS_PER_SECOND ) ///< Inlet water quality check time out period in ms. #define DIALYSATE_TEMPERATURE_TOLERANCE_C 2.0 ///< Dialysate temperature tolerance in degree C. @@ -65,10 +64,8 @@ #define BICARB_CONCENTRATION_BOTTLE_VOLUME_ML 3000.0 ///< Volume of bicarb concentration in ml. #define CONCENTRATION_BOTTLE_LOW_VOLUME_ML 100.0 ///< Concentration bottle low volume in ml. -/// Multiplier to convert flow (L/min) into volume (mL) for period of general task interval. -static const F32 RO_FLOW_INTEGRATOR = ( (F32)( ML_PER_LITER * TASK_GENERAL_INTERVAL ) / (F32)( SEC_PER_MIN * MS_PER_SECOND ) ); /// Multiplier to convert flow (mL/min) into volume (mL) for period of general task interval. -static const F32 CONCENTRATE_PUMP_FLOW_INTEGRATOR = ( (F32)TASK_GENERAL_INTERVAL / (F32)( SEC_PER_MIN * MS_PER_SECOND ) ); +static const F32 FLOW_INTEGRATOR = ( (F32)TASK_GENERAL_INTERVAL / (F32)( SEC_PER_MIN * MS_PER_SECOND ) ); // ********** private data ********** @@ -80,7 +77,7 @@ static U32 concentrateTestStartTime; ///< Starting time for concentrate test. static U32 concentratePumpPrimeCount; ///< Interval count for concentrate pump prime. -static F32 totalROFlowRate_LPM; ///< Total RO flow rate over period of time. +static F32 totalROFlowRate_mL_min; ///< Total RO flow rate over period of time. static F32 acidConductivityTotal; ///< Total of acid conductivity during fill. static F32 dialysateConductivityTotal; ///< Total of dialysate conductivity during fill. static U32 conductivitySampleCount; ///< Sample count of conductivity during fill. @@ -99,7 +96,7 @@ static BOOL isWaterQualityGood( void ); static BOOL checkDialysateTemperature( void ); -static void handleDialysateMixing( F32 measuredROFlowRate ); +static void handleDialysateMixing( F32 measuredROFlowRate_mL_min ); static F32 getUsedAcidVolume( void ); static F32 getUsedBicarbVolume( void ); @@ -115,7 +112,7 @@ fillState = DG_FILL_MODE_STATE_START; dialysateFillStartTime = 0; reservoirBaseWeight = 0.0; - totalROFlowRate_LPM = 0.0; + totalROFlowRate_mL_min = 0.0; concentrateTestStartTime = 0; acidConductivityTotal = 0.0; dialysateConductivityTotal = 0.0; @@ -245,7 +242,7 @@ requestConcentratePumpsOff( CONCENTRATEPUMPS_CP1_ACID ); requestConcentratePumpsOn( CONCENTRATEPUMPS_CP2_BICARB ); #ifndef DISABLE_MIXING - setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, BICARB_CONCENTRATE_PUMP_PRIME_SPEED_ML_MIN ); + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, CONCENTRATE_PUMP_MAX_SPEED ); #endif result = DG_FILL_MODE_STATE_BICARB_PUMP_CHECK; } @@ -270,6 +267,9 @@ static DG_FILL_MODE_STATE_T handleBicarbPumpCheckState( void ) { DG_FILL_MODE_STATE_T result = DG_FILL_MODE_STATE_BICARB_PUMP_CHECK; + F32 const measuredROFlowRate_mL_min = getMeasuredROFlowRate() * ML_PER_LITER; + F32 const bicarbPumpFlowRate_mL_min = measuredROFlowRate_mL_min * DIALYSATE_BICARB_CONCENTRATE_RATIO + CONCENTRATE_PUMP_PRIME_EXTRA_SPEED_ML_MIN; + #ifndef DISABLE_DIALYSATE_CHECK F32 const bicarbConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); #else @@ -278,14 +278,18 @@ if ( MIN_BICARB_CONCENTRATE_CONDUCTIVITY <= bicarbConductivity ) { + // Reduce acid pump speed after reaching minimum conductivity + // This prevents conductivity value to go out of sensor's range + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, bicarbPumpFlowRate_mL_min ); + if ( concentratePumpPrimeCount++ > CONCENTRATE_PUMP_PRIME_INTERVAL ) { concentratePumpPrimeCount = 0; concentrateTestStartTime = getMSTimerCount(); requestConcentratePumpsOn( CONCENTRATEPUMPS_CP1_ACID ); requestConcentratePumpsOff( CONCENTRATEPUMPS_CP2_BICARB ); #ifndef DISABLE_MIXING - setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, ACID_CONCENTRATE_PUMP_PRIME_SPEED_ML_MIN ); + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, CONCENTRATE_PUMP_MAX_SPEED ); #endif result = DG_FILL_MODE_STATE_ACID_PUMP_CHECK; } @@ -315,6 +319,9 @@ static DG_FILL_MODE_STATE_T handleAcidPumpCheckState( void ) { DG_FILL_MODE_STATE_T result = DG_FILL_MODE_STATE_ACID_PUMP_CHECK; + F32 const measuredROFlowRate_mL_min = getMeasuredROFlowRate() * ML_PER_LITER; + F32 const acidPumpFlowRate_mL_min = measuredROFlowRate_mL_min * DIALYSATE_ACID_CONCENTRATE_RATIO + CONCENTRATE_PUMP_PRIME_EXTRA_SPEED_ML_MIN; + #ifndef DISABLE_DIALYSATE_CHECK F32 const acidConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); #else @@ -323,6 +330,10 @@ if ( MIN_ACID_CONCENTRATE_CONDUCTIVITY <= acidConductivity ) { + // Reduce acid pump speed after reaching minimum conductivity + // This prevents conductivity value to go out of sensor's range + setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, acidPumpFlowRate_mL_min ); + if ( concentratePumpPrimeCount++ > CONCENTRATE_PUMP_PRIME_INTERVAL ) { concentratePumpPrimeCount = 0; @@ -356,18 +367,21 @@ static DG_FILL_MODE_STATE_T handleDialysateProductionState( void ) { DG_FILL_MODE_STATE_T result = DG_FILL_MODE_STATE_DIALYSATE_PRODUCTION; + F32 const measuredROFlowRate_mL_min = getMeasuredROFlowRate() * ML_PER_LITER; #ifndef DISABLE_DIALYSATE_CHECK if ( ( TRUE == isWaterQualityGood() ) && ( TRUE == checkDialysateTemperature() ) ) #else if ( TRUE ) #endif { - if ( ( getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ) < MIN_BICARB_CONCENTRATE_CONDUCTIVITY ) && - ( getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ) < MIN_BICARB_CONCENTRATE_CONDUCTIVITY ) ) + // Prime mixing before deliver result to reservoir + requestConcentratePumpsOn( CONCENTRATEPUMPS_CP1_ACID ); + requestConcentratePumpsOn( CONCENTRATEPUMPS_CP2_BICARB ); + handleDialysateMixing( measuredROFlowRate_mL_min ); + + if ( concentratePumpPrimeCount++ > CONCENTRATE_PUMP_PRIME_INTERVAL ) { - requestConcentratePumpsOn( CONCENTRATEPUMPS_CP1_ACID ); - requestConcentratePumpsOn( CONCENTRATEPUMPS_CP2_BICARB ); setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); result = DG_FILL_MODE_STATE_DELIVER_DIALYSATE; } @@ -386,7 +400,7 @@ *************************************************************************/ static DG_FILL_MODE_STATE_T handleDeliverDialysateState( void ) { - F32 const measuredROFlowRate = getMeasuredROFlowRate(); + F32 const measuredROFlowRate_mL_min = getMeasuredROFlowRate() * ML_PER_LITER; F32 const acidConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD1_SENSOR ); F32 const dialysateConductivity = getConductivityValue( CONDUCTIVITYSENSORS_CD2_SENSOR ); BOOL const isAcidConductivityOutOfRange = ( acidConductivity <= MIN_ACID_CONCENTRATE_CONDUCTIVITY ) && ( MAX_ACID_CONCENTRATE_CONDUCTIVITY >= acidConductivity ); @@ -397,12 +411,12 @@ F32 integratedVolume_mL; // Set concentrate pumps speed based off RO pump flow rate - handleDialysateMixing( measuredROFlowRate ); + handleDialysateMixing( measuredROFlowRate_mL_min ); - totalROFlowRate_LPM += measuredROFlowRate; - integratedVolume_mL = totalROFlowRate_LPM * RO_FLOW_INTEGRATOR * ACID_BICARB_CONCENTRATE_ADDITION_MULTIPLER; - usedAcidVolume_mL.data += getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) * CONCENTRATE_PUMP_FLOW_INTEGRATOR; - usedBicarbVolume_mL.data += getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) * CONCENTRATE_PUMP_FLOW_INTEGRATOR; + totalROFlowRate_mL_min += measuredROFlowRate_mL_min; + integratedVolume_mL = totalROFlowRate_mL_min * FLOW_INTEGRATOR * ACID_BICARB_CONCENTRATE_ADDITION_MULTIPLER; + usedAcidVolume_mL.data += getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP1_ACID ) * FLOW_INTEGRATOR; + usedBicarbVolume_mL.data += getMeasuredPumpSpeed( CONCENTRATEPUMPS_CP2_BICARB ) * FLOW_INTEGRATOR; acidConductivityTotal += acidConductivity; dialysateConductivityTotal += dialysateConductivity; @@ -535,15 +549,15 @@ * the concentrate pump speed relative to the RO pump flow rate. * @details Inputs: none * @details Outputs: Set concentrate pump speed relative to RO pump flow rate - * @param measuredROFlowRate measured RO flow rate + * @param measuredROFlowRate_mL_min measured RO flow rate in mL/min * @return none *************************************************************************/ -static void handleDialysateMixing( F32 measuredROFlowRate ) +static void handleDialysateMixing( F32 measuredROFlowRate_mL_min ) { #ifndef DISABLE_MIXING // Set concentrate pumps speed based off RO pump flow rate - F32 const acidCP1PumpFlowRate = DIALYSATE_ACID_CONCENTRATE_RATIO * measuredROFlowRate * ML_PER_LITER; - F32 const bicarbCP2PumpFlowRate = DIALYSATE_BICARB_CONCENTRATE_RATIO * measuredROFlowRate * ML_PER_LITER; + F32 const acidCP1PumpFlowRate = DIALYSATE_ACID_CONCENTRATE_RATIO * measuredROFlowRate_mL_min; + F32 const bicarbCP2PumpFlowRate = DIALYSATE_BICARB_CONCENTRATE_RATIO * measuredROFlowRate_mL_min; setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP1_ACID, acidCP1PumpFlowRate ); setConcentratePumpTargetSpeed( CONCENTRATEPUMPS_CP2_BICARB, bicarbCP2PumpFlowRate );