Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r8d272582cbd2cb5fc0c6af0fead2867ce02658b0 -r1cf11f4c1f6a1f1fd40270889723fbec040fc7ec --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 8d272582cbd2cb5fc0c6af0fead2867ce02658b0) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 1cf11f4c1f6a1f1fd40270889723fbec040fc7ec) @@ -55,17 +55,6 @@ #define DATA_PUBLISH_COUNTER_START_COUNT 10 ///< Data publish counter start count. - -/// Enumeration of RO pump states. -typedef enum ROPump_States -{ - RO_PUMP_OFF_STATE = 0, ///< RO pump off state. - RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE, ///< RO pump control to target flow state. - RO_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE, ///< RO pump control to max pressure state. - RO_PUMP_OPEN_LOOP_STATE, ///< RO pump open loop state. - NUM_OF_RO_PUMP_STATES ///< Number of RO pump states. -} RO_PUMP_STATE_T; - // ********** private data ********** static RO_PUMP_STATE_T roPumpState; ///< Current state of pump controller state machine. @@ -78,7 +67,7 @@ static OVERRIDE_U32_T targetROPumpFlowRate; ///< Target RO flow rate (in L/min). static OVERRIDE_F32_T targetROPumpPressure; ///< Target RO max allowed pressure (in PSI). static F32 roPumpDutyCyclePctSet; ///< Currently set RO pump PWM duty cycle. -static F32 roPumpOpenLoopTargetDutyCycle; ///< Target RO pump open loop PWM. +static OVERRIDE_F32_T roPumpOpenLoopTargetDutyCycle; ///< Target RO pump open loop PWM. // ********** private function prototypes ********** @@ -113,27 +102,31 @@ initializePIController( PI_CONTROLLER_ID_RO_PUMP_PRES, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, ROP_PRESSURE_CONTROL_P_COEFFICIENT, ROP_PRESSURE_CONTROL_I_COEFFICIENT, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, MAX_FLUID_PUMP_DUTY_CYCLE_PCT, FALSE, 0 ); - roPumpState = RO_PUMP_OFF_STATE; - roPumpControlMode = NUM_OF_PUMP_CONTROL_MODES; - isROPumpOn = FALSE; - stopPumpRequest = FALSE; - roControlTimerCounter = 0; - roPumpDutyCyclePctSet = 0.0F; - roPumpOpenLoopTargetDutyCycle = 0.0F; - roPumpDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; - roPumpDataPublishInterval.data = RO_PUMP_DATA_PUB_INTERVAL; - roPumpDataPublishInterval.ovData = RO_PUMP_DATA_PUB_INTERVAL; - roPumpDataPublishInterval.ovInitData = 0; - roPumpDataPublishInterval.override = OVERRIDE_RESET; - targetROPumpFlowRate.data = 0; - targetROPumpFlowRate.ovData = 0; - targetROPumpFlowRate.ovInitData = 0; - targetROPumpFlowRate.override = OVERRIDE_RESET; - targetROPumpPressure.data = 0.0F; - targetROPumpPressure.ovData = 0.0F; - targetROPumpPressure.ovInitData = 0.0F; - targetROPumpPressure.override = OVERRIDE_RESET; + roPumpState = RO_PUMP_OFF_STATE; + roPumpControlMode = NUM_OF_PUMP_CONTROL_MODES; + isROPumpOn = FALSE; + stopPumpRequest = FALSE; + roControlTimerCounter = 0; + roPumpDutyCyclePctSet = 0.0F; + roPumpDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + roPumpDataPublishInterval.data = RO_PUMP_DATA_PUB_INTERVAL; + roPumpDataPublishInterval.ovData = RO_PUMP_DATA_PUB_INTERVAL; + roPumpDataPublishInterval.ovInitData = 0; + roPumpDataPublishInterval.override = OVERRIDE_RESET; + targetROPumpFlowRate.data = 0; + targetROPumpFlowRate.ovData = 0; + targetROPumpFlowRate.ovInitData = 0; + targetROPumpFlowRate.override = OVERRIDE_RESET; + targetROPumpPressure.data = 0.0F; + targetROPumpPressure.ovData = 0.0F; + targetROPumpPressure.ovInitData = 0.0F; + targetROPumpPressure.override = OVERRIDE_RESET; + roPumpOpenLoopTargetDutyCycle.data = 0; + roPumpOpenLoopTargetDutyCycle.ovData = 0; + roPumpOpenLoopTargetDutyCycle.ovInitData = 0; + roPumpOpenLoopTargetDutyCycle.override = OVERRIDE_RESET; + stopROPump(); } @@ -212,10 +205,10 @@ } // 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 ( ( roPumpOpenLoopTargetDutyCycle > 0.0F ) && ( PUMP_CONTROL_MODE_OPEN_LOOP == roPumpControlMode ) ) + else if ( ( getTargetROPumpDutyCyclePCT() > 0.0F ) && ( PUMP_CONTROL_MODE_OPEN_LOOP == roPumpControlMode ) ) { - setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpOpenLoopTargetDutyCycle ); - roPumpDutyCyclePctSet = roPumpOpenLoopTargetDutyCycle; + setFluidPumpPctToPWMDutyCycle( P12_PUMP, getTargetROPumpDutyCyclePCT() ); + roPumpDutyCyclePctSet = getTargetROPumpDutyCyclePCT(); isROPumpOn = TRUE; state = RO_PUMP_OPEN_LOOP_STATE; } @@ -245,15 +238,15 @@ if ( ( getTargetROPumpPressure() > 0.0F ) && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) { //transition to closed loop - resetPIController( PI_CONTROLLER_ID_RO_PUMP_PRES, roPumpDutyCyclePctSet, 0 ); + 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, roPumpDutyCyclePctSet, 0 ); + resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, getTargetROPumpDutyCyclePCT(), 0 ); state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } @@ -279,13 +272,18 @@ resetPIController( PI_CONTROLLER_ID_RO_PUMP_PRES, roPumpDutyCyclePctSet, 0 ); state = RO_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE; } - else if ( roPumpOpenLoopTargetDutyCycle > 0.0F && ( PUMP_CONTROL_MODE_OPEN_LOOP == roPumpControlMode ) ) + else if ( getTargetROPumpDutyCyclePCT() > 0.0F && ( PUMP_CONTROL_MODE_OPEN_LOOP == roPumpControlMode ) ) { - setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpOpenLoopTargetDutyCycle ); - roPumpDutyCyclePctSet = roPumpOpenLoopTargetDutyCycle; + setFluidPumpPctToPWMDutyCycle( P12_PUMP, getTargetROPumpDutyCyclePCT() ); + roPumpDutyCyclePctSet = getTargetROPumpDutyCyclePCT(); state = RO_PUMP_OPEN_LOOP_STATE; } - // Control at set interval + + // Control at set interval or shut off + if ( getTargetROPumpFlowRateMLPM() == 0.0F && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) + { + signalROPumpHardStop(); + } else if ( ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL ) && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) { roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, getTargetROPumpFlowRateMLPM(), getFilteredFlow( P16_FLOW ) ); @@ -308,19 +306,24 @@ { RO_PUMP_STATE_T state = RO_PUMP_CONTROL_TO_TARGET_PRESSURE_STATE; + // Check if we are changing control if ( getTargetROPumpFlowRateMLPM() > 0 && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) { - // Transition to target flow resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0 ); state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } - else if ( roPumpOpenLoopTargetDutyCycle > 0.0F && ( PUMP_CONTROL_MODE_OPEN_LOOP == roPumpControlMode ) ) + else if ( getTargetROPumpDutyCyclePCT() > 0.0F && ( PUMP_CONTROL_MODE_OPEN_LOOP == roPumpControlMode ) ) { - setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpOpenLoopTargetDutyCycle ); - roPumpDutyCyclePctSet = roPumpOpenLoopTargetDutyCycle; + setFluidPumpPctToPWMDutyCycle( P12_PUMP, getTargetROPumpDutyCyclePCT() ); + roPumpDutyCyclePctSet = getTargetROPumpDutyCyclePCT(); state = RO_PUMP_OPEN_LOOP_STATE; } - // Control at set interval + + // Control at set interval or shut off + if ( getTargetROPumpPressure() == 0.0F && ( PUMP_CONTROL_MODE_CLOSED_LOOP == roPumpControlMode ) ) + { + 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 ) ); @@ -360,9 +363,9 @@ { targetROPumpPressure.data = 0.0F; } - if ( roPumpOpenLoopTargetDutyCycle > 0.0F ) + if ( getTargetROPumpDutyCyclePCT() > 0.0F ) { - roPumpOpenLoopTargetDutyCycle = 0.0F; + roPumpOpenLoopTargetDutyCycle.data = 0.0F; } result = TRUE; } @@ -403,9 +406,9 @@ { targetROPumpFlowRate.data = 0; } - if ( roPumpOpenLoopTargetDutyCycle > 0.0F ) + if ( getTargetROPumpDutyCyclePCT() > 0.0F ) { - roPumpOpenLoopTargetDutyCycle = 0.0F; + roPumpOpenLoopTargetDutyCycle.data = 0.0F; } result = TRUE; } @@ -435,12 +438,12 @@ if ( ( dutyCycle >= MIN_FLUID_PUMP_DUTY_CYCLE_PCT ) && ( dutyCycle <= MAX_FLUID_PUMP_DUTY_CYCLE_PCT ) ) { - roPumpOpenLoopTargetDutyCycle = dutyCycle; - roPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; - status = TRUE; + roPumpOpenLoopTargetDutyCycle.data = dutyCycle; + roPumpControlMode = PUMP_CONTROL_MODE_OPEN_LOOP; + status = TRUE; // Set the new duty cycle of the pump - setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpOpenLoopTargetDutyCycle ); + setFluidPumpPctToPWMDutyCycle( P12_PUMP, getTargetROPumpDutyCyclePCT() ); // Clear previous target data if ( getTargetROPumpFlowRateMLPM() > 0 ) { @@ -461,15 +464,17 @@ /*********************************************************************//** * @brief - * The getTargetRODutyCyclePCT function gets the current target RO pump + * The getTargetRODutyCyclePCT function gets the target RO pump * pwm. * @details \b Inputs: roPumpOpenLoopTargetDutyCycle * @details \b Outputs: none * @return the current target RO pwm between 0 and 0.99 *************************************************************************/ F32 getTargetROPumpDutyCyclePCT( void ) { - return roPumpOpenLoopTargetDutyCycle; + F32 dutyCycle = getF32OverrideValue( &roPumpOpenLoopTargetDutyCycle ); + + return dutyCycle; } /*********************************************************************//** @@ -482,7 +487,7 @@ *************************************************************************/ F32 getCurrentROPumpDutyCyclePCT( void ) { - U16 dutyCyclePct = convertDutyCycleCntToPct( getFluidPumpReadPWMDutyCycle( P12_PUMP ) ); + F32 dutyCyclePct = convertDutyCycleCntToPct( getFluidPumpReadPWMDutyCycle( P12_PUMP ) ); return dutyCyclePct; } @@ -571,9 +576,10 @@ resetPIController( PI_CONTROLLER_ID_RO_PUMP_PRES, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, 0.0F ); } + roPumpState = RO_PUMP_OFF_STATE; roPumpDutyCyclePctSet = 0.0F; roControlTimerCounter = 0; - roPumpOpenLoopTargetDutyCycle = 0; + roPumpOpenLoopTargetDutyCycle.data = 0; stopPumpRequest = TRUE; stopROPump(); } @@ -626,7 +632,7 @@ pumpData.p12PumpSpeed = getFluidPumpRPM( P12_PUMP ); pumpData.p12TargetPressure = getTargetROPumpPressure(); pumpData.p12TargetFlow = getTargetROPumpFlowRateMLPM(); - pumpData.p12TargetDutyCycle = roPumpOpenLoopTargetDutyCycle; + pumpData.p12TargetDutyCycle = getTargetROPumpDutyCyclePCT(); broadcastData( MSG_ID_FP_RO_PUMP_DATA, COMM_BUFFER_OUT_CAN_FP_BROADCAST, (U08*)&pumpData, sizeof( RO_PUMP_DATA_T ) ); roPumpDataPublicationTimerCounter = 0; @@ -670,6 +676,8 @@ { BOOL result = f32Override( message, &targetROPumpPressure ); + setROPumpTargetPressure(getTargetROPumpPressure()); + return result; } @@ -687,7 +695,28 @@ { BOOL result = u32Override( message, &targetROPumpFlowRate, MIN_RO_FLOWRATE_MLPM, MAX_RO_FLOWRATE_MLPM ); + setROPumpTargetFlowRateMLPM(getTargetROPumpFlowRateMLPM()); + return result; } +/*********************************************************************//** + * @brief + * The testROPumpTargetDutyCycleOverride function overrides the RO pump + * duty cycle. + * @details \b Inputs: roPumpOpenLoopTargetDutyCycle + * @details \b Outputs: roPumpOpenLoopTargetDutyCycle + * @param message Override message from Dialin which includes the value + * of the target flow + * @return TRUE if override successful, FALSE if not + *************************************************************************/ +BOOL testROPumpTargetDutyCycleOverride( MESSAGE_T *message ) +{ + BOOL result = f32Override( message, &roPumpOpenLoopTargetDutyCycle ); + + setROPumpTargetDutyCycle(getTargetROPumpDutyCyclePCT()); + + return result; +} + /**@}*/