Index: firmware/App/Controllers/ROPump.c =================================================================== diff -u -r1433d7d1c1c8bb8f08299d98ebe064a24a5e41af -rb80e670a9d724b5c6cdac4d74ce263a49bf6b697 --- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 1433d7d1c1c8bb8f08299d98ebe064a24a5e41af) +++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision b80e670a9d724b5c6cdac4d74ce263a49bf6b697) @@ -38,18 +38,23 @@ // ********** private definitions ********** #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_CONTROL_INTERVAL ( 300 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled. -#define ROP_FLOW_CONTROL_P_COEFFICIENT 0.00009F ///< P term for RO pump flow control. -#define ROP_FLOW_CONTROL_I_COEFFICIENT 0.00018F ///< I term for RO pump flow control. +#define ROP_FLOW_CONTROL_P_COEFFICIENT 0.00010F ///< P term for RO pump flow control. +#define ROP_FLOW_CONTROL_I_COEFFICIENT 0.000075F ///< I term for RO pump flow control. +#define ROP_FLOW_CONTROL_D_COEFFICIENT 0.00070F #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. #define ROP_FLOW_TO_PWM_SLOPE_PERM_FLUSH 117.63F ///< Slope of flow to PWM line equation for permeate flush. #define ROP_FLOW_TO_PWM_INTERCEPT_PERM_FLUSH -648.05F ///< Intercept of flow to PWM line equation for permeate flush. -#define ROP_FLOW_TO_PWM_SLOPE_MAX_RECOVER 155.31F ///< Slope of flow to PWM line equation for max RO recovery. -#define ROP_FLOW_TO_PWM_INTERCEPT_MAX_RECOVER -699.99F ///< Intercept of flow to PWM line equation for max RO recovery. +#define ROP_FLOW_TO_PWM_SLOPE_NO_RECOVERY 000.00F ///< Slope of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_INTERCEPT_NO_RECOVERY 000.00F ///< Intercept of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_SLOPE_MED_RECOVERY 000.00F ///< Slope of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_INTERCEPT_MED_RECOVERY 000.00F ///< Intercept of flow to PWM line equation for permeate flush. +#define ROP_FLOW_TO_PWM_SLOPE_MAX_RECOVER 109.91F ///< Slope of flow to PWM line equation for max RO recovery. +#define ROP_FLOW_TO_PWM_INTERCEPT_MAX_RECOVER -409.85F ///< Intercept of flow to PWM line equation for max RO recovery. #define ROP_PRESSURE_TO_PWM_SLOPE 0.5F ///< Slope of pressure to PWM line equation. #define ROP_PRESSURE_TO_PWM_INTERCEPT 0.0F ///< Intercept of pressure to PWM line equation. @@ -105,8 +110,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 ); + initializePIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, MIN_RO_FLOWRATE_MLPM, ROP_FLOW_CONTROL_P_COEFFICIENT, ROP_FLOW_CONTROL_I_COEFFICIENT, + ROP_FLOW_CONTROL_D_COEFFICIENT, MIN_RO_FLOWRATE_MLPM, MAX_RO_FLOWRATE_MLPM, 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, @@ -201,7 +206,7 @@ // Set pump to on isROPumpOn = TRUE; roPumpDutyCyclePctSet = roPumpFlowToPWM( getTargetROPumpFlowRateMLPM() ); - resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0.0F ); + resetPIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0.0F ); setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); roPumpStartControl = FALSE; state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; @@ -264,7 +269,7 @@ { roPumpDutyCyclePctSet = roPumpFlowToPWM( getTargetROPumpFlowRateMLPM() ); } - resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0.0F ); + resetPIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0.0F ); state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } // If there is a target pressure set, transition to the PI controller and control to pressure. @@ -323,7 +328,7 @@ // 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 ) || ( currentFlowRate >= ( minRequiredFlowRate ) ) ) { - roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, (F32)getTargetROPumpFlowRateMLPM(), currentFlowRate ); + roPumpDutyCyclePctSet = runPIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, (F32)getTargetROPumpFlowRateMLPM(), currentFlowRate ); roPumpDutyCyclePctSet = MIN( roPumpDutyCyclePctSet, ( MAX_FLUID_PUMP_PWM_DUTY_CYCLE * MAX_FLUID_PUMP_DUTY_CYCLE_PCT ) ); setFluidPumpPctToPWMDutyCycle( P12_PUMP, roPumpDutyCyclePctSet ); @@ -353,7 +358,7 @@ // Check if we are changing control if ( getTargetROPumpFlowRateMLPM() > 0 ) { - resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, getTargetROPumpFlowRateMLPM(), 0 ); + resetPIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, roPumpDutyCyclePctSet, 0 ); state = RO_PUMP_CONTROL_TO_TARGET_FLOW_STATE; } else if ( getTargetROPumpDutyCyclePCT() > 0.0F ) @@ -691,7 +696,7 @@ if( targetROPumpFlowRate.data > 0 ) { targetROPumpFlowRate.data = 0; - resetPIController( PI_CONTROLLER_ID_RO_PUMP_FLOW, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, 0.0F ); + resetPIDController( PID_CONTROLLER_ID_RO_PUMP_FLOW, MIN_FLUID_PUMP_DUTY_CYCLE_PCT, 0.0F ); } if( targetROPumpPressure.data > 0.0F )