Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r6d85a90d2325163e936055a620a8b6aa1a6db65a -r75ccce259b4eb255d089f48aecb199274d7298ae --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 6d85a90d2325163e936055a620a8b6aa1a6db65a) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 75ccce259b4eb255d089f48aecb199274d7298ae) @@ -67,6 +67,7 @@ static F32 roPumpDutyCyclePctSet; ///< Currently set RO pump PWM duty cycle. static OVERRIDE_F32_T roPumpOpenLoopTargetDutyCycle; ///< Target RO pump open loop PWM. + // ********** private function prototypes ********** static RO_PUMP_STATE_T handleROPumpOffState( void ); @@ -182,33 +183,34 @@ 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 ( targetROPumpFlowRate.data > 0 ) { // Set pump to on isROPumpOn = TRUE; - roPumpDutyCyclePctSet = roPumpPresToPWM( getTargetROPumpPressure() ); - resetPIController( PI_CONTROLLER_ID_RO_PUMP_PRES, roPumpDutyCyclePctSet, 0.0F ); + roPumpDutyCyclePctSet = roPumpFlowToPWM( getTargetROPumpFlowRateMLPM() ); + resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0.0F ); 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 ( targetROPumpPressure.data > 0.0F ) { // Set pump to on isROPumpOn = TRUE; - roPumpDutyCyclePctSet = roPumpFlowToPWM( getTargetROPumpFlowRateMLPM() ); - resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0.0F ); + roPumpDutyCyclePctSet = roPumpPresToPWM( getTargetROPumpPressure() ); + resetPIController( PI_CONTROLLER_ID_RO_PUMP_PRES, roPumpDutyCyclePctSet, 0.0F ); 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 ( roPumpOpenLoopTargetDutyCycle.data > 0.0F ) { - setFluidPumpPctToPWMDutyCycle( P12_PUMP, getTargetROPumpDutyCyclePCT() ); roPumpDutyCyclePctSet = getTargetROPumpDutyCyclePCT(); + setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); isROPumpOn = TRUE; state = RO_PUMP_OPEN_LOOP_STATE; } @@ -232,24 +234,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 ( targetROPumpFlowRate.data > 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 ( targetROPumpPressure.data > 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; } @@ -265,27 +266,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 ( targetROPumpPressure.data > 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 ( roPumpOpenLoopTargetDutyCycle.data > 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; @@ -306,26 +312,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 ( targetROPumpFlowRate.data > 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 ( roPumpOpenLoopTargetDutyCycle.data > 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; @@ -351,22 +362,44 @@ // First of all, the flow rate must be in range if ( ( roFlowRate <= MAX_RO_FLOWRATE_MLPM ) && ( roFlowRate >= MIN_RO_FLOWRATE_MLPM ) ) { + // Backup the initial data and Set the pressure and duty cycle to zero + if ( targetROPumpFlowRate.override != OVERRIDE_RESET ) + { + if ( targetROPumpFlowRate.ovInitData == 0 ) + { + targetROPumpFlowRate.ovInitData = targetROPumpFlowRate.data; + } + + if ( targetROPumpPressure.data > 0.0 ) + { + if ( targetROPumpPressure.override != OVERRIDE_RESET ) + { + targetROPumpPressure.data = 0.0; + } + else + { + targetROPumpPressure.ovInitData = targetROPumpPressure.data; + targetROPumpPressure.data = 0.0; + } + } + if ( roPumpOpenLoopTargetDutyCycle.data > 0.0 ) + { + if ( roPumpOpenLoopTargetDutyCycle.override != OVERRIDE_RESET ) + { + roPumpOpenLoopTargetDutyCycle.data = 0.0; + } + else + { + roPumpOpenLoopTargetDutyCycle.ovInitData = roPumpOpenLoopTargetDutyCycle.data; + roPumpOpenLoopTargetDutyCycle.data = 0.0; + } + } + } 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; } // Requested flow rate is out of range @@ -395,23 +428,51 @@ // First of all, the pressure must be in range if ( ( roPressure <= MAX_RO_PRESSURE_PSI ) && ( roPressure >= MIN_RO_PRESSURE_PSI ) ) { + // Backup the initial data and Set the flow rate and duty cycle to zero + if ( targetROPumpPressure.override != OVERRIDE_RESET ) + { + targetROPumpPressure.ovInitData = targetROPumpPressure.data; + if ( targetROPumpFlowRate.data > 0 ) + { + if ( targetROPumpFlowRate.ovInitData == 0 ) + { + targetROPumpFlowRate.ovInitData = targetROPumpFlowRate.data; + targetROPumpFlowRate.data = 0; + } + else + { + targetROPumpFlowRate.data = 0; + } + } + if ( roPumpOpenLoopTargetDutyCycle.data > 0.0 ) + { + if ( roPumpOpenLoopTargetDutyCycle.ovInitData == 0.0 ) + { + roPumpOpenLoopTargetDutyCycle.ovInitData = roPumpOpenLoopTargetDutyCycle.data; + roPumpOpenLoopTargetDutyCycle.data = 0.0; + } + else + { + roPumpOpenLoopTargetDutyCycle.data = 0.0; + } + } + } 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 ) + result = TRUE; + } + else if ( roPressure == 0.0F ) + { + result = TRUE; + if ( ( targetROPumpFlowRate.data == 0 ) && ( roPumpOpenLoopTargetDutyCycle.data == 0.0 ) ) { - targetROPumpFlowRate.data = 0; + stopPumpRequest = TRUE; } - if ( getTargetROPumpDutyCyclePCT() > 0.0F ) - { - roPumpOpenLoopTargetDutyCycle.data = 0.0F; - } - result = TRUE; } + // Requested flow rate is out of range else { @@ -434,32 +495,61 @@ *************************************************************************/ 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; - + // Backup the initial data and Set the pressure and flow rate to zero + if ( roPumpOpenLoopTargetDutyCycle.override != OVERRIDE_RESET ) + { + if ( roPumpOpenLoopTargetDutyCycle.ovInitData == 0 ) + { + roPumpOpenLoopTargetDutyCycle.ovInitData = roPumpOpenLoopTargetDutyCycle.data; + } + if ( targetROPumpFlowRate.data > 0 ) + { + if ( targetROPumpFlowRate.override != OVERRIDE_RESET ) + { + targetROPumpFlowRate.data = 0; + } + else + { + targetROPumpFlowRate.ovInitData = targetROPumpFlowRate.data; + targetROPumpFlowRate.data = 0; + } + } + if ( targetROPumpPressure.data > 0.0 ) + { + if ( targetROPumpPressure.override != OVERRIDE_RESET ) + { + targetROPumpPressure.data = 0.0; + } + else + { + targetROPumpPressure.ovInitData = targetROPumpPressure.data; + targetROPumpPressure.data = 0.0; + } + } + } // Set the new duty cycle of the pump + roPumpOpenLoopTargetDutyCycle.data = dutyCycle; + result = TRUE; setFluidPumpPctToPWMDutyCycle( P12_PUMP, getTargetROPumpDutyCyclePCT() ); - // Clear previous target data - if ( getTargetROPumpFlowRateMLPM() > 0 ) + } + else if ( dutyCycle == 0.0F ) + { + result = TRUE; + if ( ( targetROPumpFlowRate.data == 0 ) && ( targetROPumpPressure.data == 0.0 ) ) { - targetROPumpFlowRate.data = 0; + stopPumpRequest = TRUE; } - if ( getTargetROPumpPressure() > 0.0F ) - { - targetROPumpPressure.data = 0.0F; - } } 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; } /*********************************************************************//** @@ -580,7 +670,6 @@ roPumpDutyCyclePctSet = 0.0F; roControlTimerCounter = 0; roPumpOpenLoopTargetDutyCycle.data = 0.0F; - stopPumpRequest = TRUE; stopROPump(); } @@ -676,8 +765,33 @@ *************************************************************************/ BOOL testROPumpTargetPressureOverride( MESSAGE_T *message ) { - BOOL result = f32Override( message, &targetROPumpPressure ); + TEST_OVERRIDE_PAYLOAD_T payload; + OVERRIDE_TYPE_T ovType = getOverridePayloadFromMessage( message, &payload ); + if ( ovType == OVERRIDE_RESET_OVERRIDE ) + { + // Restore previous flow, duty cycle and pressure values + targetROPumpPressure.data = targetROPumpPressure.ovInitData; + targetROPumpPressure.ovInitData = 0.0; + if ( roPumpOpenLoopTargetDutyCycle.override == OVERRIDE_RESET ) // isTargetDutyCycleActive + { + roPumpOpenLoopTargetDutyCycle.data = roPumpOpenLoopTargetDutyCycle.ovInitData; + } + else + { + roPumpOpenLoopTargetDutyCycle.data = roPumpOpenLoopTargetDutyCycle.ovData; + } + if ( targetROPumpFlowRate.override == OVERRIDE_RESET ) // isTargetFlowActive + { + targetROPumpFlowRate.data = targetROPumpFlowRate.ovInitData; + } + else + { + targetROPumpFlowRate.data = targetROPumpFlowRate.ovData; + } + } + + BOOL result = f32Override( message, &targetROPumpPressure ); setROPumpTargetPressure(getTargetROPumpPressure()); return result; @@ -695,8 +809,33 @@ *************************************************************************/ BOOL testROPumpTargetFlowOverride( MESSAGE_T *message ) { - BOOL result = u32Override( message, &targetROPumpFlowRate, MIN_RO_FLOWRATE_MLPM, MAX_RO_FLOWRATE_MLPM ); + TEST_OVERRIDE_PAYLOAD_T payload; + OVERRIDE_TYPE_T ovType = getOverridePayloadFromMessage( message, &payload ); + if ( ovType == OVERRIDE_RESET_OVERRIDE ) + { + // Restore previous flow, duty cycle and pressure values + targetROPumpFlowRate.data = targetROPumpFlowRate.ovInitData; + targetROPumpFlowRate.ovInitData = 0; + if ( roPumpOpenLoopTargetDutyCycle.override == OVERRIDE_RESET ) // isTargetDutyCycleActive + { + roPumpOpenLoopTargetDutyCycle.data = roPumpOpenLoopTargetDutyCycle.ovInitData; + } + else + { + roPumpOpenLoopTargetDutyCycle.data = roPumpOpenLoopTargetDutyCycle.ovData; + } + if ( targetROPumpPressure.override == OVERRIDE_RESET ) // isTargetPressureActive + { + targetROPumpPressure.data = targetROPumpPressure.ovInitData; + } + else + { + targetROPumpPressure.data = targetROPumpPressure.ovData; + } + } + + BOOL result = u32Override( message, &targetROPumpFlowRate, MIN_RO_FLOWRATE_MLPM, MAX_RO_FLOWRATE_MLPM ); setROPumpTargetFlowRateMLPM(getTargetROPumpFlowRateMLPM()); return result; @@ -714,8 +853,33 @@ *************************************************************************/ BOOL testROPumpTargetDutyCycleOverride( MESSAGE_T *message ) { - BOOL result = f32Override( message, &roPumpOpenLoopTargetDutyCycle ); + TEST_OVERRIDE_PAYLOAD_T payload; + OVERRIDE_TYPE_T ovType = getOverridePayloadFromMessage( message, &payload ); + if ( ovType == OVERRIDE_RESET_OVERRIDE ) + { + // Restore previous flow, duty cycle and pressure values + roPumpOpenLoopTargetDutyCycle.data = roPumpOpenLoopTargetDutyCycle.ovInitData; + roPumpOpenLoopTargetDutyCycle.ovInitData = 0.0; + if ( targetROPumpFlowRate.override == OVERRIDE_RESET ) // isTargetFlowActive + { + targetROPumpFlowRate.data = targetROPumpFlowRate.ovInitData; + } + else + { + targetROPumpFlowRate.data = targetROPumpFlowRate.ovData; + } + if ( targetROPumpPressure.override == OVERRIDE_RESET ) // isTargetPressureActive + { + targetROPumpPressure.data = targetROPumpPressure.ovInitData; + } + else + { + targetROPumpPressure.data = targetROPumpPressure.ovData; + } + } + + BOOL result = f32Override( message, &roPumpOpenLoopTargetDutyCycle ); setROPumpTargetDutyCycle(getTargetROPumpDutyCyclePCT()); return result;