Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r2851a8bc8f6180634f47b96feb00e4c0054252d3 -r359cf587f2f935ef9f40a16d17c4105efa653c1d --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 2851a8bc8f6180634f47b96feb00e4c0054252d3) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 359cf587f2f935ef9f40a16d17c4105efa653c1d) @@ -65,17 +65,18 @@ #define RO_FLOW_ADC_TO_LPM_FACTOR 10909.0909 ///< conversion factor from ADC counts to LPM (liters/min) for RO flow rate (multiply this by inverse of FPGA reading). #define ROP_FLOW_TO_PWM_DC(flow) ((F32)(flow / 1000)) //TODO dara ///< Initial conversion factor from target flow rate to PWM duty cycle estimate -#define ROP_RAMP_UP_P_COEFFICIENT 0.009 //TODO dara -#define ROP_RAMP_UP_I_COEFFICIENT 0.00 //TODO dara -#define ROP_FLOW_TARGET_TOLERANCE 20U //TODO dara ///< Tolerance in between the target flow rate and the actual flow rate in mL +#define ROP_RAMP_UP_P_COEFFICIENT 0.0 //TODO dara +#define ROP_RAMP_UP_I_COEFFICIENT 0.09 //TODO dara +#define ROP_FLOW_TARGET_TOLERANCE 0.1 //TODO dara ///< Tolerance in between the target flow rate and the actual flow rate in mL /// Enumeration of RO pump states. typedef enum ROPump_States { - 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_CONTROL_TO_TARGET_STATE, ///< RO pump control to target pressure state. - NUM_OF_RO_PUMP_STATES ///< Number of RO pump states. + RO_PUMP_OFF_STATE = 0, ///< RO pump off state + RO_PUMP_OPEN_LOOP_STATE, ///< RO pump open loop state + RO_PUMP_RAMP_UP_STATE, ///< RO pump ramp up to target flow rate state + RO_PUMP_CONTROL_TO_TARGET_STATE, ///< RO pump control to target pressure state + NUM_OF_RO_PUMP_STATES ///< Number of RO pump states } RO_PUMP_STATE_T; /// Enumeration of RO pump self test states. @@ -91,7 +92,12 @@ // pin assignments for pump test DIP switch 0 #define RO_PUMP_TEST_SPI5_PORT_MASK 0x00000100 // (ENA - re-purposed as input GPIO) // dialIn pump stop and direction macros -#define GET_DIP_SW0_TEST() ( ( mibspiREG5->PC2 & RO_PUMP_TEST_SPI5_PORT_MASK ) != 0 ) +#define GET_DIP_SW0_TEST() ( ( mibspiREG5->PC2 & RO_PUMP_TEST_SPI5_PORT_MASK ) != 0 ) + +// TODO: Remove the below code. FOR TESTING ONLY +#define PRIMARY_HEATER_MIBSPI1_PORT_MASK 0x00000002 // (CS1 - re-purposed as input GPIO) +#define TOGGLEPUMP() (( mibspiREG1->PC2 & PRIMARY_HEATER_MIBSPI1_PORT_MASK ) != 0) +//TODO: Remove the above code. FOR TESTING ONLY // ********** private data ********** @@ -105,7 +111,7 @@ //static OVERRIDE_U32_T roPumpDataPublishInterval = { 0, 0, 0, 0 }; //From branch Remove ///< interval (in ms) at which to publish RO flow data to CAN bus. //static OVERRIDE_U32_T targetROPumpPressure = { 0, 0, 0, 0 }; //From branch ///< Target RO pressure (in PSI). //TODO remove -static OVERRIDE_U32_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 }; //From Branch ///< Target RO flow rate (in LPM_) // TODO dara 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). static OVERRIDE_F32_T measuredROFlowRateLPM = { 0.0, 0.0, 0.0, 0 }; ///< measured RO flow rate (in LPM). @@ -148,7 +154,7 @@ MIN_RO_PUMP_PWM_DUTY_CYCLE, MAX_RO_PUMP_PWM_DUTY_CYCLE ); // Initialize the P controller during ramp up - initializePIController( P_CONTROLLER_ID_RO_PUMP_RAMP_UP, MIN_RO_PUMP_PWM_DUTY_CYCLE, + 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 ); } @@ -190,15 +196,15 @@ return result; } -BOOL setROPumpTargetFlowRate( U32 roFlowRate, PUMP_CONTROL_MODE_T mode ) +BOOL setROPumpTargetFlowRate( F32 roFlowRate ) { BOOL result = FALSE; - if ( roFlowRate < MAX_RO_FLOWRATE && roFlowRate >= MIN_RO_FLOWRATE ) + if ( roFlowRate < MAX_RO_FLOWRATE_LPM && roFlowRate >= MIN_RO_FLOWRATE_LPM ) { targetROPumpFlowRate.data = roFlowRate; - roPumpControlMode = mode; - roPumpPWMDutyCyclePct = ROP_FLOW_TO_PWM_DC( roFlowRate ); + roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; + roPumpPWMDutyCyclePct = roFlowRate; } else // requested pressure out of range { @@ -218,7 +224,7 @@ *************************************************************************/ void signalROPumpHardStop( void ) { - targetROPumpPressure.data = 0; + targetROPumpFlowRate.data = 0; stopROPump(); roPumpState = RO_PUMP_OFF_STATE; roPumpPWMDutyCyclePct = 0.0; @@ -283,6 +289,9 @@ { case RO_PUMP_OFF_STATE: roPumpState = handleROPumpOffState(); + break; + + case RO_PUMP_OPEN_LOOP_STATE: break; case RO_PUMP_RAMP_UP_STATE: @@ -349,17 +358,18 @@ #endif } #endif -#endif +#endif - // If there is a + // If there is a flow, transition to P controller to get + // the corresponding pressure of that flow if ( getTargetROPumpFlowRate() > 0 ) { roPumpControlModeSet = roPumpControlMode; // set initial PWM duty cycle - roPumpPWMDutyCyclePctSet = roPumpPWMDutyCyclePct; + roPumpPWMDutyCyclePctSet = ROP_FLOW_TO_PWM_DC( getTargetROPumpFlowRate() ); setROPumpControlSignalPWM( roPumpPWMDutyCyclePctSet ); // reset controller - resetPIController( P_CONTROLLER_ID_RO_PUMP_RAMP_UP, roPumpPWMDutyCyclePctSet ); + resetPIController( I_CONTROLLER_ID_RO_PUMP_RAMP_UP, roPumpPWMDutyCyclePctSet ); // set pump to on isROPumpOn = TRUE; result = RO_PUMP_RAMP_UP_STATE; @@ -378,7 +388,8 @@ // set pump to on isROPumpOn = TRUE; result = RO_PUMP_CONTROL_TO_TARGET_STATE; - }*/ + }*/ + return result; } @@ -401,14 +412,14 @@ if ( fabs( actualFlowRate - targetFlowRate ) > ROP_FLOW_TARGET_TOLERANCE ) { - F32 newPWM = runPIController( P_CONTROLLER_ID_RO_PUMP_RAMP_UP, targetFlowRate, actualFlowRate ); + F32 newPWM = runPIController( I_CONTROLLER_ID_RO_PUMP_RAMP_UP, targetFlowRate, actualFlowRate ); roPumpPWMDutyCyclePctSet = newPWM; setROPumpControlSignalPWM( newPWM ); } else { // Reset the P controller for the flow rate - resetPIController( P_CONTROLLER_ID_RO_PUMP_RAMP_UP, MIN_RO_PUMP_PWM_DUTY_CYCLE ); + resetPIController( I_CONTROLLER_ID_RO_PUMP_RAMP_UP, MIN_RO_PUMP_PWM_DUTY_CYCLE ); tgtROPumpPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); roPumpControlModeSet = roPumpControlMode; @@ -442,18 +453,22 @@ // control at set interval if ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL ) { - if ( roPumpControlModeSet == PUMP_CONTROL_MODE_CLOSED_LOOP ) - { - F32 tgtPres = tgtROPumpPressure; - F32 actPres = measuredROPumpPressure; - F32 newPWM; + F32 actualPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET ); + + //if ( OVERRIDE_KEY == targetROPumpFlowRate.override ) + //{ + // targetFlowRate = targetROPumpFlowRate.ovData; + //} + F32 newPWM = runPIController( PI_CONTROLLER_ID_RO_PUMP, tgtROPumpPressure, actualPressure ); + roPumpPWMDutyCyclePctSet = newPWM; + setROPumpControlSignalPWM( newPWM ); -#ifndef EMC_TEST_BUILD +/*#ifndef EMC_TEST_BUILD newPWM = runPIController( PI_CONTROLLER_ID_RO_PUMP, tgtPres, actPres ); roPumpPWMDutyCyclePctSet = newPWM; setROPumpControlSignalPWM( newPWM ); -#endif - } +#endif*/ + roControlTimerCounter = 0; } @@ -537,9 +552,9 @@ * @return the current target RO pressure (in PSI). *************************************************************************/ //U32 getTargetROPumpPressure( void ) -U32 getTargetROPumpFlowRate( void ) +F32 getTargetROPumpFlowRate( void ) { - U32 result = targetROPumpFlowRate.data; + F32 result = targetROPumpFlowRate.data; if ( OVERRIDE_KEY == targetROPumpFlowRate.override ) { @@ -692,7 +707,7 @@ return result; } -BOOL testSetTargetROPumpFlowRateOverride( U32 value ) +BOOL testSetTargetROPumpFlowRateOverride( F32 value ) { BOOL result = FALSE; @@ -701,7 +716,7 @@ targetROPumpFlowRate.ovInitData = targetROPumpFlowRate.data; // backup current target pressure targetROPumpFlowRate.ovData = value; targetROPumpFlowRate.override = OVERRIDE_KEY; - result = setROPumpTargetFlowRate( value, roPumpControlMode ); + result = setROPumpTargetFlowRate( value ); } return result; @@ -717,7 +732,7 @@ targetROPumpFlowRate.override = OVERRIDE_RESET; targetROPumpFlowRate.ovInitData = 0; targetROPumpFlowRate.ovData = 0; - result = setROPumpTargetFlowRate( targetROPumpFlowRate.data, roPumpControlMode ); + result = setROPumpTargetFlowRate( targetROPumpFlowRate.data ); } return result;