Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -re706d20db89e55c51ba0c6f5c33842e117f965ab -rbb1b5860c4a87ee17537ae9f6ca690a4d74bc925 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision e706d20db89e55c51ba0c6f5c33842e117f965ab) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision bb1b5860c4a87ee17537ae9f6ca690a4d74bc925) @@ -17,6 +17,7 @@ #include // for log() #include "Flow.h" +#include "FPOperationModes.h" //#include "NVDataMgmt.h" #include "Messaging.h" #include "MessageSupport.h" @@ -40,7 +41,7 @@ #define ROP_CONTROL_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled. #define ROP_FLOW_CONTROL_P_COEFFICIENT 0.000065F ///< P term for RO pump flow control. -#define ROP_FLOW_CONTROL_I_COEFFICIENT 0.00020F ///< I term for RO pump flow control. +#define ROP_FLOW_CONTROL_I_COEFFICIENT 0.00022F ///< I term for RO pump flow control. #define ROP_MIN_FLOW_TO_CONTROL_PCT 0.75F #define ROP_PRESSURE_CONTROL_P_COEFFICIENT 0.15F ///< P term for RO pump pressure control. #define ROP_PRESSURE_CONTROL_I_COEFFICIENT 0.65F ///< I term for RO pump pressure control. @@ -241,7 +242,14 @@ if ( getTargetROPumpFlowRateMLPM() > 0 ) { ///transition to closed loop - roPumpDutyCyclePctSet = roPumpFlowToPWM( getTargetROPumpFlowRateMLPM() ); + if ( getCurrentOperationMode() == FP_MODE_GENP ) + { + roPumpDutyCyclePctSet = getCurrentROPumpDutyCyclePCT(); + } + else + { + roPumpDutyCyclePctSet = roPumpFlowToPWM( getTargetROPumpFlowRateMLPM() ); + } resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0.0F ); state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } Index: firmware/App/Modes/ModeGenPermeate.c =================================================================== diff -u -r764e0e8c7a889f72a9b6bdced9ef08a09d72b36e -rbb1b5860c4a87ee17537ae9f6ca690a4d74bc925 --- firmware/App/Modes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision 764e0e8c7a889f72a9b6bdced9ef08a09d72b36e) +++ firmware/App/Modes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision bb1b5860c4a87ee17537ae9f6ca690a4d74bc925) @@ -45,6 +45,7 @@ #define PUMP_REST_TIMEOUT_MS ( 3 * MS_PER_SECOND ) ///< Verify Water timer ( in ms ) #define RO_REJECTION_WAIT_TIME_MS ( 8 * MS_PER_SECOND ) ///< Verify Water timer ( in ms ) #define MIN_RO_REJECTION_RATIO_PCT 90.0F ///< Minimum RO rejection ration in percentage +#define MIN_SAMPLES_NEEDED_FOR_DUTY_CYCLE_AVG 10 ///< Minimum number for samples needed for calculating the average duty cycle // ********** private data ********** @@ -215,11 +216,9 @@ { FP_GENP_MODE_STATE_T state = FP_GENP_TANK_FILL_STATE; PERMEATE_TANK_STATE_T permemeateTankState = getPermeateTankState(); - F32 initDutyCycle = isFillAvgValid ? prevFillAvgDutyCycle : getCurrentROPumpDutyCyclePCT(); if ( TRUE == didTimeout( timeInState, PUMP_REST_TIMEOUT_MS ) && stateTransitioned == TRUE ) { stateTransitioned = FALSE; - resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, initDutyCycle, 0.0F ); setROPumpTargetFlowRateMLPM( GEN_PERMEATE_RO_PUMP_TGT_ML, TRUE ); } // Wait for RO rejection to stabilize after transition from full to fill + RO Rejection moving average duration @@ -250,11 +249,9 @@ static FP_GENP_MODE_STATE_T handleGenPTankFullState( void ) { FP_GENP_MODE_STATE_T state = FP_GENP_TANK_FULL_STATE; - F32 initDutyCycle = isFullAvgValid ? prevFullAvgDutyCycle : getCurrentROPumpDutyCyclePCT(); if ( TRUE == didTimeout( timeInState, PUMP_REST_TIMEOUT_MS ) && stateTransitioned == TRUE ) { stateTransitioned = FALSE; - resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, initDutyCycle, 0.0F ); setROPumpTargetFlowRateMLPM( GEN_PERMEATE_RO_PUMP_TGT_ML, TRUE ); } PERMEATE_TANK_STATE_T permemeateTankState = getPermeateTankState(); @@ -303,14 +300,14 @@ *************************************************************************/ static void calculateDutyCycleAvg( FP_GENP_MODE_STATE_T state ) { - if ( state == FP_GENP_TANK_FILL_STATE && fillDutyCount > 0) + if ( state == FP_GENP_TANK_FILL_STATE && fillDutyCount > MIN_SAMPLES_NEEDED_FOR_DUTY_CYCLE_AVG) { prevFillAvgDutyCycle = fillDutySum / (F32)fillDutyCount; isFillAvgValid = TRUE; fillDutySum = 0.0F; fillDutyCount = 0; } - else if ( state == FP_GENP_TANK_FULL_STATE && fullDutyCount > 0 ) + else if ( state == FP_GENP_TANK_FULL_STATE && fullDutyCount > MIN_SAMPLES_NEEDED_FOR_DUTY_CYCLE_AVG ) { prevFullAvgDutyCycle = fullDutySum / (F32)fullDutyCount; isFullAvgValid = TRUE;