Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r5d82009d1baa2b52122065934481745bf4de223b -ra1877093454dc5252c43f5ab11b005a85e293167 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 5d82009d1baa2b52122065934481745bf4de223b) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision a1877093454dc5252c43f5ab11b005a85e293167) @@ -37,7 +37,6 @@ #define CONCENTRATE_PUMP_SPEED_INCREMENT 8.0 ///< Speed increase (mL/min) when controlling concentrate pump to target step speed. #define CONCENTRATE_PUMP_MIN_SPEED 3.0 ///< Minimum speed for concentrate pump in mL per min. -#define CONCENTRATE_PUMP_MAX_SPEED 49.0 ///< Maximum speed for concentrate pump in mL per min. #define CONCENTRATE_PUMP_ERROR_TOLERANCE 0.02 ///< Measured speed needs to be within 2% of commanded speed. #define CONCENTRATE_PUMP_ZERO_FLOW_RATE 0xFFFF ///< Pulse width value when zero flow rate or pump is off. Index: firmware/App/Controllers/ConcentratePumps.h =================================================================== diff -u -r5d82009d1baa2b52122065934481745bf4de223b -ra1877093454dc5252c43f5ab11b005a85e293167 --- firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision 5d82009d1baa2b52122065934481745bf4de223b) +++ firmware/App/Controllers/ConcentratePumps.h (.../ConcentratePumps.h) (revision a1877093454dc5252c43f5ab11b005a85e293167) @@ -30,6 +30,8 @@ // ********** public definitions ********** +#define CONCENTRATE_PUMP_MAX_SPEED 48.0 ///< Maximum speed for concentrate pump in mL per min. + /// Enumeration of concentrate pumps. typedef enum ConcentratePumps { Index: firmware/App/Controllers/ConductivitySensors.c =================================================================== diff -u -r5d82009d1baa2b52122065934481745bf4de223b -ra1877093454dc5252c43f5ab11b005a85e293167 --- firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision 5d82009d1baa2b52122065934481745bf4de223b) +++ firmware/App/Controllers/ConductivitySensors.c (.../ConductivitySensors.c) (revision a1877093454dc5252c43f5ab11b005a85e293167) @@ -460,7 +460,7 @@ if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_CONDUCTIVITY_SENSOR_ERROR ) ) { #ifndef DISABLE_COND_SENSOR_CHECK - SET_ALARM_WITH_1_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, CONDUCTIVITYSENSORS_CD1_SENSOR ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_CONDUCTIVITY_SENSOR_FAULT, CONDUCTIVITYSENSORS_CD1_SENSOR, CONDUCTIVITYSENSORS_CD2_SENSOR ); #endif } } Index: firmware/App/DGCommon.h =================================================================== diff -u -r2fff37fa585181917705645494549b5fd4a4d522 -ra1877093454dc5252c43f5ab11b005a85e293167 --- firmware/App/DGCommon.h (.../DGCommon.h) (revision 2fff37fa585181917705645494549b5fd4a4d522) +++ firmware/App/DGCommon.h (.../DGCommon.h) (revision a1877093454dc5252c43f5ab11b005a85e293167) @@ -45,19 +45,22 @@ #define ALARMS_DEBUG 1 // #define HEATERS_DEBUG 1 // #define PRESSURES_DEBUG 1 - #define DISABLE_DIALYSATE_CHECK 1 // #define IGNORE_DRAIN_PUMP_MONITOR 1 // #define IGNORE_HEATERS_MONITOR 1 #define IGNORE_RO_PUMP_MONITOR 1 // #define DISABLE_RO_RATIO_CHECK 1 - #define DISABLE_COND_SENSOR_CHECK 1 - #define DISABLE_MIXING 1 +// #define DISABLE_COND_SENSOR_CHECK 1 // #define DISABLE_WATER_QUALITY_CHECK 1 #define DISABLE_RTC_CONFIG 1 //#define V_2_SYSTEM 1 //#define SKIP_RECIRC 1 #define THD_USING_TRO_CONNECTOR 1 #define IGNORE_CONC_PUMP_IN_HEAT_DISINFECT 1 + + // Turn these flags on to disable dialysate mixing + #define DISABLE_DIALYSATE_CHECK 1 + #define DISABLE_MIXING 1 + #include #include #endif 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 );