Index: firmware/App/Controllers/PermeateTank.c =================================================================== diff -u -r273d43d423535c427d321415ce56a2b03312fb36 -rccdab403fc0fb315e52857ac7968ab5185aa55b7 --- firmware/App/Controllers/PermeateTank.c (.../PermeateTank.c) (revision 273d43d423535c427d321415ce56a2b03312fb36) +++ firmware/App/Controllers/PermeateTank.c (.../PermeateTank.c) (revision ccdab403fc0fb315e52857ac7968ab5185aa55b7) @@ -309,20 +309,21 @@ case PERMEATE_TANK_FULL_STATE: setValveState( M4_VALV, VALVE_STATE_CLOSED ); setValveState( M12_VALV, VALVE_STATE_OPEN ); - + setValveState( P11_VALV, VALVE_STATE_OPEN ); + setValveState( P39_VALV, VALVE_STATE_CLOSED ); + // set P33, P34 and P37 per recovery configuration + setRecoveryValvesConfig(); // No recirculation for no recovery setting. if ( getRecoveryStatesConfig() != NO_RECOVERY ) { setValveState( P6_VALV, VALVE_STATE_OPEN ); + setValveState( P39_VALV, VALVE_STATE_CLOSED ); } else { setValveState( P6_VALV, VALVE_STATE_CLOSED ); + setValveState( P39_VALV, VALVE_STATE_OPEN ); } - setValveState( P11_VALV, VALVE_STATE_OPEN ); - setValveState( P39_VALV, VALVE_STATE_CLOSED ); - // set P33, P34 and P37 per recovery configuration - setRecoveryValvesConfig(); break; default: Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r273d43d423535c427d321415ce56a2b03312fb36 -rccdab403fc0fb315e52857ac7968ab5185aa55b7 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 273d43d423535c427d321415ce56a2b03312fb36) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision ccdab403fc0fb315e52857ac7968ab5185aa55b7) @@ -42,30 +42,29 @@ #define ROP_CONTROL_INTERVAL ( 300 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled. #define ROP_FLOW_CONTROL_P_COEFFICIENT 0.00010F ///< P term for RO pump flow control. -#define ROP_FLOW_CONTROL_I_COEFFICIENT 0.000075F ///< I term for RO pump flow control. -#define ROP_FLOW_CONTROL_D_COEFFICIENT 0.00070F +#define ROP_FLOW_CONTROL_I_COEFFICIENT 0.000075F ///< I term for RO pump flow control. +#define ROP_FLOW_CONTROL_D_COEFFICIENT 0.00070F ///< D 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. -#define ROP_FLOW_TO_PWM_SLOPE_PERM_FLUSH 117.63F ///< Slope of flow to PWM line equation for permeate flush. -#define ROP_FLOW_TO_PWM_INTERCEPT_PERM_FLUSH -648.05F ///< Intercept of flow to PWM line equation for permeate flush. -#define ROP_FLOW_TO_PWM_SLOPE_NO_RECOVERY 000.00F ///< Slope of flow to PWM line equation for permeate flush. -#define ROP_FLOW_TO_PWM_INTERCEPT_NO_RECOVERY 000.00F ///< Intercept of flow to PWM line equation for permeate flush. -#define ROP_FLOW_TO_PWM_SLOPE_MED_RECOVERY 000.00F ///< Slope of flow to PWM line equation for permeate flush. -#define ROP_FLOW_TO_PWM_INTERCEPT_MED_RECOVERY 000.00F ///< Intercept of flow to PWM line equation for permeate flush. -#define ROP_FLOW_TO_PWM_SLOPE_MAX_RECOVER 109.91F ///< Slope of flow to PWM line equation for max RO recovery. -#define ROP_FLOW_TO_PWM_INTERCEPT_MAX_RECOVER -409.85F ///< Intercept of flow to PWM line equation for max RO recovery. +#define ROP_FLOW_TO_PWM_SLOPE_NO_RECOVERY 0.1621F ///< Slope of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_INTERCEPT_NO_RECOVERY -10.86F ///< Intercept of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_SLOPE_MED_RECOVERY 0.4285F ///< Slope of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_INTERCEPT_MED_RECOVERY 122.45F ///< Intercept of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_SLOPE_MAX_RECOVER 0.2046F ///< Slope of flow to PWM line equation for max RO recovery. +#define ROP_FLOW_TO_PWM_INTERCEPT_MAX_RECOVER 157.0F ///< Intercept of flow to PWM line equation for max RO recovery. #define ROP_PRESSURE_TO_PWM_SLOPE 0.5F ///< Slope of pressure to PWM line equation. #define ROP_PRESSURE_TO_PWM_INTERCEPT 0.0F ///< Intercept of pressure to PWM line equation. #define DATA_PUBLISH_COUNTER_START_COUNT 10 ///< Data publish counter start count. /// PWM line equation for pressure. converted to percentage. #define ROP_PRESSURE_TO_PWM_PCT(pres) ( ( ROP_PRESSURE_TO_PWM_SLOPE * pres + ROP_PRESSURE_TO_PWM_INTERCEPT ) / MAX_FLUID_PUMP_PWM_DUTY_CYCLE ) - +/// PWM log equation for flow converted to percentage. +#define ROP_FLOW_TO_PWM_LOG_PCT(slope, intercept, flow) ( ( slope * log(flow) + intercept ) / MAX_FLUID_PUMP_PWM_DUTY_CYCLE ) /// PWM line equation for flow converted to percentage. -#define ROP_FLOW_TO_PWM_PCT(slope, intercept, flow) ( ( slope * log(flow) + intercept ) / MAX_FLUID_PUMP_PWM_DUTY_CYCLE ) +#define ROP_FLOW_TO_PWM_LIN_PCT(slope, intercept, flow) ( ( slope * flow + intercept ) / MAX_FLUID_PUMP_PWM_DUTY_CYCLE ) #define FP_FLOW_RATE_BELOW_TARGET_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Timeout for flow rate below 75% of target flow rate #define FP_FLOW_RATE_BELOW_TARGET_CLEAR_MS ( 10 * MS_PER_SECOND ) ///< Clear timeout for flow rate below target flow rate @@ -673,13 +672,31 @@ *************************************************************************/ static F32 roPumpFlowToPWM( U32 targetFlow ) { - F32 dutyCyclePct = ROP_FLOW_TO_PWM_PCT( ROP_FLOW_TO_PWM_SLOPE_MAX_RECOVER, ROP_FLOW_TO_PWM_INTERCEPT_MAX_RECOVER, targetFlow ); + F32 dutyCyclePct = 0.0F; + RECOVERY_STATE_T recovery = getRecoveryState(); if ( FP_PRE_GENP_PERMEATE_FLUSH == getCurrentFPSubMode() && ( FP_MODE_PGEN == getCurrentFPOperationMode() ) ) { - dutyCyclePct = ROP_FLOW_TO_PWM_PCT( ROP_FLOW_TO_PWM_SLOPE_PERM_FLUSH, ROP_FLOW_TO_PWM_INTERCEPT_PERM_FLUSH, targetFlow ); + dutyCyclePct = ROP_FLOW_TO_PWM_LIN_PCT( ROP_FLOW_TO_PWM_SLOPE_NO_RECOVERY, ROP_FLOW_TO_PWM_INTERCEPT_NO_RECOVERY, targetFlow ); } + else + { + switch( recovery ) + { + case NO_RECOVERY: + dutyCyclePct = ROP_FLOW_TO_PWM_LIN_PCT( ROP_FLOW_TO_PWM_SLOPE_NO_RECOVERY, ROP_FLOW_TO_PWM_INTERCEPT_NO_RECOVERY, targetFlow ); + break; + case MEDIUM_RECOVERY: + dutyCyclePct = ROP_FLOW_TO_PWM_LIN_PCT( ROP_FLOW_TO_PWM_SLOPE_MED_RECOVERY, ROP_FLOW_TO_PWM_INTERCEPT_MED_RECOVERY, targetFlow ); + break; + + case MAX_RECOVERY: + default: + dutyCyclePct = ROP_FLOW_TO_PWM_LIN_PCT( ROP_FLOW_TO_PWM_SLOPE_MAX_RECOVER, ROP_FLOW_TO_PWM_INTERCEPT_MAX_RECOVER, targetFlow ); + break; + } + } return dutyCyclePct; } Index: firmware/App/Controllers/Valves.h =================================================================== diff -u -rb80e670a9d724b5c6cdac4d74ce263a49bf6b697 -rccdab403fc0fb315e52857ac7968ab5185aa55b7 --- firmware/App/Controllers/Valves.h (.../Valves.h) (revision b80e670a9d724b5c6cdac4d74ce263a49bf6b697) +++ firmware/App/Controllers/Valves.h (.../Valves.h) (revision ccdab403fc0fb315e52857ac7968ab5185aa55b7) @@ -84,6 +84,7 @@ void setRecoveryValvesConfig( void ); RECOVERY_STATE_T getRecoveryStatesConfig( void ); void setRecoveryStatesConfig( U32 recovery ); +RECOVERY_STATE_T getRecoveryState( void ); BOOL testValvesStatesPublishIntervalOverride( MESSAGE_T *message ); BOOL testValveStateOverride( MESSAGE_T *message );