Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -r2510a84808ee5179d3f84f0b04f24c5a4122dbe5 -r1d235091e158221f1fa8b1579140905a13249a54 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 2510a84808ee5179d3f84f0b04f24c5a4122dbe5) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 1d235091e158221f1fa8b1579140905a13249a54) @@ -40,22 +40,22 @@ // ********** private definitions ********** -#define DRAIN_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< interval (ms/task time) at which the Drain Pump data is published on the CAN bus +#define DRAIN_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< interval (ms/task time) at which the Drain Pump data is published on the CAN bus -#define DRP_CONTROL_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< interval (ms/task time) at which the Drain pump is controlled +#define DRP_CONTROL_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< interval (ms/task time) at which the Drain pump is controlled -#define DRP_SPEED_ADC_TO_RPM_FACTOR 12.94 ///< conversion factor from ADC counts to RPM for Drain pump -#define DRP_SPEED_RPM_TO_ADC_FACTOR ( 1.0 / DRP_SPEED_ADC_TO_RPM_FACTOR ) ///< conversion factor from RPM to ADC counts for Drain pump +#define DRP_SPEED_ADC_TO_RPM_FACTOR 12.94 ///< conversion factor from ADC counts to RPM for Drain pump +#define DRP_SPEED_RPM_TO_ADC_FACTOR ( 1.0 / DRP_SPEED_ADC_TO_RPM_FACTOR ) ///< conversion factor from RPM to ADC counts for Drain pump -#define DRAIN_PUMP_P_COEFFICIENT 0.005 //TODO DARA -#define DRAIN_PUMP_I_COEFFICIENT 0.0015 //TODO DARA +#define DRAIN_PUMP_P_COEFFICIENT 0.005 ///< P term for drain pump delta pressure control +#define DRAIN_PUMP_I_COEFFICIENT 0.0015 ///< I term for drain pump delta pressure control /// Enumeration of drain pump states. typedef enum DrainPump_States { - DRAIN_PUMP_OFF_STATE = 0, ///< Drain pump off state + DRAIN_PUMP_OFF_STATE = 0, ///< Drain pump off state + DRAIN_PUMP_CONTROL_TO_TARGET_STATE, ///< Drain pump control to target state DRAIN_PUMP_OPEN_LOOP_STATE, ///< Drain pump open loop state - DRAIN_PUMP_CONTROL_TO_TARGET_STATE, ///< Drain pump control to target state NUM_OF_DRAIN_PUMP_STATES ///< Number of drain pump states } DRAIN_PUMP_STATE_T; @@ -82,27 +82,28 @@ static DRAIN_PUMP_STATE_T drainPumpState = DRAIN_PUMP_OFF_STATE; ///< current state of drain pump controller state machine static U32 drainPumpDataPublicationTimerCounter = 0; ///< used to schedule drain pump data publication to CAN bus -static BOOL isDrainPumpOn = FALSE; ///< Drain pump is currently running static U32 drainPumpDAC = 0; ///< initial drain pump DAC value static U32 drainPumpDACSet = 0; ///< currently set drain pump DAC value -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 PUMP_CONTROL_MODE_T drainPumpControlMode = NUM_OF_PUMP_CONTROL_MODES; ///< requested 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 targetDrainPumpDeltaP = { 0, 0, 0, 0 }; ///< Target delta pressure for the drain pump + 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 targetDrainPumpDeltaPressure = { 0, 0, 0, 0 }; ///< Target delta pressure for the drain pump -static U32 drainControlTimerCounter = 0; ///< determines when to perform control on drain pump +static U32 drainControlTimerCounter = 0; ///< determines when to perform control on drain pump +/* These variables are used for POST. POST will be implemented later 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 +*/ // ********** private function prototypes ********** static DRAIN_PUMP_STATE_T handleDrainPumpOffState( void ); -static DRAIN_PUMP_STATE_T handleDrainPumpControlToTargetState( void ); +static DRAIN_PUMP_STATE_T handleDrainPumpControlToTargetState( void ); +static DRAIN_PUMP_STATE_T handleDrainPumpOpenLoopState( void ); static void stopDrainPump( void ); static void publishDrainPumpData( void ); static DATA_GET_PROTOTYPE( U32, getPublishDrainPumpDataInterval ); @@ -119,7 +120,7 @@ { stopDrainPump(); - // Initialize the drain pump + // Initialize the drain pump PI controller initializePIController( PI_CONTROLLER_ID_DRAIN_PUMP, MIN_DRAIN_PUMP_RPM_TARGET, DRAIN_PUMP_P_COEFFICIENT, DRAIN_PUMP_I_COEFFICIENT, MIN_DRAIN_PUMP_RPM_TARGET, MAX_DRAIN_PUMP_RPM_TARGET ); @@ -151,11 +152,21 @@ return result; } +/*********************************************************************//** + * @brief + * The setDrainPumpTargetDeltaPressure function sets the target delta\n + * pressure in between the PRd and PDr sensors + * @details + * Inputs : targetDrainPumpDeltaP + * Outputs : targetDrainPumpDeltaP + * @param deltaP : new target drain pump delta pressure + * @return TRUE if new target speed is set, FALSE if not + *************************************************************************/ BOOL setDrainPumpTargetDeltaPressure ( U32 deltaP ) { BOOL result = FALSE; - targetDrainPumpDeltaP.data = deltaP; + targetDrainPumpDeltaPressure.data = deltaP; drainPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; result = TRUE; @@ -174,7 +185,8 @@ { targetDrainPumpSpeed.data = 0; stopDrainPump(); - drainPumpState = DRAIN_PUMP_OFF_STATE; + drainPumpState = DRAIN_PUMP_OFF_STATE; + drainPumpControlMode = NUM_OF_PUMP_CONTROL_MODES; // Set the control mode to none drainControlTimerCounter = 0; } @@ -216,6 +228,10 @@ case DRAIN_PUMP_CONTROL_TO_TARGET_STATE: drainPumpState = handleDrainPumpControlToTargetState(); + break; + + case DRAIN_PUMP_OPEN_LOOP_STATE: + drainPumpState = handleDrainPumpOpenLoopState(); break; default: @@ -231,7 +247,7 @@ * of the drain pump controller state machine. * @details * Inputs : targetDrainPumpSpeed - * Outputs : drainPumpPWMDutyCyclePctSet, isDrainPumpOn + * Outputs : drainPumpPWMDutyCyclePctSet * @return next state *************************************************************************/ static DRAIN_PUMP_STATE_T handleDrainPumpOffState( void ) @@ -251,39 +267,36 @@ #endif #endif - // if we've been given a pressure, transition to open loop state - // as it will not be controlling and it will just run + // If the target drain pump speed was not 0 and the control mode + // is open loop, set the drain pump to open loop 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; + // set drain pump DAC drainPumpDACSet = drainPumpDAC; setFPGADrainPumpSpeed( drainPumpDACSet ); - // set pump to on - isDrainPumpOn = TRUE; + result = DRAIN_PUMP_OPEN_LOOP_STATE; } - - else if ( drainPumpControlMode == PUMP_CONTROL_MODE_OPEN_LOOP ) + // If the drain pump is set to closed loop, call the proper state + // It is checked for the value of delta pressure because it can be anything + // including 0 + else if ( drainPumpControlMode == PUMP_CONTROL_MODE_CLOSED_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; + U32 rpm = targetDrainPumpSpeed.data; drainPumpDAC = (U32)((F32)rpm * DRP_SPEED_RPM_TO_ADC_FACTOR + FLOAT_TO_INT_ROUNDUP_OFFSET); // set drain pump DAC drainPumpDACSet = drainPumpDAC; setFPGADrainPumpSpeed( drainPumpDACSet ); - // set pump to on - isDrainPumpOn = TRUE; + result = DRAIN_PUMP_CONTROL_TO_TARGET_STATE; } @@ -306,21 +319,19 @@ // control at set interval if ( ++drainControlTimerCounter >= DRP_CONTROL_INTERVAL ) { - if ( drainPumpControlModeSet == PUMP_CONTROL_MODE_CLOSED_LOOP ) - { - 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, targetDrainPumpDeltaP.data, pressureDiff ); - drainPumpDAC = (U32)((F32)rpm * DRP_SPEED_RPM_TO_ADC_FACTOR + FLOAT_TO_INT_ROUNDUP_OFFSET); - setFPGADrainPumpSpeed( drainPumpDAC ); - } + 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, targetDrainPumpDeltaPressure.data, pressureDiff ); + drainPumpDAC = (U32)(rpm * DRP_SPEED_RPM_TO_ADC_FACTOR + FLOAT_TO_INT_ROUNDUP_OFFSET); + setFPGADrainPumpSpeed( drainPumpDAC ); drainControlTimerCounter = 0; } if ( 0 == getTargetDrainPumpSpeed() ) { - signalDrainPumpHardStop(); + signalDrainPumpHardStop(); + result = DRAIN_PUMP_OFF_STATE; } @@ -339,19 +350,32 @@ #endif return result; +} + +/*********************************************************************//** + * @brief + * The handleDrainPumpOpenLoopState function handles the open loop \n + * state + * @details + * Inputs : none + * Outputs : none + * @return next state + *************************************************************************/ +static DRAIN_PUMP_STATE_T handleDrainPumpOpenLoopState( void ) +{ + return DRAIN_PUMP_OPEN_LOOP_STATE; } /*********************************************************************//** * @brief * The stopDrainPump function sets the Drain pump DAC to zero. * @details * Inputs : none - * Outputs : isDrainPumpOn, DAC zeroed + * Outputs : DAC zeroed * @return none *************************************************************************/ static void stopDrainPump( void ) { - isDrainPumpOn = FALSE; drainPumpDAC = 0; drainPumpDACSet = 0; setFPGADrainPumpSpeed( drainPumpDACSet ); @@ -414,9 +438,12 @@ // publish Drain pump data on interval if ( ++drainPumpDataPublicationTimerCounter >= getPublishDrainPumpDataInterval() ) { - U32 spdStPt = getTargetDrainPumpSpeed(); + U32 spdStPt = getTargetDrainPumpSpeed(); + + F32 pressureDiff = fabs( getMeasuredDGPressure ( PRESSURE_SENSOR_DRAIN_PUMP_INLET ) - + getMeasuredDGPressure ( PRESSURE_SENSOR_DRAIN_PUMP_OUTLET ) ); - broadcastDrainPumpData( spdStPt, drainPumpDACSet ); + broadcastDrainPumpData( spdStPt, drainPumpDACSet, pressureDiff, (U32)drainPumpState ); drainPumpDataPublicationTimerCounter = 0; } } @@ -441,7 +468,6 @@ /**@}*/ - /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/ @@ -544,6 +570,56 @@ } return result; +} + +/*********************************************************************//** + * @brief + * The testSetTargetDrainPumpDeltaPressureOverride function overrides \n + * the target drain pump delta pressure + * @details + * Inputs : none + * Outputs : targetDrainPumpDeltaPressure + * @param value : override target drain pump delta pressure + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testSetTargetDrainPumpDeltaPressureOverride( U32 value ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + targetDrainPumpDeltaPressure.ovInitData = targetDrainPumpDeltaPressure.data; // backup current target delta pressure + targetDrainPumpDeltaPressure.ovData = value; + targetDrainPumpDeltaPressure.override = OVERRIDE_KEY; + result = setDrainPumpTargetDeltaPressure( value ); + } + + return result; +} + +/*********************************************************************//** + * @brief + * The testResetTargetDrainPumpDeltaPressureOverride function resets the \n + * override of the target drain pump delta pressure + * @details + * Inputs : none + * Outputs : targetDrainPumpDeltaPressure + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ +BOOL testResetTargetDrainPumpDeltaPressureOverride( void ) +{ + BOOL result = FALSE; + + if ( TRUE == isTestingActivated() ) + { + targetDrainPumpDeltaPressure.data = targetDrainPumpDeltaPressure.ovInitData; // restore pre-override target delta pressure + targetDrainPumpDeltaPressure.override = OVERRIDE_RESET; + targetDrainPumpDeltaPressure.ovInitData = 0; + targetDrainPumpDeltaPressure.ovData = 0; + result = setDrainPumpTargetDeltaPressure( targetDrainPumpDeltaPressure.data ); + } + + return result; } Index: firmware/App/Controllers/DrainPump.h =================================================================== diff -u -r2510a84808ee5179d3f84f0b04f24c5a4122dbe5 -r1d235091e158221f1fa8b1579140905a13249a54 --- firmware/App/Controllers/DrainPump.h (.../DrainPump.h) (revision 2510a84808ee5179d3f84f0b04f24c5a4122dbe5) +++ firmware/App/Controllers/DrainPump.h (.../DrainPump.h) (revision 1d235091e158221f1fa8b1579140905a13249a54) @@ -50,9 +50,13 @@ DATA_GET_PROTOTYPE( U32, getTargetDrainPumpSpeed ); BOOL testSetDrainPumpDataPublishIntervalOverride( U32 value ); -BOOL testResetDrainPumpDataPublishIntervalOverride( void ); +BOOL testResetDrainPumpDataPublishIntervalOverride( void ); + BOOL testSetTargetDrainPumpSpeedOverride( U32 value ); -BOOL testResetTargetDrainPumpSpeedOverride( void ); +BOOL testResetTargetDrainPumpSpeedOverride( void ); + +BOOL testSetTargetDrainPumpDeltaPressureOverride( U32 value ); +BOOL testResetTargetDrainPumpDeltaPressureOverride( void ); /**@}*/ Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r2510a84808ee5179d3f84f0b04f24c5a4122dbe5 -r1d235091e158221f1fa8b1579140905a13249a54 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 2510a84808ee5179d3f84f0b04f24c5a4122dbe5) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 1d235091e158221f1fa8b1579140905a13249a54) @@ -75,11 +75,11 @@ /// Enumeration of RO pump states. typedef enum ROPump_States { - RO_PUMP_OFF_STATE = 0, ///< RO pump off state - RO_PUMP_OPEN_LOOP_STATE, ///< RO pump open loop state + RO_PUMP_OFF_STATE = 0, ///< RO pump off state RO_PUMP_RAMP_UP_STATE, ///< RO pump ramp up to target flow rate state RO_PUMP_VERIFY_FLOW_STATE, ///< RO pump maintain the flow rate for a few seconds state - RO_PUMP_CONTROL_TO_TARGET_STATE, ///< RO pump control to target pressure state + RO_PUMP_CONTROL_TO_TARGET_STATE, ///< RO pump control to target pressure state + RO_PUMP_OPEN_LOOP_STATE, ///< RO pump open loop state NUM_OF_RO_PUMP_STATES ///< Number of RO pump states } RO_PUMP_STATE_T; @@ -105,15 +105,12 @@ static BOOL isROPumpOn = FALSE; ///< RO pump is currently running static F32 roPumpPWMDutyCyclePct = 0.0; ///< initial RO pump PWM duty cycle static F32 roPumpPWMDutyCyclePctSet = 0.0; ///< currently set RO pump PWM duty cycle -static PUMP_CONTROL_MODE_T roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< requested RO pump control mode. -static PUMP_CONTROL_MODE_T roPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< currently set RO pump control mode. //TODO remove, the control mode set is picked -// implicitly from the function that is called +static PUMP_CONTROL_MODE_T roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< requested RO pump control mode. //TODO remove -static OVERRIDE_F32_T targetROPumpFlowRate = { 0, 0, 0, 0 }; //From Branch ///< Target RO flow rate (in LPM_) // TODO dara +static OVERRIDE_F32_T targetROPumpFlowRate = { 0, 0, 0, 0 }; ///< Target RO flow rate (in LPM_) static OVERRIDE_U32_T roPumpDataPublishInterval = { RO_PUMP_DATA_PUB_INTERVAL, RO_PUMP_DATA_PUB_INTERVAL, 0, 0 }; ///< interval (in ms) at which to publish RO flow data to CAN bus. -static OVERRIDE_U32_T targetROPumpPressure = { 0, 0, 0, 0 }; ///< Target RO pressure (in PSI). //TODO remove static OVERRIDE_F32_T measuredROFlowRateLPM = { 0.0, 0.0, 0.0, 0 }; ///< measured RO flow rate (in LPM). static F32 measuredROPumpPressure = 0.0; ///< measured RO pressure (in PSI). // TODO remove static F32 tgtROPumpPressure = 0.0; @@ -122,8 +119,10 @@ static U32 flowFilterCounter = 0; ///< used to schedule flow filtering. static U32 flowVerificationCounter = 0; ///< Counter to verify the flow is in range -static U32 roControlTimerCounter = 0; ///< determines when to perform control on ro pump +static U32 roControlTimerCounter = 0; ///< determines when to perform control on ro pump +static U32 roPumpOpenLooptargetPWM = 0; + /* The variables used for POST. They are not in use yet, so they are commented out static RO_PUMP_SELF_TEST_STATE_T roPumpSelfTestState = RO_PUMP_SELF_TEST_STATE_START; ///< current ro pump self test state static U32 roPumpSelfTestTimerCount = 0; ///< timer counter for ro pump self test @@ -133,14 +132,15 @@ static RO_PUMP_STATE_T handleROPumpOffState( void ); static RO_PUMP_STATE_T handleROPumpRampUpState( void ); static RO_PUMP_STATE_T handleROPumpVerifyFlowState( void ); -static RO_PUMP_STATE_T handleROPumpControlToTargetState( void ); +static RO_PUMP_STATE_T handleROPumpControlToTargetState( void ); +static RO_PUMP_STATE_T handleROPumpOpenLoopState( void ); static void setROPumpControlSignalPWM( F32 newPWM ); static void stopROPump( void ); static void publishROPumpData( void ); static DATA_GET_PROTOTYPE( U32, getPublishROPumpDataInterval ); /*********************************************************************//** - * @brief initROPump + * @brief * The initROPump function initializes the ROPump module. * @details * Inputs : none @@ -160,45 +160,40 @@ initializePIController( I_CONTROLLER_ID_RO_PUMP_RAMP_UP, MIN_RO_PUMP_PWM_DUTY_CYCLE, ROP_RAMP_UP_P_COEFFICIENT, ROP_RAMP_UP_I_COEFFICIENT, MIN_RO_PUMP_PWM_DUTY_CYCLE, MAX_RO_PUMP_PWM_DUTY_CYCLE ); +} + +/*********************************************************************//** + * @brief + * The setROPumpTargetPWM function sets the PWM that the pump should run + * @details + * Inputs : roPumpOpenLooptargetPWM, roPumpControlMode + * Outputs : roPumpOpenLooptargetPWM, roPumpControlMode + * @param: pwm + * @return whether the value was set (TRUE) or not (FALSE) + *************************************************************************/ +BOOL setROPumpTargetPWM( U32 pwm ) +{ + BOOL result = FALSE; + + if ( pwm > 0 ) + { + roPumpOpenLooptargetPWM = pwm; + roPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; + result = TRUE; + } + return result; } /*********************************************************************//** * @brief - * The setROPumpTargetPressure function sets a new target pressure for the \n + * The setROPumpTargetFlowRate function sets a new target flow rate for the \n * RO pump. * @details * Inputs : none - * Outputs : targetROPumpPressure, roPumpPWMDutyCyclePct - * @param roPressure : new target RO pressure - * @param mode : new control mode - * @return TRUE if new target pressure is set, FALSE if not + * Outputs : targetROPumpFlowRate, roPumpPWMDutyCyclePct + * @param roFlowRate : new target RO flow rate + * @return TRUE if new target flow rate is set, FALSE if not *************************************************************************/ -BOOL setROPumpTargetPressure( U32 roPressure, PUMP_CONTROL_MODE_T mode ) -{ - BOOL result = FALSE; - - // verify pressure - if ( roPressure >= MIN_RO_PRESSURE && roPressure <= MAX_RO_PRESSURE ) - { - targetROPumpPressure.data = roPressure; - roPumpControlMode = mode; - // set PWM duty cycle target to an estimated initial target based on target pressure - then we'll control to pressure going forward -#ifdef EMC_TEST_BUILD - roPumpPWMDutyCyclePct = 1.0; -#else - //roPumpPWMDutyCyclePct = ROP_PSI_TO_PWM_DC( roPressure ); -#endif - - result = TRUE; - } - else // requested pressure out of range - { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, roPressure ) // TODO - replace 1st param with s/w fault enum - } - - return result; -} - BOOL setROPumpTargetFlowRate( F32 roFlowRate ) { BOOL result = FALSE; @@ -207,7 +202,12 @@ { targetROPumpFlowRate.data = roFlowRate; roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; - roPumpPWMDutyCyclePct = roFlowRate; + roPumpPWMDutyCyclePct = roFlowRate; +#ifdef EMC_TEST_BUILD + roPumpPWMDutyCyclePct = 1.0; +#else + roPumpPWMDutyCyclePct = ROP_FLOW_TO_PWM_DC( roFlowRate ); +#endif } else // requested pressure out of range { @@ -293,9 +293,6 @@ { case RO_PUMP_OFF_STATE: roPumpState = handleROPumpOffState(); - break; - - case RO_PUMP_OPEN_LOOP_STATE: break; case RO_PUMP_RAMP_UP_STATE: @@ -308,15 +305,17 @@ case RO_PUMP_CONTROL_TO_TARGET_STATE: roPumpState = handleROPumpControlToTargetState(); + break; + + case RO_PUMP_OPEN_LOOP_STATE: + roPumpState = handleROPumpOpenLoopState(); break; default: SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, 0, roPumpState ) // TODO - replace 1st param with s/w fault enum roPumpState = RO_PUMP_OFF_STATE; break; } - - //publishROPumpData(); } /*********************************************************************//** @@ -337,8 +336,8 @@ * @brief * The handleROPumpOffState function handles the ro pump off state \n * of the ro pump controller state machine. - * @details - * Inputs : targetROPumpPressure + * @details + * Inputs : roPumpPWMDutyCyclePctSet, isROPumpOn * Outputs : roPumpPWMDutyCyclePctSet, isROPumpOn * @return next state *************************************************************************/ @@ -372,37 +371,39 @@ // If there is a flow, transition to P controller to get // the corresponding pressure of that flow - if ( getTargetROPumpFlowRate() > 0 ) + if ( getTargetROPumpFlowRate() > 0 && + roPumpControlMode == PUMP_CONTROL_MODE_CLOSED_LOOP ) { - //roPumpControlModeSet = roPumpControlMode; TODO remove this since the mode type is implicitly is picked from the function // set initial PWM duty cycle - roPumpPWMDutyCyclePctSet = ROP_FLOW_TO_PWM_DC( getTargetROPumpFlowRate() ); // Assume a liter/permin for top end + roPumpPWMDutyCyclePctSet = ROP_FLOW_TO_PWM_DC( getTargetROPumpFlowRate() ); setROPumpControlSignalPWM ( roPumpPWMDutyCyclePctSet ); // reset controller resetPIController ( I_CONTROLLER_ID_RO_PUMP_RAMP_UP, roPumpPWMDutyCyclePctSet ); // set pump to on isROPumpOn = TRUE; result = RO_PUMP_RAMP_UP_STATE; + } + + if ( roPumpOpenLooptargetPWM > 0 && + roPumpControlMode == PUMP_CONTROL_MODE_OPEN_LOOP ) + { + setROPumpControlSignalPWM ( roPumpOpenLooptargetPWM ); + isROPumpOn = TRUE; + result = RO_PUMP_OPEN_LOOP_STATE; } - // TODO remove - // if we've been given a pressure, transition to control to target state - /*if ( getTargetROPumpPressure() > 0 ) - { - roPumpControlModeSet = roPumpControlMode; - // set initial PWM duty cycle - roPumpPWMDutyCyclePctSet = roPumpPWMDutyCyclePct; - setROPumpControlSignalPWM( roPumpPWMDutyCyclePctSet ); - // reset controller - resetPIController( PI_CONTROLLER_ID_RO_PUMP, roPumpPWMDutyCyclePctSet ); - // set pump to on - isROPumpOn = TRUE; - result = RO_PUMP_CONTROL_TO_TARGET_STATE; - }*/ - return result; } - + +/*********************************************************************//** + * @brief + * The handleROPumpRampUpState function handles the ro pump ramp up state \n + * of the ro pump controller state machine. + * @details + * Inputs : roControlTimerCounter, roPumpPWMDutyCyclePctSet + * Outputs : roControlTimerCounter, roPumpPWMDutyCyclePctSet + * @return next state + *************************************************************************/ static RO_PUMP_STATE_T handleROPumpRampUpState( void ) { RO_PUMP_STATE_T result = RO_PUMP_RAMP_UP_STATE; @@ -434,6 +435,17 @@ return result; } +/*********************************************************************//** + * @brief + * The handleROPumpVerifyFlowState function handles the ro pump verify \n + * flow state of the ro pump controller state machine. + * @details + * Inputs : flowVerificationCounter, roPumpPWMDutyCyclePctSet, \n + * tgtROPumpPressure + * Outputs : flowVerificationCounter, roPumpPWMDutyCyclePctSet, \n + * tgtROPumpPressure + * @return next state + *************************************************************************/ static RO_PUMP_STATE_T handleROPumpVerifyFlowState( void ) { RO_PUMP_STATE_T result = RO_PUMP_VERIFY_FLOW_STATE; @@ -453,7 +465,6 @@ resetPIController( I_CONTROLLER_ID_RO_PUMP_RAMP_UP, MIN_RO_PUMP_PWM_DUTY_CYCLE ); tgtROPumpPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); - roPumpControlModeSet = roPumpControlMode; // set initial PWM duty cycle roPumpPWMDutyCyclePctSet = roPumpPWMDutyCyclePct; setROPumpControlSignalPWM( roPumpPWMDutyCyclePctSet ); @@ -477,8 +488,8 @@ * The handleROPumpControlToTargetState function handles the "control to \n * target" state of the ro pump controller state machine. * @details - * Inputs : none - * Outputs : roPumpState + * Inputs : roPumpPWMDutyCyclePctSet, roControlTimerCounter + * Outputs : roPumpPWMDutyCyclePctSet, roControlTimerCounter * @return next state *************************************************************************/ static RO_PUMP_STATE_T handleROPumpControlToTargetState( void ) @@ -520,6 +531,20 @@ #endif return result; +} + +/*********************************************************************//** + * @brief + * The handleROPumpOpenLoopState function handles the open loop state \n + * of the RO pump controller + * @details + * Inputs : roPumpPWMDutyCyclePctSet, roControlTimerCounter + * Outputs : roPumpPWMDutyCyclePctSet, roControlTimerCounter + * @return next state + *************************************************************************/ +static RO_PUMP_STATE_T handleROPumpOpenLoopState( void ) +{ + return RO_PUMP_OPEN_LOOP_STATE; } /*********************************************************************//** @@ -575,14 +600,13 @@ /*********************************************************************//** * @brief - * The getTargetROPumpPressure function gets the current target RO pump \n - * pressure. + * The getTargetROPumpFlowRate function gets the current target RO pump \n + * flow rate * @details - * Inputs : targetROPumpPressure - * Outputs : none - * @return the current target RO pressure (in PSI). + * Inputs : targetROPumpFlowRate + * Outputs : targetROPumpFlowRate + * @return the current target RO flow rate (in LPM). *************************************************************************/ -//U32 getTargetROPumpPressure( void ) F32 getTargetROPumpFlowRate( void ) { F32 result = targetROPumpFlowRate.data; @@ -714,29 +738,14 @@ /*********************************************************************//** * @brief - * The testSetTargetROPumpPressureOverride function overrides the target \n - * RO pressure. \n + * The testSetTargetROPumpFlowRateOverride function overrides the target \n + * RO flow rate. \n * @details - * Inputs : none + * Inputs : targetROPumpFlowRate * Outputs : targetROPumpPressure - * @param value : override target RO pressure (in PSI) + * @param value : override target RO flow rate (in LPM) * @return TRUE if override successful, FALSE if not *************************************************************************/ -BOOL testSetTargetROPumpPressureOverride( U32 value ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - targetROPumpPressure.ovInitData = targetROPumpPressure.data; // backup current target pressure - targetROPumpPressure.ovData = value; - targetROPumpPressure.override = OVERRIDE_KEY; - result = setROPumpTargetPressure( value, roPumpControlMode ); - } - - return result; -} - BOOL testSetTargetROPumpFlowRateOverride( F32 value ) { BOOL result = FALSE; @@ -751,7 +760,17 @@ return result; } - + +/*********************************************************************//** + * @brief + * The testResetTargetROPumpFlowRateOverride function resets the override of the \n + * target RO flow rate. + * @details + * Inputs : targetROPumpFlowRate + * Outputs : targetROPumpFlowRate + * @param none + * @return TRUE if override reset successful, FALSE if not + *************************************************************************/ BOOL testResetTargetROPumpFlowRateOverride( void ) { BOOL result = FALSE; @@ -770,32 +789,6 @@ /*********************************************************************//** * @brief - * The testResetTargetROPumpPressureOverride function resets the override of the \n - * target RO pressure. - * @details - * Inputs : none - * Outputs : targetROPumpPressure - * @param none - * @return TRUE if override reset successful, FALSE if not - *************************************************************************/ -BOOL testResetTargetROPumpPressureOverride( void ) -{ - BOOL result = FALSE; - - if ( TRUE == isTestingActivated() ) - { - targetROPumpPressure.data = targetROPumpPressure.ovInitData; // restore pre-override target pressure - targetROPumpPressure.override = OVERRIDE_RESET; - targetROPumpPressure.ovInitData = 0; - targetROPumpPressure.ovData = 0; - result = setROPumpTargetPressure( targetROPumpPressure.data, roPumpControlMode ); - } - - return result; -} - -/*********************************************************************//** - * @brief * The testSetMeasuredROFlowRateOverride function overrides the measured \n * RO flow rate. * @details Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u -r2510a84808ee5179d3f84f0b04f24c5a4122dbe5 -r1d235091e158221f1fa8b1579140905a13249a54 --- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 2510a84808ee5179d3f84f0b04f24c5a4122dbe5) +++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 1d235091e158221f1fa8b1579140905a13249a54) @@ -29,35 +29,28 @@ */ // ********** public definitions ********** +#define MAX_RO_FLOWRATE_LPM 1.2 ///< Maximum target RO flow rate (in LPM) +#define MIN_RO_FLOWRATE_LPM 0.2 ///< Minimum target RO flow rate (in LPM) -#define MAX_RO_PRESSURE 140 ///< Maximum target RO outlet pressure (in PSI). //TODO remove -#define MIN_RO_PRESSURE 100 ///< Minimum target RO outlet pressure (in PSI). //TODO remove - -#define MAX_RO_FLOWRATE_LPM 1.2 //TODO dara -#define MIN_RO_FLOWRATE_LPM 0.2 //TODO dara - // ********** public function prototypes ********** void initROPump( void ); void execROPumpMonitor( void ); void execROPumpController( void ); -BOOL setROPumpTargetPressure( U32 roPressure, PUMP_CONTROL_MODE_T mode ); //TODO remove - -BOOL setROPumpTargetFlowRate( F32 roFlowRate ); +BOOL setROPumpTargetFlowRate( F32 roFlowRate ); +BOOL setROPumpTargetPWM( U32 pwm ); void signalROPumpHardStop( void ); BOOL isReverseOsmosisPumpOn( void ); SELF_TEST_STATUS_T execROPumpTest( void ); -DATA_GET_PROTOTYPE( F32, getTargetROPumpFlowRate ); //TODO change the header -DATA_GET_PROTOTYPE( F32, getMeasuredROFlowRate ); //TODO change the header +DATA_GET_PROTOTYPE( F32, getTargetROPumpFlowRate ); +DATA_GET_PROTOTYPE( F32, getMeasuredROFlowRate ); BOOL testSetROPumpDataPublishIntervalOverride( U32 value ); BOOL testResetROPumpDataPublishIntervalOverride( void ); -BOOL testSetTargetROPumpPressureOverride( U32 value ); //TODO remove -BOOL testResetTargetROPumpPressureOverride( void ); //TODO remove BOOL testSetTargetROPumpFlowRateOverride( F32 value ); BOOL testResetTargetROPumpFlowRateOverride( void ); Index: firmware/App/Modes/ModeRecirculate.c =================================================================== diff -u -r8f5feed92f41a476d5656038bcdfe884e17bd593 -r1d235091e158221f1fa8b1579140905a13249a54 --- firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision 8f5feed92f41a476d5656038bcdfe884e17bd593) +++ firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision 1d235091e158221f1fa8b1579140905a13249a54) @@ -82,7 +82,7 @@ setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO ); - setROPumpTargetPressure( TARGET_RO_PRESSURE_PSI, PUMP_CONTROL_MODE_CLOSED_LOOP ); + setROPumpTargetFlowRate( 0.8 ); signalDrainPumpHardStop(); startPrimaryHeater(); // UV on Index: firmware/App/Services/SystemComm.c =================================================================== diff -u -r359cf587f2f935ef9f40a16d17c4105efa653c1d -r1d235091e158221f1fa8b1579140905a13249a54 --- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 359cf587f2f935ef9f40a16d17c4105efa653c1d) +++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 1d235091e158221f1fa8b1579140905a13249a54) @@ -1077,7 +1077,7 @@ handleTestROPumpDataBroadcastIntervalOverrideRequest( message ); break; - case MSG_ID_DRAIN_PUMP_SET_PT_OVERRIDE: + case MSG_ID_DRAIN_PUMP_SET_RPM_OVERRIDE: handleTestDrainPumpSetPointOverrideRequest( message ); break; @@ -1108,6 +1108,14 @@ handleTestHeatersDataPublishOverrideRequest ( message ); break; + case MSG_ID_RO_PUMP_SET_PWM: + handleSetROPumpPWM ( message ); + break; + + case MSG_ID_DRAIN_PUMP_SET_DELTA_PRESSURE_OVERRIDE: + handleSetDrainPumpDeltaPressureOverrideRequest ( message ); + break; + default: // TODO - unrecognized message ID received - ignore break; Index: firmware/App/Services/SystemCommMessages.c =================================================================== diff -u -r2510a84808ee5179d3f84f0b04f24c5a4122dbe5 -r1d235091e158221f1fa8b1579140905a13249a54 --- firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 2510a84808ee5179d3f84f0b04f24c5a4122dbe5) +++ firmware/App/Services/SystemCommMessages.c (.../SystemCommMessages.c) (revision 1d235091e158221f1fa8b1579140905a13249a54) @@ -96,7 +96,9 @@ typedef struct { U32 setDrainPumpSpeed; - U32 dacValue; + U32 dacValue; + F32 deltaPressure; + U32 drainPState; } DRAIN_PUMP_DATA_T; typedef struct @@ -557,10 +559,12 @@ * Inputs : none * Outputs : Drain pump data msg constructed and queued * @param tgtSpeed : target speed for drain pump in RPM. - * @param dac : set DAC value. + * @param dac : set DAC value. + * @param deltaP : Delta pressure for the sensors + * @param drainPumpState : The state of the drain pump * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ -BOOL broadcastDrainPumpData( U32 tgtSpeed, U32 dac ) +BOOL broadcastDrainPumpData( U32 tgtSpeed, U32 dac, F32 deltaP, U32 drainPumpState ) { BOOL result; MESSAGE_T msg; @@ -573,7 +577,9 @@ msg.hdr.payloadLen = sizeof( DRAIN_PUMP_DATA_T ); payload.setDrainPumpSpeed = tgtSpeed; - payload.dacValue = dac; + payload.dacValue = dac; + payload.deltaPressure = deltaP; + payload.drainPState = drainPumpState; memcpy( payloadPtr, &payload, sizeof( DRAIN_PUMP_DATA_T ) ); @@ -1021,7 +1027,31 @@ sendAckResponseMsg( (MSG_ID_T)message->hdr.msgID, COMM_BUFFER_OUT_CAN_DG_2_HD, result ); return result; -} +} + +/************************************************************************* + * @brief + * The handleSetROPumpPWM function handles the start of the RO pump with a\n + * PWM. The run is open loop + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return result + *************************************************************************/ +BOOL handleSetROPumpPWM( MESSAGE_T * message ) +{ + BOOL result = FALSE; + + if ( message->hdr.payloadLen == sizeof(U32) ) + { + U32 roPumpPWM; + memcpy( &roPumpPWM, message->payload, sizeof(U32) ); + result = setROPumpTargetPWM( roPumpPWM ); + } + + return result; +} /************************************************************************* * TEST SUPPORT FUNCTIONS @@ -1269,8 +1299,6 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -//DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestROPumpSetPointOverrideRequest, testSetTargetROPumpPressureOverride, testResetTargetROPumpPressureOverride ) //Todo remove - DATA_OVERRIDE_HANDLER_FUNC_U32( F32, handleTestROPumpSetPointOverrideRequest, testSetTargetROPumpFlowRateOverride, testResetTargetROPumpFlowRateOverride ) /************************************************************************* @@ -1355,4 +1383,16 @@ * @param message : a pointer to the message to handle * @return none *************************************************************************/ -DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDGSafetyShutdownOverrideRequest, testSetSafetyShutdownOverride, testResetSafetyShutdownOverride ) +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleTestDGSafetyShutdownOverrideRequest, testSetSafetyShutdownOverride, testResetSafetyShutdownOverride ) + +/************************************************************************* + * @brief + * The handleSetDrainPumpDeltaPressure function handles a \n + * request to override the delta pressure for the drain pump + * @details + * Inputs : none + * Outputs : message handled + * @param message : a pointer to the message to handle + * @return none + *************************************************************************/ +DATA_OVERRIDE_HANDLER_FUNC_U32( U32, handleSetDrainPumpDeltaPressureOverrideRequest, testSetTargetDrainPumpDeltaPressureOverride, testResetTargetDrainPumpDeltaPressureOverride ) Index: firmware/App/Services/SystemCommMessages.h =================================================================== diff -u -r2510a84808ee5179d3f84f0b04f24c5a4122dbe5 -r1d235091e158221f1fa8b1579140905a13249a54 --- firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 2510a84808ee5179d3f84f0b04f24c5a4122dbe5) +++ firmware/App/Services/SystemCommMessages.h (.../SystemCommMessages.h) (revision 1d235091e158221f1fa8b1579140905a13249a54) @@ -50,7 +50,7 @@ BOOL broadcastROPumpData( U32 tgtPressure, F32 measFlow, F32 setPWM, U32 pumpState ); // MSG_ID_DRAIN_PUMP_DATA -BOOL broadcastDrainPumpData( U32 tgtSpeed, U32 dac ); +BOOL broadcastDrainPumpData( U32 tgtSpeed, U32 dac, F32 deltaP, U32 drainPumpState ); // MSG_ID_DG_PRESSURES_DATA BOOL broadcastPressureSensorsData( F32 measROIn, F32 measROOut, F32 measDrainIn, F32 measDrainOut ); @@ -163,6 +163,12 @@ BOOL handleStartStopPrimaryHeater( MESSAGE_T *message ); // MSG_ID_START_STOP_DG_HEAT_DISINFECT -BOOL handleStartStopDGHeatDisinfect( MESSAGE_T *message ); +BOOL handleStartStopDGHeatDisinfect( MESSAGE_T *message ); + +// MSG_ID_SET_RO_PUMP_PWM +BOOL handleSetROPumpPWM( MESSAGE_T * message ); + +// MSG_ID_DRAIN_PUMP_SET_DELTA_PRESSURE_OVERRIDE +void handleSetDrainPumpDeltaPressureOverrideRequest( MESSAGE_T *message ); #endif