Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -r8f95cb0d5ca434bdaf3e157e399e017d12212d3d -rd3671cad1447db7ad496ad6282324ef7570c5625 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 8f95cb0d5ca434bdaf3e157e399e017d12212d3d) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision d3671cad1447db7ad496ad6282324ef7570c5625) @@ -52,8 +52,8 @@ #define DRP_SPEED_ADC_TO_RPM_FACTOR 12.94 ///< conversion factor from ADC counts to RPM for Drain pump #define DRP_SPEED_RPM_TO_ADC_FACTOR ( 1.0 / DRP_SPEED_ADC_TO_RPM_FACTOR ) ///< conversion factor from RPM to ADC counts for Drain pump -#define DRAIN_PUMP_P_COEFFICIENT 0.005 ///< P term for drain pump delta pressure control -#define DRAIN_PUMP_I_COEFFICIENT 0.0015 ///< I term for drain pump delta pressure control +#define DRAIN_PUMP_P_COEFFICIENT 0.5 ///< P term for drain pump delta pressure control +#define DRAIN_PUMP_I_COEFFICIENT 1.0 ///< I term for drain pump delta pressure control /// Enumeration of drain pump states. typedef enum DrainPump_States @@ -288,18 +288,17 @@ // is open loop, set the drain pump to open loop if ( getTargetDrainPumpSpeed() > 0 && drainPumpControlMode == PUMP_CONTROL_MODE_OPEN_LOOP ) { - // set drain pump enable pin + // Set drain pump enable pin SET_DRAIN_PUMP_ENABLE(); - // set drain pump DAC + // Set drain pump DAC drainPumpDACSet = drainPumpDAC; setFPGADrainPumpSpeed( drainPumpDACSet ); result = DRAIN_PUMP_OPEN_LOOP_STATE; } // If the drain pump is set to closed loop, call the proper state - // It is checked for the value of delta pressure because it can be anything - // including 0 + // It is checked for the value of delta pressure because it can be anything including 0 else if ( drainPumpControlMode == PUMP_CONTROL_MODE_CLOSED_LOOP && hasClosedLoopBeenRequested ) { // set drain pump enable pin @@ -335,9 +334,9 @@ { F32 inletDrainPressure = getMeasuredDGPressure ( PRESSURE_SENSOR_DRAIN_PUMP_INLET ); F32 outletDrainPressure = getMeasuredDGPressure ( PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ); - F32 pressureDiff = inletDrainPressure - outletDrainPressure; - F32 rpm = runPIController( PI_CONTROLLER_ID_DRAIN_PUMP, targetDrainPumpDeltaPressure.data, pressureDiff ); - drainPumpDACSet = (U32)(rpm * DRP_SPEED_RPM_TO_ADC_FACTOR + FLOAT_TO_INT_ROUNDUP_OFFSET); + F32 pressureDiff = outletDrainPressure - inletDrainPressure; + F32 dac = runPIController( PI_CONTROLLER_ID_DRAIN_PUMP, targetDrainPumpDeltaPressure.data, pressureDiff ); //TODO use get for delta pressure + drainPumpDACSet = (U32)(dac + FLOAT_TO_INT_ROUNDUP_OFFSET); setFPGADrainPumpSpeed( drainPumpDACSet ); // From a merge from master @@ -352,13 +351,6 @@ } // From a merge from master - if ( 0 == getTargetDrainPumpSpeed() ) - { - signalDrainPumpHardStop(); - - result = DRAIN_PUMP_OFF_STATE; - } - #ifdef DEBUG_ENABLED #ifdef ENABLE_DIP_SWITCHES // TODO - test code - remove later @@ -390,6 +382,12 @@ *************************************************************************/ static DRAIN_PUMP_STATE_T handleDrainPumpOpenLoopState( void ) { + /*if ( 0 == getTargetDrainPumpSpeed() ) + { + signalDrainPumpHardStop(); + + result = DRAIN_PUMP_OFF_STATE; + }*/ //TODO clean up return DRAIN_PUMP_OPEN_LOOP_STATE; } Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r2f2d0ccadd8a09037eb3d0dd144549b2c8c8129b -rd3671cad1447db7ad496ad6282324ef7570c5625 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 2f2d0ccadd8a09037eb3d0dd144549b2c8c8129b) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision d3671cad1447db7ad496ad6282324ef7570c5625) @@ -54,19 +54,19 @@ #define ROP_I_COEFFICIENT 0.0015 ///< I term for RO pump pressure control #define ROP_RAMP_UP_P_COEFFICIENT 0.0 ///< P term for RO pump flow control -#define ROP_RAMP_UP_I_COEFFICIENT 0.01 ///< I term for RO pump flow control +#define ROP_RAMP_UP_I_COEFFICIENT 0.1 ///< I term for RO pump flow control #define ROP_FLOW_TARGET_TOLERANCE 0.05 ///< Tolerance in between the target flow rate and the actual flow rate in liter #define FLOW_SENSOR_ZERO_READING 0xFFFF ///< Flow sensor reading indicates zero flow (or flow lower than can be detected by sensor) -#define FLOW_SAMPLES_TO_AVERAGE (250 / TASK_PRIORITY_INTERVAL) ///< Averaging flow data over 250 ms intervals. -#define FLOW_AVERAGE_MULTIPLIER (1.0 / (F32)FLOW_SAMPLES_TO_AVERAGE) ///< Optimization - multiplying is faster than dividing +#define FLOW_SAMPLES_TO_AVERAGE ( 250 / TASK_PRIORITY_INTERVAL ) ///< Averaging flow data over 250 ms intervals. +#define FLOW_AVERAGE_MULTIPLIER ( 1.0 / (F32)FLOW_SAMPLES_TO_AVERAGE ) ///< Optimization - multiplying is faster than dividing #define FLOW_VERIFICATION_COUNTER_TARGET 40U ///< The time in counts to check the flow and make sure it is in range #define RO_FLOW_ADC_TO_LPM_FACTOR 10909.0909 ///< conversion factor from ADC counts to LPM (liters/min) for RO flow rate (multiply this by inverse of FPGA reading). // Initial PWM for the requested flow rate. It is assumed that 100% duty cycle will provide 1.2 LPM -#define ROP_FLOW_TO_PWM_DC(flow) ((F32)(flow / 1.2)) ///< Initial conversion factor from target flow rate to PWM duty cycle estimate +#define ROP_FLOW_TO_PWM_DC(flow) ( (F32)(flow / 1.2) ) ///< Initial conversion factor from target flow rate to PWM duty cycle estimate #define MAX_RO_PUMP_PWM_STEP_CHANGE 0.01 ///< Max duty cycle change for controller. #define MAX_RO_PUMP_PWM_DUTY_CYCLE 0.99 ///< Max duty cycle. @@ -78,8 +78,8 @@ #define FLOW_SENSOR_ZERO_READING 0xFFFF ///< Flow sensor reading indicates zero flow (or flow lower than can be detected by sensor). -#define FLOW_SAMPLES_TO_AVERAGE (250 / TASK_PRIORITY_INTERVAL) ///< Averaging flow data over 250 ms intervals. -#define FLOW_AVERAGE_MULTIPLIER (1.0 / (F32)FLOW_SAMPLES_TO_AVERAGE) ///< Optimization - multiplying is faster than dividing. +#define FLOW_SAMPLES_TO_AVERAGE ( 250 / TASK_PRIORITY_INTERVAL ) ///< Averaging flow data over 250 ms intervals. +#define FLOW_AVERAGE_MULTIPLIER ( 1.0 / (F32)FLOW_SAMPLES_TO_AVERAGE ) ///< Optimization - multiplying is faster than dividing. // TODO - this is a place holder for real conversion #define ROP_PSI_TO_PWM_DC(p) ( 0.2 + ( (F32)((p) - 100) * 0.01 ) ) ///< conversion factor from target PSI to PWM duty cycle estimate. @@ -118,24 +118,22 @@ static BOOL isROPumpOn = FALSE; ///< RO pump is currently running static F32 roPumpPWMDutyCyclePct = 0.0; ///< initial RO pump PWM duty cycle static F32 roPumpPWMDutyCyclePctSet = 0.0; ///< currently set RO pump PWM duty cycle -static PUMP_CONTROL_MODE_T roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< requested RO pump control mode //TODO remove +static PUMP_CONTROL_MODE_T roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< requested RO pump control mode //TODO remove? static PUMP_CONTROL_MODE_T roPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< currently set RO pump control mode static OVERRIDE_F32_T targetROPumpFlowRate = { 0, 0, 0, 0 }; ///< Target RO flow rate (in LPM) static OVERRIDE_U32_T roPumpDataPublishInterval = { RO_PUMP_DATA_PUB_INTERVAL, RO_PUMP_DATA_PUB_INTERVAL, 0, 0 }; ///< Interval (in ms) at which to publish RO flow data to CAN bus static OVERRIDE_F32_T measuredROFlowRateLPM = { 0.0, 0.0, 0.0, 0 }; ///< measured RO flow rate (in LPM) -static F32 measuredROPumpPressure = 0.0; ///< measured RO pressure (in PSI) // TODO remove -static F32 tgtROPumpPressure = 0.0; ///< Target RO control pressure (in PSI) static U32 flowVerificationCounter = 0; ///< Counter to verify the flow is in range -static U32 roControlTimerCounter = 0; ///< determines when to perform control on ro pump +static U32 roControlTimerCounter = 0; ///< determines when to perform control on RO pump -static U32 roPumpOpenLoopTargetPWM = 0; ///< Target RO pump open loop PWM -static F32 roPumpFlowRateRunningSum = 0; -static F32 roPumpPressureRunningSum = 0; +static F32 roPumpOpenLoopTargetPWM = 0; ///< Target RO pump open loop PWM +static F32 roPumpFlowRateRunningSum = 0; ///< RO pump flow rate running sum +static F32 roPumpPressureRunningSum = 0; ///< RO pump pressure running sum /* The variables used for POST. They are not in use yet, so they are commented out static RO_PUMP_SELF_TEST_STATE_T roPumpSelfTestState = RO_PUMP_SELF_TEST_STATE_START; ///< current ro pump self test state @@ -147,10 +145,6 @@ static S32 measuredFlowReadingsSum = 0; ///< Raw flow reading sums for averaging. static U32 flowFilterCounter = 0; ///< Flow filtering counter. - -static RO_PUMP_SELF_TEST_STATE_T roPumpSelfTestState = RO_PUMP_SELF_TEST_STATE_START; ///< Current RO pump self-test state. -static U32 roPumpSelfTestTimerCount = 0; ///< Timer counter for RO pump self-test. - // ********** private function prototypes ********** static RO_PUMP_STATE_T handleROPumpOffState( void ); @@ -233,14 +227,15 @@ * @param: pwm * @return whether the value was set (TRUE) or not (FALSE) *************************************************************************/ -BOOL setROPumpTargetPWM( U32 pwm ) +BOOL setROPumpTargetPWM( F32 pwm ) { BOOL result = FALSE; if ( pwm > 0 ) { roPumpOpenLoopTargetPWM = pwm; - roPumpPWMDutyCyclePct = ROP_FLOW_TO_PWM_DC( getTargetROPumpFlowRate() ); + roPumpPWMDutyCyclePct = roPumpOpenLoopTargetPWM; //ROP_FLOW_TO_PWM_DC( getTargetROPumpFlowRate() ); + roPumpPWMDutyCyclePctSet = roPumpPWMDutyCyclePct; roPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; result = TRUE; } @@ -257,14 +252,15 @@ * @param: roFlowRate : new target RO flow rate * @return TRUE if new target flow rate is set, FALSE if not *************************************************************************/ -BOOL setROPumpTargetFlowRate( F32 roFlowRate ) +BOOL setROPumpTargetFlowRate( F32 roFlowRate, F32 maxPressure ) { BOOL result = FALSE; if ( roFlowRate < MAX_RO_FLOWRATE_LPM && roFlowRate >= MIN_RO_FLOWRATE_LPM ) { - tgtROPumpPressure = 0.0; - targetROPumpPressure.data = 0.0; + // For now maximum allowed pressure is inserted into the target pressure override + // if the target flow rate exceeded the max pressure, it will set the maximum pressure + targetROPumpPressure.data = maxPressure; targetROPumpFlowRate.data = roFlowRate; roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; roPumpPWMDutyCyclePct = ROP_FLOW_TO_PWM_DC( roFlowRate ); @@ -295,7 +291,8 @@ targetROPumpFlowRate.data = 0; stopROPump(); roPumpState = RO_PUMP_OFF_STATE; - roPumpPWMDutyCyclePct = 0.0; + roPumpPWMDutyCyclePct = 0.0; + roPumpOpenLoopTargetPWM = 0.0; roControlTimerCounter = 0; flowVerificationCounter = 0; isROPumpOn = FALSE; @@ -315,13 +312,15 @@ U16 roFlowReading = getFPGAROPumpFlowRate(); S32 roFlow = (S32)roFlowReading; - // update sum for flow average calculation + // Update sum for flow average calculation measuredFlowReadingsSum += roFlow; - // filter every 250ms + // Filter every 250ms if ( ++flowFilterCounter >= FLOW_SAMPLES_TO_AVERAGE ) { F32 avgROFlow = (F32)measuredFlowReadingsSum * FLOW_AVERAGE_MULTIPLIER; - + + // If the flow is less than a certain value, FPGA will return 0xFFFF meaning that + // the flow is 0 if ( ( roFlowReading == FLOW_SENSOR_ZERO_READING ) || ( roFlowReading == 0 ) ) { measuredROFlowRateLPM.data = 0.0; @@ -334,7 +333,7 @@ flowFilterCounter = 0; } - measuredROPumpPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); + //measuredROPumpPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); TODO what do we do with this? // TODO - check pressure? @@ -435,7 +434,7 @@ #endif // If there is a flow, transition to P controller to get the corresponding pressure of that flow - if ( getTargetROPumpFlowRate() > 0 && roPumpControlMode == PUMP_CONTROL_MODE_CLOSED_LOOP ) + if ( getTargetROPumpFlowRate() > 0 && roPumpControlMode == PUMP_CONTROL_MODE_CLOSED_LOOP ) { roPumpControlModeSet = roPumpControlMode; // Set initial PWM duty cycle @@ -471,7 +470,7 @@ { RO_PUMP_STATE_T result = RO_PUMP_RAMP_UP_STATE; - // control at set interval + // Control at set interval if ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL ) { F32 targetFlowRate = getTargetROPumpFlowRate(); @@ -516,26 +515,33 @@ // Check if the time for flow verification has elapsed if ( ++flowVerificationCounter >= FLOW_VERIFICATION_COUNTER_TARGET ) { - // Calculate the average pressure and flow rate - F32 avgPressure = roPumpPressureRunningSum / flowVerificationCounter; - F32 avgFlowRate = roPumpFlowRateRunningSum / flowVerificationCounter; + F32 actualPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); - F32 targetFlowRate = getTargetROPumpFlowRate(); + // If the flow has been achieved without reaching to the maximum pressure, set the new pressure + // otherwise, stay with the maximum allowed pressure as target pressure + if ( actualPressure < getTargetROPumpPressure() ) + { + // Calculate the average pressure and flow rate + F32 avgPressure = roPumpPressureRunningSum / flowVerificationCounter; + F32 avgFlowRate = roPumpFlowRateRunningSum / flowVerificationCounter; - // Calculate the flow rate deviation from the target flow rate - F32 flowRateDeviation = ( targetFlowRate - avgFlowRate ) / targetFlowRate; - // Use the flow rate deviation to adjust the average calculated pressure. This - // pressure is used as the target pressure - avgPressure = avgPressure + ( avgPressure * flowRateDeviation ); + F32 targetFlowRate = getTargetROPumpFlowRate(); + // Calculate the flow rate deviation from the target flow rate + F32 flowRateDeviation = ( targetFlowRate - avgFlowRate ) / targetFlowRate; + // Use the flow rate deviation to adjust the average calculated pressure. This + // pressure is used as the target pressure + avgPressure = avgPressure + ( avgPressure * flowRateDeviation ); + + targetROPumpPressure.data = avgPressure; + } + // Reset the P controller for the flow rate resetPIController( I_CONTROLLER_ID_RO_PUMP_RAMP_UP, MIN_RO_PUMP_PWM_DUTY_CYCLE ); - tgtROPumpPressure = avgPressure; - // set initial PWM duty cycle - //roPumpPWMDutyCyclePctSet = roPumpPWMDutyCyclePct; + // Set initial PWM duty cycle setROPumpControlSignalPWM( roPumpPWMDutyCyclePctSet ); - // reset controller + // Reset controller resetPIController( PI_CONTROLLER_ID_RO_PUMP, roPumpPWMDutyCyclePctSet ); flowVerificationCounter = 0; roPumpFlowRateRunningSum = 0; @@ -564,9 +570,9 @@ { F32 actualPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); - F32 newPWM = runPIController( PI_CONTROLLER_ID_RO_PUMP, tgtROPumpPressure, actualPressure ); + F32 newPWM = runPIController( PI_CONTROLLER_ID_RO_PUMP, getTargetROPumpPressure(), actualPressure ); roPumpPWMDutyCyclePctSet = newPWM; - setROPumpControlSignalPWM( newPWM ); + setROPumpControlSignalPWM( roPumpPWMDutyCyclePctSet ); #ifndef EMC_TEST_BUILD newPWM = runPIController( PI_CONTROLLER_ID_RO_PUMP, tgtPres, actPres ); @@ -699,6 +705,18 @@ } return result; +} + +F32 getTargetROPumpPressure( void ) +{ + F32 result = targetROPumpPressure.data; + + if ( OVERRIDE_KEY == targetROPumpPressure.override ) + { + result = targetROPumpPressure.ovData; + } + + return result; } /*********************************************************************//** @@ -716,7 +734,7 @@ { RO_PUMP_DATA_T pumpData; - pumpData.roPumpTgtPressure = tgtROPumpPressure; + pumpData.roPumpTgtPressure = getTargetROPumpPressure(); pumpData.measROFlowRate = getMeasuredROFlowRate(); pumpData.roPumpPWM = roPumpPWMDutyCyclePctSet * FRACTION_TO_PERCENT_FACTOR; pumpData.roPumpState = (U32)roPumpState; @@ -817,7 +835,7 @@ targetROPumpFlowRate.ovInitData = targetROPumpFlowRate.data; // backup current target pressure targetROPumpFlowRate.ovData = value; targetROPumpFlowRate.override = OVERRIDE_KEY; - result = setROPumpTargetFlowRate( value ); + //result = setROPumpTargetFlowRate( value ); } return result; @@ -842,7 +860,7 @@ targetROPumpFlowRate.override = OVERRIDE_RESET; targetROPumpFlowRate.ovInitData = 0; targetROPumpFlowRate.ovData = 0; - result = setROPumpTargetFlowRate( targetROPumpFlowRate.data ); + //result = setROPumpTargetFlowRate( targetROPumpFlowRate.data ); } return result; Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u -r1538c71d0c6b97469d599befce15f068d9acf5d4 -rd3671cad1447db7ad496ad6282324ef7570c5625 --- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 1538c71d0c6b97469d599befce15f068d9acf5d4) +++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision d3671cad1447db7ad496ad6282324ef7570c5625) @@ -35,11 +35,10 @@ /// RO pump data struct. typedef struct { - U32 setROPumpPressure; ///< RO pump pressure set target + F32 roPumpTgtPressure; ///< RO pump target pressure F32 measROFlowRate; ///< RO flow rate measurement F32 roPumpPWM; ///< RO pump pwm U32 roPumpState; ///< RO pump current state - F32 roPumpTgtPressure; ///< RO pump target pressure } RO_PUMP_DATA_T; // ********** public function prototypes ********** @@ -48,16 +47,18 @@ void execROPumpMonitor( void ); void execROPumpController( void ); -BOOL setROPumpTargetFlowRate( F32 roFlowRate ); -BOOL setROPumpTargetPWM( U32 pwm ); +BOOL setROPumpTargetFlowRate( F32 roFlowRate, F32 maxPressure ); +BOOL setROPumpTargetPWM( F32 pwm ); void signalROPumpHardStop( void ); BOOL isReverseOsmosisPumpOn( void ); SELF_TEST_STATUS_T execROPumpTest( void ); F32 getTargetROPumpFlowRate( void ); -F32 getMeasuredROFlowRate( void ); +F32 getMeasuredROFlowRate( void ); + +F32 getTargetROPumpPressure( void ); BOOL testSetROPumpDataPublishIntervalOverride( U32 value ); BOOL testResetROPumpDataPublishIntervalOverride( void ); Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r2f2d0ccadd8a09037eb3d0dd144549b2c8c8129b -rd3671cad1447db7ad496ad6282324ef7570c5625 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 2f2d0ccadd8a09037eb3d0dd144549b2c8c8129b) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision d3671cad1447db7ad496ad6282324ef7570c5625) @@ -43,9 +43,9 @@ #define HEAT_DISINFECT_TIME_INTERVAL_DAYS 2U ///< Heat disinfect time interval in days //TODO change the interval to actual value (was it every 21 days?) #define HEAT_DISINFECT_TIME_INTERVAL_SECONDS ( HEAT_DISINFECT_TIME_INTERVAL_DAYS * SECONDS_IN_A_DAY ) ///< Heat disinfect time interval in seconds -#define HEAT_DISINFECT_TARGET_TEMPERATURE 30U ///< Heat disinfection target temperature //TODO change the target temperature back to 85C +#define HEAT_DISINFECT_TARGET_TEMPERATURE 85 ///< Heat disinfection target temperature #define MAX_TPO_AND_TDI_SENSORS_DIFFERENCE 1U ///< Maximum allowed temperature difference in between TDi and TPo //TODO remove -#define MAX_TEMPERATURE_DEVIATION_FROM_TARGET 4U ///< Maximum allowed temperature deviation from target temperature +#define MAX_TEMPERATURE_DEVIATION_FROM_TARGET 1.5 ///< Maximum allowed temperature deviation from target temperature #define HEAT_DISINFECT_RECIRC_PATH_TIME_MINS 1U ///< Recirculation path heat disinfection duration in minutes #define HEAT_DISINFECT_R1_TO_R2_TIME_MINS 1U ///< Reservoir 1 to reservoir 2 heat disinfection duration in minutes @@ -61,13 +61,17 @@ #define HEAT_DISINFECT_DATA_PUB_INTERVAL ( MS_PER_SECOND / (2*TASK_GENERAL_INTERVAL) ) ///< Heat disinfection data publication time interval -#define DRAIN_PUMP_TARGET_DELTA_PRESSURE 0U ///< Drain pump target delta pressure +#define DRAIN_PUMP_TARGET_DELTA_PRESSURE 0.0 ///< Drain pump target delta pressure #define DRAIN_PUMP_EVACUATE_FLUID_TARGET_RPM 2800U ///< Drain pump target RPM during evacuating the fluid path #define DRAIN_PUMP_DISINFECT_DRAIN_PATH_TARGET_RPM 1500U ///< Drain pump target RPM during heat disinfection -#define RO_PUMP_TARGET_FLOW_RATE_LPM 0.9 ///< RO pump target flow rate +#define RO_PUMP_TARGET_FILL_FLOW_RATE_LPM 0.9 ///< RO pump target fill flow rate +#define RO_PUMP_TARGET_FILL_MAX_PRESSURE 140 ///< RO pump max allowed pressure during fillin the reservoirs +#define RO_PUMP_TARGET_HEAT_UP_FLOW_RATE_LPM 0.5 ///< RO pump target flow rate during heating up the fluid +#define RO_PUMP_TARGET_HEAT_UP_MAX_PRESSURE 30 ///< RO pump max allowed pressure during heating up water -#define FULL_RESERVOIRS_WEIGHT_GRAMS 2000U ///< The weight of a full reservoir //TODO Change this value to full value -#define EMPTY_RESERVOIRS_WEIGHT_GRAMS 300U ///< The weight of an empty reservoir //TODO Change this value to full value +#define RESERVOIR1_TARGET_WEIGHT_GRAMS 2000U ///< Target weight of reservoir 1 +#define RESERVOIR2_TARGET_WEIGHT_GRAMS 500U ///< Target weight of reservoir 2 +#define EMPTY_RESERVOIRS_WEIGHT_GRAMS 300U ///< The weight of an empty reservoir //TODO Change this value to full value // ********** private data ********** @@ -128,7 +132,7 @@ static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectDrainPath( void ); static DG_HEAT_DISINFECT_STATE_T handleHeatDisinfectFillWithWaterDeprimeReservoirs( void ); -static void stopActuators( void ); +static void resetActuators( void ); static void setActuatorsToFillWater( void ); static BOOL isTemperatureInRange( void ); @@ -152,6 +156,12 @@ *************************************************************************/ void initHeatDisinfectMode( void ) { + // UV reactors will not be used in the heat disinfection since their operating temperature + // range is below 85C. They will be turned off once in the beginning to make sure they are + // not on. + turnOffUVReactor( INLET_UV_REACTOR ); + turnOffUVReactor( OUTLET_UV_REACTOR ); + heatDisinfectStartTime = 0; drainPumpTargetRPM = 0; heatDisinfectCurrentCycle = 1; @@ -170,7 +180,7 @@ void transitionToHeatDisinfectMode( void ) { initHeatDisinfectMode(); - stopActuators(); + resetActuators(); } /*********************************************************************//** @@ -260,7 +270,7 @@ *************************************************************************/ void stopDGHeatDisinfect( void ) { - stopActuators(); + resetActuators(); heatDisinfectState = DG_HEAT_DISINFECT_STATE_COMPLETE; heatDisinfectInternalState = INTERNAL_HEAT_DISINFECT_STATE_OFF; @@ -283,8 +293,8 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVACUATE_DIALYSATE_FILL_WITH_WATER; - stopActuators(); - drainPumpTargetRPM = DRAIN_PUMP_EVACUATE_FLUID_TARGET_RPM; + resetActuators(); + drainPumpTargetRPM = DRAIN_PUMP_EVACUATE_FLUID_TARGET_RPM; //TODO do we need this? heatDisinfectInternalState = INTERNAL_HEAT_DISINFECT_STATE_OFF; heatDisinfectStartTime = getMSTimerCount(); @@ -305,30 +315,30 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_EVACUATE_DIALYSATE_FILL_WITH_WATER; - execHeatDisinfectInternalStates(); //TODO test to see if it is needed to be in an if statement + execHeatDisinfectInternalStates(); + //heatDisinfectInternalState = INTERNAL_HEAT_DISINFECT_STATE_COMPLETE; //TODO remove this for testing only if ( heatDisinfectInternalState == INTERNAL_HEAT_DISINFECT_STATE_COMPLETE ) { - // Done with evacuation and fill, set the states to heat up water - // Drain pump is stopped to exit the open loop mode - signalDrainPumpHardStop(); + // Stop the RO pump that was running during the fill process + signalROPumpHardStop(); - setValveState( VPI, VALVE_STATE_OPEN ); + setValveState( VPI, VALVE_STATE_CLOSED ); setValveState( VBF, VALVE_STATE_OPEN ); setValveState( VSP, VALVE_STATE_CLOSED ); - setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); + setValveState( VPD, VALVE_STATE_DRAIN_C_TO_NC ); setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); setValveState( VDR, VALVE_STATE_RECIRC_C_TO_NC ); setValveState( VRC, VALVE_STATE_RECIRC_C_TO_NC ); - setValveState( VRO, VALVE_STATE_R2_C_TO_NC ); - setValveState( VRD, VALVE_STATE_R2_C_TO_NC ); - setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); - setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); + setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); + setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); + setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); - setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); - setDrainPumpTargetDeltaPressure( DRAIN_PUMP_TARGET_DELTA_PRESSURE ); //DRAIN_PUMP_TARGET_DELTA_PRESSURE + setROPumpTargetFlowRate( RO_PUMP_TARGET_HEAT_UP_FLOW_RATE_LPM, RO_PUMP_TARGET_HEAT_UP_MAX_PRESSURE ); + setDrainPumpTargetDeltaPressure( DRAIN_PUMP_TARGET_DELTA_PRESSURE ); - setPrimaryHeaterTargetTemperature( HEAT_DISINFECT_TARGET_TEMPERATURE ); + setPrimaryHeaterTargetTemperature( 40.0 ); //HEAT_DISINFECT_TARGET_TEMPERATURE startPrimaryHeater(); state = DG_HEAT_DISINFECT_STATE_HEAT_WATER; @@ -349,14 +359,13 @@ { DG_HEAT_DISINFECT_STATE_T state = DG_HEAT_DISINFECT_STATE_HEAT_WATER; - F32 TPi = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER ); F32 TDi = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); + F32 test = getTemperatureValue( TEMPSENSORS_OUTLET_REDUNDANCY ); //TODO remove later - if ( fabs(TPi - HEAT_DISINFECT_TARGET_TEMPERATURE) <= MAX_TEMPERATURE_DEVIATION_FROM_TARGET && - fabs(TDi - HEAT_DISINFECT_TARGET_TEMPERATURE) <= MAX_TEMPERATURE_DEVIATION_FROM_TARGET ) + if ( fabs( test - HEAT_DISINFECT_TARGET_TEMPERATURE ) <= MAX_TEMPERATURE_DEVIATION_FROM_TARGET ) { // Set the states to disinfect recirculation path - setValveState( VPI, VALVE_STATE_OPEN ); + /*setValveState( VPI, VALVE_STATE_OPEN ); setValveState( VBF, VALVE_STATE_OPEN ); setValveState( VSP, VALVE_STATE_CLOSED ); setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); @@ -366,7 +375,7 @@ setValveState( VRO, VALVE_STATE_R2_C_TO_NO ); setValveState( VRD, VALVE_STATE_R1_C_TO_NO ); setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); - setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); + setValveState( VRF, VALVE_STATE_R2_C_TO_NO );*/ stateTimer = getMSTimerCount(); state = DG_HEAT_DISINFECT_STATE_DISINFECT_RECIRC_PATH; } @@ -490,7 +499,7 @@ setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); setDrainPumpTargetDeltaPressure( DRAIN_PUMP_TARGET_DELTA_PRESSURE ); - setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); + setROPumpTargetFlowRate( RO_PUMP_TARGET_HEAT_UP_FLOW_RATE_LPM, RO_PUMP_TARGET_HEAT_UP_MAX_PRESSURE ); if ( ++heatDisinfectCurrentCycle > getNoOfCyclesToRun() ) { @@ -637,13 +646,14 @@ setValveState( VSP, VALVE_STATE_CLOSED ); setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); - setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); // C to NC - setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); // C to NC + setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); + setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VRO, VALVE_STATE_R1_C_TO_NO ); setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); - setROPumpTargetFlowRate( 0.65 ); //RO_PUMP_TARGET_FLOW_RATE_LPM + //setROPumpTargetPWM( 0.85 ); //TODO remove this. It + setROPumpTargetFlowRate( RO_PUMP_TARGET_FILL_FLOW_RATE_LPM, RO_PUMP_TARGET_FILL_MAX_PRESSURE ); stateTimer = getMSTimerCount(); // For evac recirc path. TODO later, it should be controlled using // the composite pump @@ -652,10 +662,6 @@ else if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIRS ) { setActuatorsToFillWater(); - // Start the UV reactors to disinfect the water that - // is being filled up - //startInletUVReactor(); - //startOutletUVReactor(); state = INTERNAL_HEAT_DISINFECT_STATE_FILL_WITH_WATER; } @@ -701,12 +707,11 @@ F32 reservoir1Weight = getLoadCellFilteredWeight( LOAD_CELL_A1 ); F32 reservoir2Weight = getLoadCellFilteredWeight( LOAD_CELL_B1 ); - if ( reservoir1Weight >= FULL_RESERVOIRS_WEIGHT_GRAMS && - reservoir2Weight >= FULL_RESERVOIRS_WEIGHT_GRAMS ) + if ( reservoir1Weight >= RESERVOIR1_TARGET_WEIGHT_GRAMS && reservoir2Weight >= RESERVOIR2_TARGET_WEIGHT_GRAMS ) { if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_EVACUATE_DIALYSATE_FILL_WITH_WATER ) { - stopActuators(); + resetActuators(); state = INTERNAL_HEAT_DISINFECT_STATE_COMPLETE; } else if ( heatDisinfectState == DG_HEAT_DISINFECT_STATE_FILL_WITH_WATER_DEPRIME_RESERVOIRS ) @@ -722,7 +727,7 @@ setValveState( VRD, VALVE_STATE_R1_C_TO_NO ); setValveState( VRI, VALVE_STATE_R1_C_TO_NO ); setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); - setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); + setROPumpTargetFlowRate( RO_PUMP_TARGET_FILL_FLOW_RATE_LPM, RO_PUMP_TARGET_FILL_MAX_PRESSURE ); stateTimer = getMSTimerCount(); state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RECIRC_PATH; @@ -746,7 +751,7 @@ INTERNAL_HEAT_DISINFECT_STATE_T state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_RECIRC_PATH; // TODO change this to composition pump mode - /*if ( didTimeout( stateTimer, HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS ) ) + if ( didTimeout( stateTimer, HEAT_DISINFECT_EVAC_RECIRC_PATH_TIME_MS ) ) { // Set the state to evacuate reservoir 1 signalROPumpHardStop(); @@ -764,7 +769,7 @@ setDrainPumpTargetSpeed( drainPumpTargetRPM ); //TODO commented for testing state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_R1; - }*/ + } return state; } @@ -798,7 +803,6 @@ setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); setValveState( VRF, VALVE_STATE_R2_C_TO_NO ); - setDrainPumpTargetSpeed( drainPumpTargetRPM ); //probably it is not needed TODO test this state = INTERNAL_HEAT_DISINFECT_STATE_EVACUATE_R2; } @@ -847,11 +851,11 @@ * Outputs: none * @return none *************************************************************************/ -static void stopActuators( void ) +static void resetActuators( void ) { // De-energize all the valves setValveState( VPI, VALVE_STATE_OPEN ); - setValveState( VBF, VALVE_STATE_OPEN ); + setValveState( VBF, VALVE_STATE_CLOSED ); setValveState( VSP, VALVE_STATE_CLOSED ); setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); @@ -865,8 +869,6 @@ //TODO composition pumps signalROPumpHardStop(); signalDrainPumpHardStop(); - //stopInletUVReactor(); - //stopOutletUVReactor(); stopPrimaryHeater(); stopTrimmerHeater(); } @@ -906,8 +908,10 @@ *************************************************************************/ static void setActuatorsToFillWater( void ) { + signalDrainPumpHardStop(); + setValveState( VPI, VALVE_STATE_OPEN ); - setValveState( VBF, VALVE_STATE_OPEN ); + setValveState( VBF, VALVE_STATE_CLOSED ); setValveState( VSP, VALVE_STATE_CLOSED ); setValveState( VPD, VALVE_STATE_OPEN_C_TO_NO ); setValveState( VPO, VALVE_STATE_FILL_C_TO_NC ); @@ -917,8 +921,7 @@ setValveState( VRD, VALVE_STATE_R2_C_TO_NO ); setValveState( VRI, VALVE_STATE_R2_C_TO_NC ); setValveState( VRF, VALVE_STATE_R1_C_TO_NC ); - setROPumpTargetFlowRate( RO_PUMP_TARGET_FLOW_RATE_LPM ); - signalDrainPumpHardStop(); //TODO is this needed here? + setROPumpTargetFlowRate( RO_PUMP_TARGET_FILL_FLOW_RATE_LPM, RO_PUMP_TARGET_FILL_MAX_PRESSURE ); } /*********************************************************************//** Index: firmware/App/Modes/ModeRecirculate.c =================================================================== diff -u -re30951f62cdc9c52f20e9218df947d3860b3c7a7 -rd3671cad1447db7ad496ad6282324ef7570c5625 --- firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision e30951f62cdc9c52f20e9218df947d3860b3c7a7) +++ firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision d3671cad1447db7ad496ad6282324ef7570c5625) @@ -85,7 +85,7 @@ setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); - setROPumpTargetFlowRate( 0.8 ); //TODO Add a #define for this value + setROPumpTargetFlowRate( 0.8, 140 ); //TODO Add a #define for this value signalDrainPumpHardStop(); startPrimaryHeater(); // UV on Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -rab304e2ca6e3e40ed8cb12650e9855ae0b9649d8 -rd3671cad1447db7ad496ad6282324ef7570c5625 --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision ab304e2ca6e3e40ed8cb12650e9855ae0b9649d8) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision d3671cad1447db7ad496ad6282324ef7570c5625) @@ -155,7 +155,7 @@ controller->referenceSignal = referenceSignal; controller->measuredSignal = measuredSignal; // calculate error signal - controller->errorSignal = fabs( referenceSignal ) - ( referenceSignal < 0.0 ? ( measuredSignal * -1.0 ) : measuredSignal ); + controller->errorSignal = referenceSignal - measuredSignal; controller->errorSum += controller->errorSignal; // anti-windup controller->errorSumBeforeWindUp = controller->errorSum;