Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -r0953a2a6940f9f096fa98cc1e8a5578deab4d8ef -r92eb8fea402c19b6d250651f9e11b088c6d9efd1 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 0953a2a6940f9f096fa98cc1e8a5578deab4d8ef) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 92eb8fea402c19b6d250651f9e11b088c6d9efd1) @@ -46,6 +46,10 @@ #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_TARGET_DELTA_PRESSURE NEARLY_ZERO //TODO dara + /// Enumeration of drain pump states. typedef enum DrainPump_States { @@ -110,6 +114,11 @@ void initDrainPump( void ) { stopDrainPump(); + + // Initialize the drain pump + 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 ); } /*********************************************************************//** @@ -122,7 +131,7 @@ * @param rpm : new target drain pump speed (in RPM). * @return TRUE if new target speed is set, FALSE if not *************************************************************************/ -BOOL setDrainPumpTargetSpeed( U32 rpm ) +BOOL setDrainPumpTargetSpeed( U32 rpm, PUMP_CONTROL_MODE_T mode ) { BOOL result = FALSE; @@ -131,7 +140,7 @@ { drainPumpDAC = (U32)((F32)rpm * DRP_SPEED_RPM_TO_ADC_FACTOR + FLOAT_TO_INT_ROUNDUP_OFFSET); targetDrainPumpSpeed.data = rpm; - drainPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; + drainPumpControlMode = mode; result = TRUE; } @@ -234,6 +243,11 @@ 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 ); @@ -263,7 +277,12 @@ { if ( drainPumpControlModeSet == PUMP_CONTROL_MODE_CLOSED_LOOP ) { - // TODO - will drain pump have a 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, DRAIN_PUMP_TARGET_DELTA_PRESSURE, pressureDiff ); + drainPumpDAC = (U32)((F32)rpm * DRP_SPEED_RPM_TO_ADC_FACTOR + FLOAT_TO_INT_ROUNDUP_OFFSET); + setFPGADrainPumpSpeed( drainPumpDAC ); } drainControlTimerCounter = 0; } @@ -465,7 +484,7 @@ targetDrainPumpSpeed.ovInitData = targetDrainPumpSpeed.data; // backup current target pressure targetDrainPumpSpeed.ovData = value; targetDrainPumpSpeed.override = OVERRIDE_KEY; - result = setDrainPumpTargetSpeed( value ); + result = setDrainPumpTargetSpeed( value, PUMP_CONTROL_MODE_OPEN_LOOP ); } return result; @@ -490,7 +509,7 @@ targetDrainPumpSpeed.override = OVERRIDE_RESET; targetDrainPumpSpeed.ovInitData = 0; targetDrainPumpSpeed.ovData = 0; - result = setDrainPumpTargetSpeed( targetDrainPumpSpeed.data ); + result = setDrainPumpTargetSpeed( targetDrainPumpSpeed.data, PUMP_CONTROL_MODE_OPEN_LOOP ); } return result; Index: firmware/App/Controllers/DrainPump.h =================================================================== diff -u -r2496e9225fa1b2c627d625def02515a0f0dd5793 -r92eb8fea402c19b6d250651f9e11b088c6d9efd1 --- firmware/App/Controllers/DrainPump.h (.../DrainPump.h) (revision 2496e9225fa1b2c627d625def02515a0f0dd5793) +++ firmware/App/Controllers/DrainPump.h (.../DrainPump.h) (revision 92eb8fea402c19b6d250651f9e11b088c6d9efd1) @@ -38,7 +38,7 @@ void execDrainPumpMonitor( void ); void execDrainPumpController( void ); -BOOL setDrainPumpTargetSpeed( U32 rpm ); +BOOL setDrainPumpTargetSpeed( U32 rpm, PUMP_CONTROL_MODE_T mode ); void signalDrainPumpHardStop( void ); SELF_TEST_STATUS_T execDrainPumpTest( void ); Index: firmware/App/Controllers/ROPump.h =================================================================== diff -u -r1e044a958c655d09fed725cfbc9808319b642d13 -r92eb8fea402c19b6d250651f9e11b088c6d9efd1 --- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 1e044a958c655d09fed725cfbc9808319b642d13) +++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 92eb8fea402c19b6d250651f9e11b088c6d9efd1) @@ -32,8 +32,8 @@ #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 2000 -#define MIN_RO_FLOWRATE 300 +#define MAX_RO_FLOWRATE 2000 //TODO dara +#define MIN_RO_FLOWRATE 300 //TODO dara // ********** public function prototypes ********** Index: firmware/App/Modes/ModeDrain.c =================================================================== diff -u -rd8c4c523f0551a95c3c6ee5cf5b693f75161d163 -r92eb8fea402c19b6d250651f9e11b088c6d9efd1 --- firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision d8c4c523f0551a95c3c6ee5cf5b693f75161d163) +++ firmware/App/Modes/ModeDrain.c (.../ModeDrain.c) (revision 92eb8fea402c19b6d250651f9e11b088c6d9efd1) @@ -67,7 +67,7 @@ // set initial actuator states setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO ); - setDrainPumpTargetSpeed( TARGET_DRAIN_PUMP_RPM ); + setDrainPumpTargetSpeed( TARGET_DRAIN_PUMP_RPM, PUMP_CONTROL_MODE_OPEN_LOOP ); } /*********************************************************************//** @@ -123,7 +123,7 @@ // if we've reached our target drain to volume (by weight), we're done draining - go back to re-circ mode if ( getReservoirDrainVolumeTargetMl() >= getLoadCellFilteredWeight( drainWeightLoadCell ) ) { - setDrainPumpTargetSpeed( 0 ); + setDrainPumpTargetSpeed( 0, PUMP_CONTROL_MODE_OPEN_LOOP ); requestNewOperationMode( DG_MODE_CIRC ); } Index: firmware/App/Modes/ModeHeatDisinfect.c =================================================================== diff -u -r1e044a958c655d09fed725cfbc9808319b642d13 -r92eb8fea402c19b6d250651f9e11b088c6d9efd1 --- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 1e044a958c655d09fed725cfbc9808319b642d13) +++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 92eb8fea402c19b6d250651f9e11b088c6d9efd1) @@ -211,7 +211,7 @@ setValveState ( VRF, VALVE_STATE_R2_C_TO_NO ); setROPumpTargetPressure( 0, PUMP_CONTROL_MODE_CLOSED_LOOP ); - setDrainPumpTargetSpeed( 0 ); + setDrainPumpTargetSpeed( 0, PUMP_CONTROL_MODE_OPEN_LOOP ); stopInletUVReactor(); stopOutletUVReactor(); stopPrimaryHeater(); @@ -294,7 +294,7 @@ //TODO composition pumps setROPumpTargetPressure( 0, PUMP_CONTROL_MODE_CLOSED_LOOP ); - setDrainPumpTargetSpeed( 0 ); + setDrainPumpTargetSpeed( 0, PUMP_CONTROL_MODE_OPEN_LOOP ); stopInletUVReactor(); stopOutletUVReactor(); stopPrimaryHeater(); Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -r3cc737c39b4440e18abab95ef2f8b6aef13acba9 -r92eb8fea402c19b6d250651f9e11b088c6d9efd1 --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 3cc737c39b4440e18abab95ef2f8b6aef13acba9) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 92eb8fea402c19b6d250651f9e11b088c6d9efd1) @@ -56,6 +56,8 @@ { // Kp Ki uMax uMin ref meas err esw esum ctrl { 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_RO_PUMP + { 0.0, 0.0, 0.99, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // P_CONTROLLER_ID_RO_PUMP_RAMP_UP + { 0.0, 0.0, 3000, 300, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_DRAIN_PUMP { 0.0, 0.0, 0.89, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }, // PI_CONTROLLER_ID_PRIMARY_HEATER { 0.0, 0.0, 0.50, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 } // PI_CONTROLLER_ID_TRIMMER_HEATER }; Index: firmware/App/Services/PIControllers.h =================================================================== diff -u -r1e044a958c655d09fed725cfbc9808319b642d13 -r92eb8fea402c19b6d250651f9e11b088c6d9efd1 --- firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision 1e044a958c655d09fed725cfbc9808319b642d13) +++ firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision 92eb8fea402c19b6d250651f9e11b088c6d9efd1) @@ -33,7 +33,8 @@ typedef enum ControllerList { PI_CONTROLLER_ID_RO_PUMP = 0, ///< RO Pump controller. - P_CONTROLLER_ID_RO_PUMP_RAMP_UP, ///< RO Pump controller during ramp up time + P_CONTROLLER_ID_RO_PUMP_RAMP_UP, ///< RO Pump controller during ramp up time. + PI_CONTROLLER_ID_DRAIN_PUMP, ///< Drain Pump controller. PI_CONTROLLER_ID_PRIMARY_HEATER, ///< Primary Heater controller. PI_CONTROLLER_ID_TRIMMER_HEATER, ///< Trimmer Heater controller. NUM_OF_PI_CONTROLLERS_IDS ///< Number of PI controllers.