Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r27566fb95c3865851e3b0b4bd4668474bfdbfcde -re2d09e0a1c6f25daeaff44bbb2e2ca98f6221c5e --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 27566fb95c3865851e3b0b4bd4668474bfdbfcde) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision e2d09e0a1c6f25daeaff44bbb2e2ca98f6221c5e) @@ -70,6 +70,11 @@ static F32 roPumpDutyCyclePctSet; ///< Currently set RO pump PWM duty cycle. static OVERRIDE_F32_T roPumpOpenLoopTargetDutyCycle; ///< Target RO pump open loop PWM. +static U32 backupROPumpFlowRate = 0; +static F32 backupROPumpPressure = 0.0F; +static F32 backupROPumpDutyCyclePctSet = 0.0F; +static BOOL backupSet = FALSE; + // ********** private function prototypes ********** static RO_PUMP_STATE_T handleROPumpOffState( void ); @@ -185,31 +190,32 @@ RO_PUMP_STATE_T state = RO_PUMP_OFF_STATE; isROPumpOn = FALSE; - // If there is a target pressure set, transition to the PI controller and control to pressure. - if ( ( getTargetROPumpPressure() > 0.0F ) && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) + // If there is a target flow set, transition to the PI controller and control to flow + if ( getTargetROPumpFlowRateMLPM() > 0 ) { // Set pump to on isROPumpOn = TRUE; - roPumpDutyCyclePctSet = roPumpPresToPWM( getTargetROPumpPressure() ); + roPumpDutyCyclePctSet = roPumpFlowToPWM( getTargetROPumpFlowRateMLPM() ); setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); - state = RO_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE; + state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } - - // If there is a target flow set, transition to the PI controller and control to flow - else if ( ( getTargetROPumpFlowRateMLPM() > 0 ) && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) + // If there is a target pressure set, transition to the PI controller and control to pressure. + else if ( getTargetROPumpPressure() > 0.0F ) { // Set pump to on isROPumpOn = TRUE; - roPumpDutyCyclePctSet = roPumpFlowToPWM( getTargetROPumpFlowRateMLPM() ); + roPumpDutyCyclePctSet = roPumpPresToPWM( getTargetROPumpPressure() ); setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); - state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; + state = RO_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE; } + + // If the target duty cycle is greater than zero (minimum is 10%) and the mode has been set to open // loop, set the duty cycle - else if ( ( getTargetROPumpDutyCyclePCT() > 0.0F ) && ( PUMP_CONTROL_MODE_OPEN_LOOP == roPumpControlMode ) ) + else if ( getTargetROPumpDutyCyclePCT() > 0.0F ) { - setFluidPumpPctToPWMDutyCycle( P12_PUMP, getTargetROPumpDutyCyclePCT() ); roPumpDutyCyclePctSet = getTargetROPumpDutyCyclePCT(); + setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); isROPumpOn = TRUE; state = RO_PUMP_OPEN_LOOP_STATE; } @@ -233,24 +239,23 @@ if ( TRUE == stopPumpRequest ) { stopPumpRequest = FALSE; - state = RO_PUMP_OFF_STATE; + signalROPumpHardStop(); } + // If there is a target flow set, transition to the PI controller and control to flow + else if ( getTargetROPumpFlowRateMLPM() > 0 ) + { + ///transition to closed loop + resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, getTargetROPumpDutyCyclePCT(), 0 ); + state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; + } // If there is a target pressure set, transition to the PI controller and control to pressure. - if ( ( getTargetROPumpPressure() > 0.0F ) && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) + else if ( getTargetROPumpPressure() > 0.0F ) { //transition to closed loop resetPIController( PI_CONTROLLER_ID_RO_PUMP_PRES, getTargetROPumpDutyCyclePCT(), 0 ); state = RO_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE; } - // If there is a target flow set, transition to the PI controller and control to flow - else if ( ( getTargetROPumpFlowRateMLPM() > 0 ) && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) - { - ///transition to closed loop - resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, getTargetROPumpDutyCyclePCT(), 0 ); - state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; - } - return state; } @@ -266,27 +271,32 @@ { RO_PUMP_STATE_T state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; + if ( TRUE == stopPumpRequest ) + { + stopPumpRequest = FALSE; + signalROPumpHardStop(); + } // Check if need to switch control modes - if ( ( getTargetROPumpPressure() > 0.0F ) && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) + else if ( getTargetROPumpPressure() > 0.0F ) { // Transition to target pressure resetPIController( PI_CONTROLLER_ID_RO_PUMP_PRES, roPumpDutyCyclePctSet, 0 ); state = RO_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE; } - else if ( ( getTargetROPumpDutyCyclePCT() > 0.0F ) && ( PUMP_CONTROL_MODE_OPEN_LOOP == roPumpControlMode ) ) + else if ( getTargetROPumpDutyCyclePCT() > 0.0F ) { - setFluidPumpPctToPWMDutyCycle( P12_PUMP, getTargetROPumpDutyCyclePCT() ); roPumpDutyCyclePctSet = getTargetROPumpDutyCyclePCT(); + setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); state = RO_PUMP_OPEN_LOOP_STATE; } // Control at set interval or shut off - if ( ( (F32)getTargetROPumpFlowRateMLPM() == 0.0F ) && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) +// else if ( (F32)getTargetROPumpFlowRateMLPM() == 0.0F ) +// { +// signalROPumpHardStop(); +// } + else if ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL ) { - signalROPumpHardStop(); - } - else if ( ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL ) && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) - { roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, (F32)getTargetROPumpFlowRateMLPM(), getFilteredFlow( P16_FLOW ) ); setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); roControlTimerCounter = 0; @@ -307,26 +317,31 @@ { RO_PUMP_STATE_T state = RO_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE; + if ( TRUE == stopPumpRequest ) + { + stopPumpRequest = FALSE; + signalROPumpHardStop(); + } // Check if we are changing control - if ( ( getTargetROPumpFlowRateMLPM() > 0 ) && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) + else if ( getTargetROPumpFlowRateMLPM() > 0 ) { resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0 ); state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } - else if ( ( getTargetROPumpDutyCyclePCT() > 0.0F ) && ( PUMP_CONTROL_MODE_OPEN_LOOP == roPumpControlMode ) ) + else if ( getTargetROPumpDutyCyclePCT() > 0.0F ) { setFluidPumpPctToPWMDutyCycle( P12_PUMP, getTargetROPumpDutyCyclePCT() ); roPumpDutyCyclePctSet = getTargetROPumpDutyCyclePCT(); state = RO_PUMP_OPEN_LOOP_STATE; } // Control at set interval or shut off - if ( ( getTargetROPumpPressure() == 0.0F ) && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) +// else if ( getTargetROPumpPressure() == 0.0F ) +// { +// signalROPumpHardStop(); +// } + else if ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL ) { - signalROPumpHardStop(); - } - else if ( ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL ) && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) - { roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP_PRES, getTargetROPumpPressure(), getFilteredPressure( P17_PRES ) ); setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); roControlTimerCounter = 0; @@ -352,24 +367,37 @@ // First of all, the flow rate must be in range if ( ( roFlowRate <= MAX_RO_FLOWRATE_MLPM ) && ( roFlowRate >= MIN_RO_FLOWRATE_MLPM ) ) { + if ( targetROPumpFlowRate.override != OVERRIDE_RESET ) + { + if (!backupSet) + { + backupROPumpFlowRate = targetROPumpFlowRate.data; + backupROPumpPressure = targetROPumpPressure.data; + backupROPumpDutyCyclePctSet = roPumpOpenLoopTargetDutyCycle.data; + backupSet = TRUE; + } + // Clear previous target data + if ( getTargetROPumpPressure() > 0.0F ) + { + targetROPumpPressure.data = 0.0F; + } + if ( getTargetROPumpDutyCyclePCT() > 0.0F ) + { + roPumpOpenLoopTargetDutyCycle.data = 0.0F; + } + } targetROPumpFlowRate.data = roFlowRate; - roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; // Get the initial guess of the duty cycle roPumpDutyCyclePctSet = roPumpFlowToPWM( getTargetROPumpFlowRateMLPM() ); roControlTimerCounter = 0; isROPumpOn = TRUE; - - // Clear previous target data - if ( getTargetROPumpPressure() > 0.0F ) - { - targetROPumpPressure.data = 0.0F; - } - if ( getTargetROPumpDutyCyclePCT() > 0.0F ) - { - roPumpOpenLoopTargetDutyCycle.data = 0.0F; - } result = TRUE; } +// else if ( roFlowRate == 0 ) +// { +// stopPumpRequest = TRUE; +// result = TRUE; +// } // Requested flow rate is out of range else { @@ -396,23 +424,38 @@ // First of all, the pressure must be in range if ( ( roPressure <= MAX_RO_PRESSURE_PSI ) && ( roPressure >= MIN_RO_PRESSURE_PSI ) ) { + if ( targetROPumpPressure.override != OVERRIDE_RESET ) + { + if (!backupSet) + { + backupROPumpFlowRate = targetROPumpFlowRate.data; + backupROPumpPressure = targetROPumpPressure.data; + backupROPumpDutyCyclePctSet = roPumpOpenLoopTargetDutyCycle.data; + backupSet = TRUE; + } + // Clear previous target data + if ( getTargetROPumpFlowRateMLPM() > 0 ) + { + targetROPumpFlowRate.data = 0; + } + if ( getTargetROPumpDutyCyclePCT() > 0.0F ) + { + roPumpOpenLoopTargetDutyCycle.data = 0.0F; + } + } targetROPumpPressure.data = roPressure; - roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP; // Get the initial guess of the duty cycle roPumpDutyCyclePctSet = roPumpPresToPWM( getTargetROPumpPressure() ); roControlTimerCounter = 0; isROPumpOn = TRUE; - // Clear previous target data - if ( getTargetROPumpFlowRateMLPM() > 0 ) - { - targetROPumpFlowRate.data = 0; - } - if ( getTargetROPumpDutyCyclePCT() > 0.0F ) - { - roPumpOpenLoopTargetDutyCycle.data = 0.0F; - } result = TRUE; } + else if ( roPressure == 0.0F ) + { + stopPumpRequest = TRUE; + result = TRUE; + } + // Requested flow rate is out of range else { @@ -435,32 +478,48 @@ *************************************************************************/ BOOL setROPumpTargetDutyCycle( F32 dutyCycle ) { - BOOL status = FALSE; + BOOL result = FALSE; if ( ( dutyCycle >= MIN_FLUID_PUMP_DUTY_CYCLE_PCT ) && ( dutyCycle <= MAX_FLUID_PUMP_DUTY_CYCLE_PCT ) ) { - roPumpOpenLoopTargetDutyCycle.data = dutyCycle; - roPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; - status = TRUE; - // Set the new duty cycle of the pump - setFluidPumpPctToPWMDutyCycle( P12_PUMP, getTargetROPumpDutyCyclePCT() ); - // Clear previous target data - if ( getTargetROPumpFlowRateMLPM() > 0 ) + if ( roPumpOpenLoopTargetDutyCycle.override != OVERRIDE_RESET ) { - targetROPumpFlowRate.data = 0; + if (!backupSet) + { + backupROPumpFlowRate = targetROPumpFlowRate.data; + backupROPumpPressure = targetROPumpPressure.data; + backupROPumpDutyCyclePctSet = roPumpOpenLoopTargetDutyCycle.data; + backupSet = TRUE; + } + // Clear previous target data + if ( getTargetROPumpFlowRateMLPM() > 0 ) + { + targetROPumpFlowRate.data = 0; + } + if ( getTargetROPumpPressure() > 0.0F ) + { + targetROPumpPressure.data = 0.0F; + } + } - if ( getTargetROPumpPressure() > 0.0F ) - { - targetROPumpPressure.data = 0.0F; - } + // Set the new duty cycle of the pump + roPumpOpenLoopTargetDutyCycle.data = dutyCycle; + result = TRUE; + + setFluidPumpPctToPWMDutyCycle( P12_PUMP, getTargetROPumpDutyCyclePCT() ); } + else if ( dutyCycle == 0.0F ) + { + stopPumpRequest = TRUE; + result = TRUE; + } else { SET_ALARM_WITH_2_F32_DATA( ALARM_ID_FP_SOFTWARE_FAULT, SW_FAULT_ID_FP_INVALID_PUMP_DUTY_CYCLE_SELECTED, dutyCycle ) } - return status; + return result; } /*********************************************************************//** @@ -581,7 +640,6 @@ roPumpDutyCyclePctSet = 0.0F; roControlTimerCounter = 0; roPumpOpenLoopTargetDutyCycle.data = 0.0F; - stopPumpRequest = TRUE; stopROPump(); } @@ -678,7 +736,14 @@ BOOL testROPumpTargetPressureOverride( MESSAGE_T *message ) { BOOL result = f32Override( message, &targetROPumpPressure ); - + if ( targetROPumpPressure.override == OVERRIDE_RESET && backupSet ) + { + // Restore previous flow and pressure values + targetROPumpFlowRate.data = backupROPumpFlowRate; + targetROPumpPressure.data = backupROPumpPressure; + roPumpOpenLoopTargetDutyCycle.data = backupROPumpDutyCyclePctSet; + backupSet = FALSE; + } setROPumpTargetPressure(getTargetROPumpPressure()); return result; @@ -697,7 +762,14 @@ BOOL testROPumpTargetFlowOverride( MESSAGE_T *message ) { BOOL result = u32Override( message, &targetROPumpFlowRate, MIN_RO_FLOWRATE_MLPM, MAX_RO_FLOWRATE_MLPM ); - + if ( targetROPumpFlowRate.override == OVERRIDE_RESET && backupSet ) + { + // Restore previous flow and pressure values + targetROPumpFlowRate.data = backupROPumpFlowRate; + targetROPumpPressure.data = backupROPumpPressure; + roPumpOpenLoopTargetDutyCycle.data = backupROPumpDutyCyclePctSet; + backupSet = FALSE; + } setROPumpTargetFlowRateMLPM(getTargetROPumpFlowRateMLPM()); return result; @@ -716,7 +788,15 @@ BOOL testROPumpTargetDutyCycleOverride( MESSAGE_T *message ) { BOOL result = f32Override( message, &roPumpOpenLoopTargetDutyCycle ); + if ( roPumpOpenLoopTargetDutyCycle.override == OVERRIDE_RESET && backupSet ) + { + // Restore previous flow and pressure values + targetROPumpFlowRate.data = backupROPumpFlowRate; + targetROPumpPressure.data = backupROPumpPressure; + roPumpOpenLoopTargetDutyCycle.data = backupROPumpDutyCyclePctSet; + backupSet = FALSE; + } setROPumpTargetDutyCycle(getTargetROPumpDutyCyclePCT()); return result;