Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -r359cf587f2f935ef9f40a16d17c4105efa653c1d -r2510a84808ee5179d3f84f0b04f24c5a4122dbe5 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 359cf587f2f935ef9f40a16d17c4105efa653c1d) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 2510a84808ee5179d3f84f0b04f24c5a4122dbe5) @@ -49,8 +49,7 @@ #define DRAIN_PUMP_P_COEFFICIENT 0.005 //TODO DARA #define DRAIN_PUMP_I_COEFFICIENT 0.0015 //TODO DARA -#define DRAIN_PUMP_TARGET_DELTA_PRESSURE NEARLY_ZERO //TODO dara - + /// Enumeration of drain pump states. typedef enum DrainPump_States { @@ -89,16 +88,17 @@ static PUMP_CONTROL_MODE_T drainPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; ///< requested drain pump control mode. static PUMP_CONTROL_MODE_T drainPumpControlModeSet = PUMP_CONTROL_MODE_OPEN_LOOP; ///< currently set drain pump control mode. -static OVERRIDE_U32_T drainPumpDataPublishInterval = { DRAIN_PUMP_DATA_PUB_INTERVAL, DRAIN_PUMP_DATA_PUB_INTERVAL, 0, 0 }; ///< interval (in ms) at which to publish RO flow data to CAN bus. -static OVERRIDE_U32_T targetDrainPumpSpeed = { 0, 0, 0, 0 }; ///< Target RO pressure (in PSI). +static OVERRIDE_U32_T drainPumpDataPublishInterval = { DRAIN_PUMP_DATA_PUB_INTERVAL, + DRAIN_PUMP_DATA_PUB_INTERVAL, + 0, 0 }; ///< interval (in ms) at which to publish RO flow data to CAN bus +static OVERRIDE_U32_T targetDrainPumpSpeed = { 0, 0, 0, 0 }; ///< Target RO pressure (in PSI) +static OVERRIDE_U32_T targetDrainPumpDeltaP = { 0, 0, 0, 0 }; ///< Target delta pressure for the drain pump static U32 drainControlTimerCounter = 0; ///< determines when to perform control on drain pump static DRAIN_PUMP_SELF_TEST_STATE_T drainPumpSelfTestState = DRAIN_PUMP_SELF_TEST_STATE_START; ///< current drain pump self test state static U32 drainPumpSelfTestTimerCount = 0; ///< timer counter for drain pump self test -static BOOL hasClosedLoopBeenRequested = FALSE; - // ********** private function prototypes ********** static DRAIN_PUMP_STATE_T handleDrainPumpOffState( void ); @@ -135,20 +135,31 @@ * @param rpm : new target drain pump speed (in RPM). * @return TRUE if new target speed is set, FALSE if not *************************************************************************/ -BOOL setDrainPumpTargetSpeed( U32 rpm, PUMP_CONTROL_MODE_T mode ) +BOOL setDrainPumpTargetSpeed( U32 rpm ) { - BOOL result = FALSE; + BOOL result = FALSE; if ( ( 0 == rpm ) || ( ( rpm >= MIN_DRAIN_PUMP_RPM_TARGET ) && ( rpm <= MAX_DRAIN_PUMP_RPM_TARGET ) ) ) { drainPumpDAC = (U32)((F32)rpm * DRP_SPEED_RPM_TO_ADC_FACTOR + FLOAT_TO_INT_ROUNDUP_OFFSET); targetDrainPumpSpeed.data = rpm; - drainPumpControlMode = mode; + drainPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; result = TRUE; } return result; +} + +BOOL setDrainPumpTargetDeltaPressure ( U32 deltaP ) +{ + BOOL result = FALSE; + + targetDrainPumpDeltaP.data = deltaP; + drainPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; + result = TRUE; + + return result; } /*********************************************************************//** @@ -242,17 +253,13 @@ // if we've been given a pressure, transition to open loop state // as it will not be controlling and it will just run - if ( getTargetDrainPumpSpeed() > 0 && !hasClosedLoopBeenRequested ) + if ( getTargetDrainPumpSpeed() > 0 && + drainPumpControlMode == PUMP_CONTROL_MODE_OPEN_LOOP ) { // set drain pump enable pin SET_DRAIN_PUMP_ENABLE(); // set drain pump control mode drainPumpControlModeSet = drainPumpControlMode; - // Check if drain pump mode is closed loop - //if ( drainPumpControlModeSet == PUMP_CONTROL_MODE_CLOSED_LOOP ) - //{ - // resetPIController( PI_CONTROLLER_ID_DRAIN_PUMP, MIN_DRAIN_PUMP_RPM_TARGET ); - //} // set drain pump DAC drainPumpDACSet = drainPumpDAC; setFPGADrainPumpSpeed( drainPumpDACSet ); @@ -261,16 +268,17 @@ result = DRAIN_PUMP_OPEN_LOOP_STATE; } - if ( hasClosedLoopBeenRequested ) + else if ( drainPumpControlMode == PUMP_CONTROL_MODE_OPEN_LOOP ) { // set drain pump enable pin SET_DRAIN_PUMP_ENABLE(); // set drain pump control mode drainPumpControlModeSet = drainPumpControlMode; - resetPIController( PI_CONTROLLER_ID_DRAIN_PUMP, MIN_DRAIN_PUMP_RPM_TARGET ); + U32 rpm = 500; + drainPumpDAC = (U32)((F32)rpm * DRP_SPEED_RPM_TO_ADC_FACTOR + FLOAT_TO_INT_ROUNDUP_OFFSET); // set drain pump DAC drainPumpDACSet = drainPumpDAC; setFPGADrainPumpSpeed( drainPumpDACSet ); @@ -303,7 +311,7 @@ F32 inletDrainPressure = getMeasuredDGPressure ( PRESSURE_SENSOR_DRAIN_PUMP_INLET ); F32 outletDrainPressure = getMeasuredDGPressure ( PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ); F32 pressureDiff = fabs( inletDrainPressure - outletDrainPressure ); - F32 rpm = runPIController( PI_CONTROLLER_ID_DRAIN_PUMP, DRAIN_PUMP_TARGET_DELTA_PRESSURE, pressureDiff ); + F32 rpm = runPIController( PI_CONTROLLER_ID_DRAIN_PUMP, targetDrainPumpDeltaP.data, pressureDiff ); drainPumpDAC = (U32)((F32)rpm * DRP_SPEED_RPM_TO_ADC_FACTOR + FLOAT_TO_INT_ROUNDUP_OFFSET); setFPGADrainPumpSpeed( drainPumpDAC ); } @@ -507,7 +515,7 @@ targetDrainPumpSpeed.ovInitData = targetDrainPumpSpeed.data; // backup current target pressure targetDrainPumpSpeed.ovData = value; targetDrainPumpSpeed.override = OVERRIDE_KEY; - result = setDrainPumpTargetSpeed( value, PUMP_CONTROL_MODE_OPEN_LOOP ); + result = setDrainPumpTargetSpeed( value ); } return result; @@ -532,7 +540,7 @@ targetDrainPumpSpeed.override = OVERRIDE_RESET; targetDrainPumpSpeed.ovInitData = 0; targetDrainPumpSpeed.ovData = 0; - result = setDrainPumpTargetSpeed( targetDrainPumpSpeed.data, PUMP_CONTROL_MODE_OPEN_LOOP ); + result = setDrainPumpTargetSpeed( targetDrainPumpSpeed.data ); } return result;