Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r19934ca6e36e2dcabd6a6083a9a1f15b1ed32189 -r7104ce1a12799c5a3dff10c94cb191d409bc8244 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 19934ca6e36e2dcabd6a6083a9a1f15b1ed32189) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 7104ce1a12799c5a3dff10c94cb191d409bc8244) @@ -130,6 +130,18 @@ static F32 roPumpOpenLoopTargetDutyCycle; ///< Target RO pump open loop PWM. static F32 roVolumeL; ///< RO water generated in liters. + +static DG_OP_MODE_T lastDGOperationMode; +static DG_OP_MODE_T currentDGOperationMode; + +static PI_CONTROLLER_PROFILE_DATA_T roFlushPIProfile = { ROP_FLOW_CONTROL_P_COEFFICIENT, ROP_FLOW_CONTROL_I_COEFFICIENT, MIN_RO_PUMP_DUTY_CYCLE, MAX_RO_PUMP_DUTY_CYCLE }; +static PI_CONTROLLER_PROFILE_DATA_T roFillPIProfile = { ROP_FLOW_CONTROL_P_COEFFICIENT, ROP_FLOW_CONTROL_I_COEFFICIENT, MIN_RO_PUMP_DUTY_CYCLE, MAX_RO_PUMP_DUTY_CYCLE }; +static PI_CONTROLLER_PROFILE_DATA_T roDrainPIProfile = { ROP_FLOW_CONTROL_P_COEFFICIENT, ROP_FLOW_CONTROL_I_COEFFICIENT, MIN_RO_PUMP_DUTY_CYCLE, MAX_RO_PUMP_DUTY_CYCLE }; +static PI_CONTROLLER_PROFILE_DATA_T roHeatPIProfile = { ROP_FLOW_CONTROL_P_COEFFICIENT, ROP_FLOW_CONTROL_I_COEFFICIENT, MIN_RO_PUMP_DUTY_CYCLE, MAX_RO_PUMP_DUTY_CYCLE }; +static PI_CONTROLLER_PROFILE_DATA_T roGenIdlePIProfile = { ROP_FLOW_CONTROL_P_COEFFICIENT, ROP_FLOW_CONTROL_I_COEFFICIENT, MIN_RO_PUMP_DUTY_CYCLE, MAX_RO_PUMP_DUTY_CYCLE }; + + + // ********** private function prototypes ********** static RO_PUMP_STATE_T handleROPumpOffState( void ); @@ -404,6 +416,7 @@ *************************************************************************/ void execROPumpController( void ) { + currentDGOperationMode = getCurrentOperationMode(); // Handle pending delayed RO pump command if ( pendingROPumpCmdCountDown > 0 ) { @@ -451,6 +464,7 @@ roPumpState = RO_PUMP_OFF_STATE; break; } + lastDGOperationMode = currentDGOperationMode; } /*********************************************************************//** @@ -647,6 +661,30 @@ } else { + if(currentDGOperationMode != lastDGOperationMode) + { + switch( currentDGOperationMode ) + { + case DG_MODE_GENE: + setPIControlerProfile( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, roGenIdlePIProfile); + break; + case DG_MODE_FILL: + setPIControlerProfile( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, roFillPIProfile); + break; + case DG_MODE_DRAI: + setPIControlerProfile( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, roDrainPIProfile); + break; + case DG_MODE_FLUS: + setPIControlerProfile( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, roFlushPIProfile); + break; + case DG_MODE_HEAT: + setPIControlerProfile( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, roHeatPIProfile); + break; + default: + // Alarm? Fault? continue running? + break; + } + } roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, getTargetROPumpFlowRateLPM(), getMeasuredFlowRateLPM( RO_FLOW_SENSOR ) ); } Index: firmware/App/Services/PIControllers.c =================================================================== diff -u -ra9315539f527b92523b1598ff91e47db4d71dae2 -r7104ce1a12799c5a3dff10c94cb191d409bc8244 --- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision a9315539f527b92523b1598ff91e47db4d71dae2) +++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 7104ce1a12799c5a3dff10c94cb191d409bc8244) @@ -282,4 +282,15 @@ return output; } + +/* + * reset needs to be called. + */ + +void setPIControlerProfile( PI_CONTROLLER_ID_T controllerID, F32 initialControlSignal, PI_CONTROLLER_PROFILE_DATA_T profile) +{ + initializePIController(controllerID, initialControlSignal, + profile.Kp,profile.Ki,profile.uMin,profile.uMax); +} + /**@}*/ Index: firmware/App/Services/PIControllers.h =================================================================== diff -u -ra9315539f527b92523b1598ff91e47db4d71dae2 -r7104ce1a12799c5a3dff10c94cb191d409bc8244 --- firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision a9315539f527b92523b1598ff91e47db4d71dae2) +++ firmware/App/Services/PIControllers.h (.../PIControllers.h) (revision 7104ce1a12799c5a3dff10c94cb191d409bc8244) @@ -53,14 +53,25 @@ NUM_OF_CONTROLLER_SIGNAL ///< Number of PI controller signals } PI_CONTROLLER_SIGNALS_ID; +typedef struct ControllerProfile +{ + F32 Kp; ///< Proportional Value. + F32 Ki; ///< Integral Value. + F32 uMin; ///< Minimum control signal. + F32 uMax; ///< Maximum control signal. +} PI_CONTROLLER_PROFILE_DATA_T; + + // ********** public function prototypes ********** void initializePIController( PI_CONTROLLER_ID_T controllerID, F32 initialControlSignal, F32 kP, F32 kI, F32 controlMin, F32 controlMax ); void resetPIController( PI_CONTROLLER_ID_T controllerID, F32 initialControlSignal ); F32 runPIController( PI_CONTROLLER_ID_T controllerID, F32 referenceSignal, F32 measuredSignal ); F32 getPIControllerSignals( PI_CONTROLLER_ID_T controllerID, PI_CONTROLLER_SIGNALS_ID signalID ); +void setPIControlerProfile( PI_CONTROLLER_ID_T controllerID, F32 initialControlSignal, PI_CONTROLLER_PROFILE_DATA_T profile); + /**@}*/ #endif