Index: firmware/App/Controllers/BoostPump.c =================================================================== diff -u -r60693bf21a8a0277eae54cbfcb6cfd68176b079a -r4626638b758c6673c0a8a3cc8d008bb4a898cea9 --- firmware/App/Controllers/BoostPump.c (.../BoostPump.c) (revision 60693bf21a8a0277eae54cbfcb6cfd68176b079a) +++ firmware/App/Controllers/BoostPump.c (.../BoostPump.c) (revision 4626638b758c6673c0a8a3cc8d008bb4a898cea9) @@ -22,7 +22,7 @@ #include "Messaging.h" #include "MessageSupport.h" #include "PersistentAlarm.h" -#include "PIControllers.h" +#include "PIDControllers.h" #include "Pressure.h" #include "SafetyShutdown.h" #include "TaskGeneral.h" @@ -41,8 +41,9 @@ #define BOOST_FLOW_CONTROL_P_COEFFICIENT 0.15F ///< P term for Boost pump flow control. #define BOOST_FLOW_CONTROL_I_COEFFICIENT 0.65F ///< I term for Boost pump flow control. -#define BOOST_PRESSURE_CONTROL_P_COEFFICIENT 0.01F ///< P term for Boost pump pressure control. -#define BOOST_PRESSURE_CONTROL_I_COEFFICIENT 0.01F ///< I term for Boost pump pressure control. +#define BOOST_PRESSURE_CONTROL_P_COEFFICIENT 0.5F ///< P term for Boost pump pressure control. +#define BOOST_PRESSURE_CONTROL_I_COEFFICIENT 0.5F ///< I term for Boost pump pressure control. +#define BOOST_PRESSURE_CONTROL_D_COEFFICIENT 0.0F ///< D term for Boost pump pressure control. #define BOOST_FLOW_TO_PWM_SLOPE 0.5F ///< Slope of flow to PWM line equation. #define BOOST_FLOW_TO_PWM_INTERCEPT 0.0F ///< Intercept of flow to PWM line equation. @@ -92,13 +93,9 @@ { initFluidPump(); - // Initialize Boost pump PI controller to flow - initializePIController( PI_CONTROLLER_ID_BOOST_PUMP_FLOW, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, BOOST_FLOW_CONTROL_P_COEFFICIENT, BOOST_FLOW_CONTROL_I_COEFFICIENT, - MIN_FLUID_PUMP_DUTY_CYCLE_PCT, MAX_P40_FLUID_PUMP_DUTY_CYCLE_PCT, FALSE, 0 ); - // Initialize Boost pump PI controller to target pressure - initializePIController( PI_CONTROLLER_ID_BOOST_PUMP_PRES, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, BOOST_PRESSURE_CONTROL_P_COEFFICIENT, BOOST_PRESSURE_CONTROL_I_COEFFICIENT, - MIN_FLUID_PUMP_DUTY_CYCLE_PCT, MAX_P40_FLUID_PUMP_DUTY_CYCLE_PCT, FALSE, 0 ); + initializePIDController( PID_CONTROLLER_ID_BOOST_PUMP_PRES, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, BOOST_PRESSURE_CONTROL_P_COEFFICIENT, BOOST_PRESSURE_CONTROL_I_COEFFICIENT, + BOOST_PRESSURE_CONTROL_D_COEFFICIENT, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, MAX_P40_FLUID_PUMP_DUTY_CYCLE_PCT, FALSE, 0 ); boostPumpState = BOOST_PUMP_OFF_STATE; isBoostPumpOn = FALSE; @@ -189,7 +186,7 @@ // Set pump to on isBoostPumpOn = TRUE; boostPumpDutyCyclePctSet = boostPumpPresToPWM( getTargetBoostPumpPressure() ); - resetPIController( PI_CONTROLLER_ID_BOOST_PUMP_PRES, boostPumpDutyCyclePctSet, 0.0F ); + resetPIDController( PID_CONTROLLER_ID_BOOST_PUMP_PRES, boostPumpDutyCyclePctSet, 0.0F ); setFluidPumpPctToPWMDutyCycle( P40_PUMP, boostPumpDutyCyclePctSet ); state = BOOST_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE; } @@ -200,7 +197,7 @@ // Set pump to on isBoostPumpOn = TRUE; boostPumpDutyCyclePctSet = boostPumpFlowToPWM( getTargetBoostPumpFlowRateMLPM() ); - resetPIController( PI_CONTROLLER_ID_BOOST_PUMP_FLOW, boostPumpDutyCyclePctSet, 0.0F ); + resetPIDController( PID_CONTROLLER_ID_BOOST_PUMP_FLOW, boostPumpDutyCyclePctSet, 0.0F ); setFluidPumpPctToPWMDutyCycle( P40_PUMP, boostPumpDutyCyclePctSet ); state = BOOST_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } @@ -239,15 +236,15 @@ if ( getTargetBoostPumpPressure() > 0.0F ) { // Transition to closed loop - resetPIController( PI_CONTROLLER_ID_BOOST_PUMP_PRES, boostPumpDutyCyclePctSet, 0.0F ); + resetPIDController( PID_CONTROLLER_ID_BOOST_PUMP_PRES, boostPumpDutyCyclePctSet, 0.0F ); state = BOOST_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE; } // If there is a target flow set, transition to the PI controller and control to flow else if ( getTargetBoostPumpFlowRateMLPM() > 0 ) { ///transition to closed loop - resetPIController( PI_CONTROLLER_ID_BOOST_PUMP_FLOW, boostPumpDutyCyclePctSet, 0.0F ); + resetPIDController( PID_CONTROLLER_ID_BOOST_PUMP_FLOW, boostPumpDutyCyclePctSet, 0.0F ); state = BOOST_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } else if ( (F32)getTargetBoostPumpDutyCyclePCT() == 0.0F ) @@ -274,7 +271,7 @@ if ( getTargetBoostPumpPressure() > 0.0F ) { // Transition to target pressure - resetPIController( PI_CONTROLLER_ID_BOOST_PUMP_PRES, boostPumpDutyCyclePctSet, 0 ); + resetPIDController( PID_CONTROLLER_ID_BOOST_PUMP_PRES, boostPumpDutyCyclePctSet, 0 ); state = BOOST_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE; } else if ( getTargetBoostPumpDutyCyclePCT() > 0.0F ) @@ -291,7 +288,7 @@ } else if ( ++boostControlTimerCounter >= BOOST_CONTROL_INTERVAL ) { - boostPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_BOOST_PUMP_FLOW, (F32)getTargetBoostPumpFlowRateMLPM(), getFilteredFlow( P7_FLOW ) ); + boostPumpDutyCyclePctSet = runPIDController( PID_CONTROLLER_ID_BOOST_PUMP_FLOW, (F32)getTargetBoostPumpFlowRateMLPM(), getFilteredFlow( P7_FLOW ) ); boostPumpDutyCyclePctSet = MIN( boostPumpDutyCyclePctSet, ( MAX_P40_FLUID_PUMP_PWM_DUTY_CYCLE * MAX_P40_FLUID_PUMP_DUTY_CYCLE_PCT ) ); setFluidPumpPctToPWMDutyCycle( P40_PUMP, boostPumpDutyCyclePctSet ); boostControlTimerCounter = 0; @@ -316,7 +313,7 @@ if ( getTargetBoostPumpFlowRateMLPM() > 0.0F ) { ///transition to target flow - resetPIController( PI_CONTROLLER_ID_BOOST_PUMP_FLOW, boostPumpDutyCyclePctSet, 0.0F ); + resetPIDController( PID_CONTROLLER_ID_BOOST_PUMP_FLOW, boostPumpDutyCyclePctSet, 0.0F ); state = BOOST_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } else if ( getTargetBoostPumpDutyCyclePCT() > 0.0F ) @@ -333,7 +330,7 @@ } else if ( ++boostControlTimerCounter >= BOOST_CONTROL_INTERVAL ) { - boostPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_BOOST_PUMP_PRES, getTargetBoostPumpPressure(), getFilteredPressure( M3_PRES ) ); + boostPumpDutyCyclePctSet = runPIDController( PID_CONTROLLER_ID_BOOST_PUMP_PRES, getTargetBoostPumpPressure(), getFilteredPressure( M3_PRES ) ); setFluidPumpPctToPWMDutyCycle( P40_PUMP, boostPumpDutyCyclePctSet ); boostControlTimerCounter = 0; } @@ -617,13 +614,13 @@ if( targetBoostPumpFlowRate.data > 0.0F ) { targetBoostPumpFlowRate.data = 0.0F; - resetPIController( PI_CONTROLLER_ID_BOOST_PUMP_FLOW, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, 0 ); + resetPIDController( PID_CONTROLLER_ID_BOOST_PUMP_FLOW, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, 0 ); } if( targetBoostPumpPressure.data > 0.0F ) { targetBoostPumpPressure.data = 0.0F; - resetPIController( PI_CONTROLLER_ID_BOOST_PUMP_PRES, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, 0 ); + resetPIDController( PID_CONTROLLER_ID_BOOST_PUMP_PRES, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, 0 ); } boostPumpState = BOOST_PUMP_OFF_STATE; Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -ra3ed83ddd9e39aceb6216da6e640c0e369de2902 -r4626638b758c6673c0a8a3cc8d008bb4a898cea9 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision a3ed83ddd9e39aceb6216da6e640c0e369de2902) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 4626638b758c6673c0a8a3cc8d008bb4a898cea9) @@ -116,10 +116,6 @@ initializePIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, MIN_RO_FLOWRATE_MLPM, ROP_FLOW_CONTROL_P_COEFFICIENT, ROP_FLOW_CONTROL_I_COEFFICIENT, ROP_FLOW_CONTROL_D_COEFFICIENT, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, MAX_P12_FLUID_PUMP_DUTY_CYCLE_PCT, FALSE, 0 ); - // Initialize RO pump PI controller to target pressure - initializePIController( PI_CONTROLLER_ID_RO_PUMP_PRES, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, ROP_PRESSURE_CONTROL_P_COEFFICIENT, ROP_PRESSURE_CONTROL_I_COEFFICIENT, - MIN_FLUID_PUMP_DUTY_CYCLE_PCT, MAX_P12_FLUID_PUMP_DUTY_CYCLE_PCT, FALSE, 0 ); - roPumpState = RO_PUMP_OFF_STATE; isROPumpOn = FALSE; stopPumpRequest = FALSE; @@ -222,7 +218,7 @@ // Set pump to on isROPumpOn = TRUE; roPumpDutyCyclePctSet = roPumpPresToPWM( getTargetROPumpPressure() ); - resetPIController( PI_CONTROLLER_ID_RO_PUMP_PRES, roPumpDutyCyclePctSet, 0.0F ); + resetPIDController( PID_CONTROLLER_ID_RO_PUMP_PRES, roPumpDutyCyclePctSet, 0.0F ); setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); state = RO_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE; } @@ -281,7 +277,7 @@ else if ( getTargetROPumpPressure() > 0.0F ) { //transition to closed loop - resetPIController( PI_CONTROLLER_ID_RO_PUMP_PRES, getTargetROPumpPressure(), 0.0F ); + resetPIDController( PID_CONTROLLER_ID_RO_PUMP_PRES, getTargetROPumpPressure(), 0.0F ); state = RO_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE; } else if ( (F32)getTargetROPumpDutyCyclePCT() == 0.0F ) @@ -310,7 +306,7 @@ if ( getTargetROPumpPressure() > 0.0F ) { // Transition to target pressure - resetPIController( PI_CONTROLLER_ID_RO_PUMP_PRES, getTargetROPumpPressure(), 0 ); + resetPIDController( PID_CONTROLLER_ID_RO_PUMP_PRES, getTargetROPumpPressure(), 0 ); state = RO_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE; } else if ( getTargetROPumpDutyCyclePCT() > 0.0F ) @@ -331,28 +327,12 @@ currentFlowRate = getFilteredFlow( P16_FLOW ); minRequiredFlowRate = (F32)getTargetROPumpFlowRateMLPM() * ROP_MIN_FLOW_TO_CONTROL_PCT; - // P16 flow seems to lag in current Leahi HW. We will wait till we hit a % of target flow before we start changing control. -/* if( ( TRUE == roPumpStartControl ) || ( currentFlowRate >= ( minRequiredFlowRate ) ) ) - { - roPumpDutyCyclePctSet = runPIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, (F32)getTargetROPumpFlowRateMLPM(), currentFlowRate ); - roPumpDutyCyclePctSet = MIN( roPumpDutyCyclePctSet, ( MAX_P12_FLUID_PUMP_PWM_DUTY_CYCLE * MAX_P12_FLUID_PUMP_DUTY_CYCLE_PCT ) ); - setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); - - if ( FALSE == roPumpStartControl ) - { - roPumpStartControl = TRUE; - } - }*/ + // P16 flow seems to lag in current Leahi HW. We will wait before we start changing control. if ( TRUE == didTimeout( p12LagTimer, RO_LAG_TIMER ) ) { roPumpDutyCyclePctSet = runPIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, (F32)getTargetROPumpFlowRateMLPM(), currentFlowRate ); roPumpDutyCyclePctSet = MIN( roPumpDutyCyclePctSet, ( MAX_P12_FLUID_PUMP_PWM_DUTY_CYCLE * MAX_P12_FLUID_PUMP_DUTY_CYCLE_PCT ) ); setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); - -// if ( FALSE == roPumpStartControl ) -// { -// roPumpStartControl = TRUE; -// } } roControlTimerCounter = 0; } @@ -391,7 +371,7 @@ } else if ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL ) { - roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP_PRES, getTargetROPumpPressure(), getFilteredPressure( P17_PRES ) ); + roPumpDutyCyclePctSet = runPIDController( PID_CONTROLLER_ID_RO_PUMP_PRES, getTargetROPumpPressure(), getFilteredPressure( P17_PRES ) ); setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); roControlTimerCounter = 0; } @@ -738,7 +718,7 @@ if( targetROPumpPressure.data > 0.0F ) { targetROPumpPressure.data = 0.0F; - resetPIController( PI_CONTROLLER_ID_RO_PUMP_PRES, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, 0.0F ); + resetPIDController( PID_CONTROLLER_ID_RO_PUMP_PRES, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, 0.0F ); } roPumpState = RO_PUMP_OFF_STATE; Index: firmware/App/Modes/FPModes/ModeGenPermeate.c =================================================================== diff -u -r9f1f5a95111b55ee99bbdcd60a2c8b4cc088237c -r4626638b758c6673c0a8a3cc8d008bb4a898cea9 --- firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision 9f1f5a95111b55ee99bbdcd60a2c8b4cc088237c) +++ firmware/App/Modes/FPModes/ModeGenPermeate.c (.../ModeGenPermeate.c) (revision 4626638b758c6673c0a8a3cc8d008bb4a898cea9) @@ -42,7 +42,7 @@ // ********** private definitions ********** #define PRE_GEN_PERMEATE_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen permeate mode data published. -#define GEN_PERMEATE_BOOST_PUMP_TGT_PSI 25.0F ///< Pressure target in PSI for the boost pump during generate permeate mode. +#define GEN_PERMEATE_BOOST_PUMP_TGT_PSI 8.0F ///< Pressure target in PSI for the boost pump during generate permeate mode. #define GEN_PERMEATE_RO_PUMP_TGT_ML 800 ///< Flow target in ml/min for the ro pump during generate permeate mode. #define PUMP_REST_TIMEOUT_MS ( 3 * MS_PER_SECOND ) ///< Duraion for open loop control at the start of tank fill/full state ( in ms ) #define RO_REJECTION_WAIT_TIME_MS ( 8 * MS_PER_SECOND ) ///< RO rejection alarm wait time. 5 seconds for RR to stabilize and 3 seconds for calculating rolling average ( in ms ) Index: firmware/App/Modes/FPModes/ModePreGenPermeate.c =================================================================== diff -u -r9f1f5a95111b55ee99bbdcd60a2c8b4cc088237c -r4626638b758c6673c0a8a3cc8d008bb4a898cea9 --- firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision 9f1f5a95111b55ee99bbdcd60a2c8b4cc088237c) +++ firmware/App/Modes/FPModes/ModePreGenPermeate.c (.../ModePreGenPermeate.c) (revision 4626638b758c6673c0a8a3cc8d008bb4a898cea9) @@ -43,7 +43,7 @@ #define PRE_GENP_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the pre gen Permeate mode data published. #define VERIFY_WATER_RO_PUMP_TGT_FLOW_ML 800 ///< Target flow rate for RO pump in ml/min -#define VERIFY_WATER_BOOST_PUMP_TGT_PSI 25 ///< Target pressure for boost pump in psi. +#define VERIFY_WATER_BOOST_PUMP_TGT_PSI 8 ///< Target pressure for boost pump in psi. #define VERIFY_WATER_TIMEOUT_MS ( 30 * MS_PER_SECOND ) ///< Verify Water timer ( in ms ) #define FLOW_CONTROL_STABLIZED_TIMEOUT_MS ( 25 * MS_PER_SECOND ) ///< Flow control stablized time ( in ms ) Index: firmware/App/Modes/FPModes/StateFlushConcentrate.c =================================================================== diff -u -r9f1f5a95111b55ee99bbdcd60a2c8b4cc088237c -r4626638b758c6673c0a8a3cc8d008bb4a898cea9 --- firmware/App/Modes/FPModes/StateFlushConcentrate.c (.../StateFlushConcentrate.c) (revision 9f1f5a95111b55ee99bbdcd60a2c8b4cc088237c) +++ firmware/App/Modes/FPModes/StateFlushConcentrate.c (.../StateFlushConcentrate.c) (revision 4626638b758c6673c0a8a3cc8d008bb4a898cea9) @@ -42,7 +42,7 @@ #define CONCENTRATE_FLUSH_DATA_PUBLISH_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the gen water mode data published. #define CONCENTRATE_FLUSH_TIMEOUT ( 30 * MS_PER_SECOND ) ///< Concentrate flush timer (in ms) #define CONCENTRATE_FLUSH_RO_PUMP_TGT_PWM 0.8F ///< target in PWM % for the RO pump during concentrate flush. -#define CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI 25 ///< Pressure target in PSI for the boost pump during concentrate flush. +#define CONCENTRATE_FLUSH_BOOST_PUMP_TGT_PSI 8 ///< Pressure target in PSI for the boost pump during concentrate flush. #define CONCENTRATE_FLUSH_VOLUME_THRESHOLD_ML 1000.0F ///< Integrated volume threshold in ml #define CONCENTRATE_FLUSH_VOLUME_THRESHOLD_PCT 0.9F ///< Integrated volume threshold percentage #define CONCENTRATE_FLUSH_VOLUME_THRESHOLD CONCENTRATE_FLUSH_VOLUME_THRESHOLD_ML * CONCENTRATE_FLUSH_VOLUME_THRESHOLD_PCT ///< alarm threshold for integrated volume Index: firmware/App/Modes/FPModes/StateFlushPermeate.c =================================================================== diff -u -r9f1f5a95111b55ee99bbdcd60a2c8b4cc088237c -r4626638b758c6673c0a8a3cc8d008bb4a898cea9 --- firmware/App/Modes/FPModes/StateFlushPermeate.c (.../StateFlushPermeate.c) (revision 9f1f5a95111b55ee99bbdcd60a2c8b4cc088237c) +++ firmware/App/Modes/FPModes/StateFlushPermeate.c (.../StateFlushPermeate.c) (revision 4626638b758c6673c0a8a3cc8d008bb4a898cea9) @@ -41,9 +41,9 @@ #define PERMEATE_FLUSH_TIMEOUT ( 2 * SEC_PER_MIN * MS_PER_SECOND ) ///< Permeate flush timer (in ms) timeout for 2 minutes #define PERMEATE_FLUSH_ALARM_TIMEOUT ( 5 * SEC_PER_MIN * MS_PER_SECOND ) ///< Permeate flush alarm timer (in ms) timeout for 5 minutes #define PERMEATE_FLUSH_RO_PUMP_TGT_ML 800 ///< Pressure target in ml/min for the RO pump during permeate flush. -#define PERMEATE_FLUSH_BOOST_PUMP_TGT_PSI 25 ///< Pressure target in PSI for the boost pump during permeate flush. +#define PERMEATE_FLUSH_BOOST_PUMP_TGT_PSI 8 ///< Pressure target in PSI for the boost pump during permeate flush. #define PERMEATE_FLUSH_CONDUCTIVITY_THRESHOLD 200.0F ///< Conductivity alarm threshold for permeate flush. -#define MIN_BOOST_PUMP_DUTY_CYCLE_PCT 0.5F ///< Minimum duty cycle value for boost pump during open loop control +#define MIN_BOOST_PUMP_DUTY_CYCLE_PCT 0.1F ///< Minimum duty cycle value for boost pump during open loop control // ********** private data ********** @@ -262,7 +262,6 @@ { setBoostPumpTargetPressure( PERMEATE_FLUSH_BOOST_PUMP_TGT_PSI, TRUE ); } - //TODO update target macro after changing it to 750 + rinse pump rate setROPumpTargetFlowRateMLPM( PERMEATE_FLUSH_RO_PUMP_TGT_ML, TRUE ); permeateFlushTimer = getMSTimerCount(); permeateFlushAlarmTimer = getMSTimerCount();