Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r60df6fda52be699d377d3d5ec62cfb337f920706 -r7957cce4e8b23b7d15b9623ff7c6d20432eab4e1 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 60df6fda52be699d377d3d5ec62cfb337f920706) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 7957cce4e8b23b7d15b9623ff7c6d20432eab4e1) @@ -39,8 +39,8 @@ #define RO_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO Pump data is published on the CAN bus. #define ROP_CONTROL_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled. -#define ROP_FLOW_CONTROL_P_COEFFICIENT 0.1F ///< P term for RO pump flow control. -#define ROP_FLOW_CONTROL_I_COEFFICIENT 0.8F ///< I term for RO pump flow control. +#define ROP_FLOW_CONTROL_P_COEFFICIENT 0.000095F ///< P term for RO pump flow control. +#define ROP_FLOW_CONTROL_I_COEFFICIENT 0.00049F ///< I term for RO pump flow control. #define ROP_MIN_FLOW_TO_CONTROL_PCT 0.75F #define ROP_PRESSURE_CONTROL_P_COEFFICIENT 0.15F ///< P term for RO pump pressure control. #define ROP_PRESSURE_CONTROL_I_COEFFICIENT 0.65F ///< I term for RO pump pressure control. @@ -97,8 +97,8 @@ initFluidPump(); // Initialize RO pump PI controller to flow - initializePIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, MIN_RO_FLOWRATE_MLPM, ROP_FLOW_CONTROL_P_COEFFICIENT, ROP_FLOW_CONTROL_I_COEFFICIENT, - MIN_RO_FLOWRATE_MLPM, MAX_RO_FLOWRATE_MLPM, FALSE, 0 ); + initializePIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, ROP_FLOW_CONTROL_P_COEFFICIENT, ROP_FLOW_CONTROL_I_COEFFICIENT, + MIN_FLUID_PUMP_DUTY_CYCLE_PCT, MAX_FLUID_PUMP_DUTY_CYCLE_PCT, FALSE, 0 ); // Initialize RO pump PI controller to target pressure initializePIController( PI_CONTROLLER_ID_RO_PUMP_PRES, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, ROP_PRESSURE_CONTROL_P_COEFFICIENT, ROP_PRESSURE_CONTROL_I_COEFFICIENT, @@ -270,7 +270,6 @@ static RO_PUMP_STATE_T handleROPumpControlToTargetFlowState( void ) { RO_PUMP_STATE_T state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; - F32 nexttgtflow = 0.0; // Check if need to switch control modes if ( getTargetROPumpPressure() > 0.0F ) @@ -296,11 +295,10 @@ // P16 flow seems to lag in current Leahi HW. We will wait till we hit a % of target flow before we start changing control. if( ( TRUE == roPumpStartControl ) || ( getFilteredFlow( P16_FLOW ) >= ( (F32)getTargetROPumpFlowRateMLPM() * ROP_MIN_FLOW_TO_CONTROL_PCT ) ) ) { - //roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, (F32)getTargetROPumpFlowRateMLPM(), getFilteredFlow( P16_FLOW ) ); - //setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); - nexttgtflow = runPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, (F32)getTargetROPumpFlowRateMLPM(), getFilteredFlow( P16_FLOW ) ); - nexttgtflow = (U16)MIN( ROP_FLOW_TO_PWM( nexttgtflow ), ( MAX_FLUID_PUMP_PWM_DUTY_CYCLE * MAX_FLUID_PUMP_DUTY_CYCLE_PCT ) ); - setFluidPumpPWMDutyCycle( P12_PUMP, nexttgtflow ); + roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, (F32)getTargetROPumpFlowRateMLPM(), getFilteredFlow( P16_FLOW ) ); + roPumpDutyCyclePctSet = MIN( roPumpDutyCyclePctSet, ( MAX_FLUID_PUMP_PWM_DUTY_CYCLE * MAX_FLUID_PUMP_DUTY_CYCLE_PCT ) ); + setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); + if ( FALSE == roPumpStartControl ) { roPumpStartControl = TRUE; @@ -689,11 +687,11 @@ pumpData.p12PumpDutyCycle = (U32)getFluidPumpPWMDutyCycle( P12_PUMP ); pumpData.p12PumpFBDutyCycle = (U32)getFluidPumpReadPWMDutyCycle( P12_PUMP ); pumpData.p12PumpSpeed = getFluidPumpRPM( P12_PUMP ); - pumpData.p12TargetPressure = getTargetROPumpPressure(); - pumpData.p12TargetFlow = getTargetROPumpFlowRateMLPM(); - pumpData.p12TargetDutyCycle = getTargetROPumpDutyCyclePCT(); - pumpData.p12PumpDutyCyclePct = convertDutyCycleCntToPct( (U32)getFluidPumpPWMDutyCycle( P12_PUMP ) ); - pumpData.p12PumpFBDutyCyclePct = convertDutyCycleCntToPct( (U32)getFluidPumpReadPWMDutyCycle( P12_PUMP ) ); + pumpData.p12TargetPressure = getPIControllerSignals(PI_CONTROLLER_ID_RO_PUMP_FLOW,CONTROLLER_SIGNAL_CONTROL); + pumpData.p12TargetFlow = getPIControllerSignals(PI_CONTROLLER_ID_RO_PUMP_FLOW, CONTROLLER_SIGNAL_ERROR); + pumpData.p12TargetDutyCycle = getPIControllerSignals(PI_CONTROLLER_ID_RO_PUMP_FLOW, CONTROLLER_SIGNAL_PROPORTIONAL_OUTPUT); + pumpData.p12PumpDutyCyclePct = getPIControllerSignals(PI_CONTROLLER_ID_RO_PUMP_FLOW, CONTROLLER_SIGNAL_INTEGRAL_OUTPUT); + pumpData.p12PumpFBDutyCyclePct = getPIControllerSignals(PI_CONTROLLER_ID_RO_PUMP_FLOW, CONTROLLER_SIGNAL_ERROR_SUM_AFTER_WINDUP); broadcastData( MSG_ID_FP_RO_PUMP_DATA, COMM_BUFFER_OUT_CAN_FP_BROADCAST, (U08*)&pumpData, sizeof( RO_PUMP_DATA_T ) ); roPumpDataPublicationTimerCounter = 0;