Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r60693bf21a8a0277eae54cbfcb6cfd68176b079a -ra3ed83ddd9e39aceb6216da6e640c0e369de2902 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 60693bf21a8a0277eae54cbfcb6cfd68176b079a) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision a3ed83ddd9e39aceb6216da6e640c0e369de2902) @@ -40,21 +40,22 @@ // ********** private definitions ********** #define RO_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO Pump data is published on the CAN bus. -#define ROP_CONTROL_INTERVAL ( 300 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled. +#define ROP_CONTROL_INTERVAL ( ( MS_PER_SECOND ) / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled. +#define RO_LAG_TIMER ( MS_PER_SECOND *4 ) -#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 ///< D term for RO pump flow control -#define ROP_MIN_FLOW_TO_CONTROL_PCT 0.75F +#define ROP_FLOW_CONTROL_P_COEFFICIENT 0.00005F ///< P term for RO pump flow control. +#define ROP_FLOW_CONTROL_I_COEFFICIENT 0.000002F +#define ROP_FLOW_CONTROL_D_COEFFICIENT 0.0F ///< D term for RO pump flow control +#define ROP_MIN_FLOW_TO_CONTROL_PCT 0.8F #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_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.3537F ///< Slope of flow to PWM line equation for permeate flush. -#define ROP_FLOW_TO_PWM_INTERCEPT_MED_RECOVERY 94.559F ///< 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_FLOW_TO_PWM_SLOPE_NO_RECOVERY 0.2091F ///< Slope of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_INTERCEPT_NO_RECOVERY 69.612F ///< Intercept of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_SLOPE_MED_RECOVERY 3.1417F ///< Slope of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_INTERCEPT_MED_RECOVERY -315.58F ///< Intercept of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_SLOPE_MAX_RECOVER 0.1794F ///< Slope of flow to PWM line equation for max RO recovery. +#define ROP_FLOW_TO_PWM_INTERCEPT_MAX_RECOVER 82.449F ///< 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. @@ -85,6 +86,7 @@ static OVERRIDE_F32_T roPumpOpenLoopTargetDutyCycle; ///< Target RO pump open loop PWM. static BOOL roPumpStartControl; ///< boolean to determine when closed loop flow control starts static U32 timeSinceP12Started; ///< Time when RO pump is started from off state. +static U32 p12LagTimer; // ********** private function prototypes ********** @@ -112,7 +114,7 @@ // Initialize RO pump PI controller to flow 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_RO_FLOWRATE_MLPM, MAX_RO_FLOWRATE_MLPM, FALSE, 0 ); + 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, @@ -142,6 +144,7 @@ roPumpOpenLoopTargetDutyCycle.ovInitData = 0.0; roPumpOpenLoopTargetDutyCycle.override = OVERRIDE_RESET; timeSinceP12Started = 0; + p12LagTimer = 0; stopROPump(); } @@ -210,6 +213,7 @@ resetPIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0.0F ); setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); roPumpStartControl = FALSE; + p12LagTimer = getMSTimerCount(); state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } // If there is a target pressure set, transition to the PI controller and control to pressure. @@ -323,11 +327,12 @@ } else if ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL ) { + 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 ) ) ) +/* 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 ) ); @@ -337,6 +342,17 @@ { roPumpStartControl = TRUE; } + }*/ + 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; } @@ -775,15 +791,25 @@ { RO_PUMP_DATA_T pumpData; +// pumpData.p12PumpState = (U32)roPumpState; +// pumpData.p12PumpDutyCycle = (U32)getFluidPumpPWMDutyCycle( P12_PUMP ); +// pumpData.p12PumpFBDutyCycle = (U32)getFluidPumpReadPWMDutyCycle( P12_PUMP ); +// pumpData.p12PumpSpeed = getFluidPumpRPM( P12_PUMP ); +// pumpData.p12TargetPressure = getTargetROPumpPressure(); +// pumpData.p12TargetFlow = getTargetROPumpFlowRateMLPM(); +// pumpData.p12TargetDutyCycle = getTargetROPumpDutyCyclePCT(); +// pumpData.p12PumpDutyCyclePct = convertDutyCycleCntToPct( P12_PUMP, (U32)getFluidPumpPWMDutyCycle( P12_PUMP ) ); +// pumpData.p12PumpFBDutyCyclePct = convertDutyCycleCntToPct( P12_PUMP, (U32)getFluidPumpReadPWMDutyCycle( P12_PUMP ) ); + pumpData.p12PumpState = (U32)roPumpState; pumpData.p12PumpDutyCycle = (U32)getFluidPumpPWMDutyCycle( P12_PUMP ); - pumpData.p12PumpFBDutyCycle = (U32)getFluidPumpReadPWMDutyCycle( P12_PUMP ); - pumpData.p12PumpSpeed = getFluidPumpRPM( P12_PUMP ); - pumpData.p12TargetPressure = getTargetROPumpPressure(); - pumpData.p12TargetFlow = getTargetROPumpFlowRateMLPM(); - pumpData.p12TargetDutyCycle = getTargetROPumpDutyCyclePCT(); - pumpData.p12PumpDutyCyclePct = convertDutyCycleCntToPct( P12_PUMP, (U32)getFluidPumpPWMDutyCycle( P12_PUMP ) ); - pumpData.p12PumpFBDutyCyclePct = convertDutyCycleCntToPct( P12_PUMP, (U32)getFluidPumpReadPWMDutyCycle( P12_PUMP ) ); + pumpData.p12PumpFBDutyCycle = getPIDControllerSignals(PID_CONTROLLER_ID_RO_PUMP_FLOW, CONTROLLER_SIGNAL_PID_DERIVATIVE_OUTPUT ); + pumpData.p12PumpSpeed = getPIDControllerSignals(PID_CONTROLLER_ID_RO_PUMP_FLOW, CONTROLLER_SIGNAL_PID_MEASURED ); + pumpData.p12TargetPressure = getPIDControllerSignals(PID_CONTROLLER_ID_RO_PUMP_FLOW, CONTROLLER_SIGNAL_PID_ERROR ); + pumpData.p12TargetFlow = getPIDControllerSignals(PID_CONTROLLER_ID_RO_PUMP_FLOW, CONTROLLER_SIGNAL_PID_ERROR_SUM ); + pumpData.p12TargetDutyCycle = getPIDControllerSignals(PID_CONTROLLER_ID_RO_PUMP_FLOW, CONTROLLER_SIGNAL_PID_PROPORTIONAL_OUTPUT ); + pumpData.p12PumpDutyCyclePct = getPIDControllerSignals(PID_CONTROLLER_ID_RO_PUMP_FLOW, CONTROLLER_SIGNAL_PID_INTEGRAL_OUTPUT ); + pumpData.p12PumpFBDutyCyclePct = getPIDControllerSignals(PID_CONTROLLER_ID_RO_PUMP_FLOW, CONTROLLER_SIGNAL_PID_CONTROL ); broadcastData( MSG_ID_FP_RO_PUMP_DATA, COMM_BUFFER_OUT_CAN_FP_BROADCAST, (U08*)&pumpData, sizeof( RO_PUMP_DATA_T ) ); roPumpDataPublicationTimerCounter = 0;