Index: firmware/.cproject
===================================================================
diff -u -r5a61bccd959265c00e5276ba23391198ca82b6dd -r25770b4b27e75e730d89ac046f7db405b1bfe39f
--- firmware/.cproject (.../.cproject) (revision 5a61bccd959265c00e5276ba23391198ca82b6dd)
+++ firmware/.cproject (.../.cproject) (revision 25770b4b27e75e730d89ac046f7db405b1bfe39f)
@@ -196,4 +196,12 @@
+
+
+
+
+
+
+
+
Index: firmware/.launches/DG.launch
===================================================================
diff -u -rfeb93744f73bc0a3d58841bb02bd05c38357f35d -r25770b4b27e75e730d89ac046f7db405b1bfe39f
--- firmware/.launches/DG.launch (.../DG.launch) (revision feb93744f73bc0a3d58841bb02bd05c38357f35d)
+++ firmware/.launches/DG.launch (.../DG.launch) (revision 25770b4b27e75e730d89ac046f7db405b1bfe39f)
@@ -1,6 +1,6 @@
-
+
@@ -17,4 +17,5 @@
+
Index: firmware/App/Controllers/LoadCell.c
===================================================================
diff -u -r87a22cbaa87daab0d7cedabc67452cead83d8630 -r25770b4b27e75e730d89ac046f7db405b1bfe39f
--- firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 87a22cbaa87daab0d7cedabc67452cead83d8630)
+++ firmware/App/Controllers/LoadCell.c (.../LoadCell.c) (revision 25770b4b27e75e730d89ac046f7db405b1bfe39f)
@@ -90,10 +90,10 @@
U32 ii;
// update sums for load cell average calculations
- loadcells[ LOAD_CELL_A1 ].measuredReadingSum += getFPGALoadCellA1();
- loadcells[ LOAD_CELL_A2 ].measuredReadingSum += getFPGALoadCellA2();
- loadcells[ LOAD_CELL_B1 ].measuredReadingSum += getFPGALoadCellB1();
- loadcells[ LOAD_CELL_B2 ].measuredReadingSum += getFPGALoadCellB2();
+ loadcells[ LOAD_CELL_RESERVOIR_2_PRIMARY ].measuredReadingSum += getFPGALoadCellA1();
+ loadcells[ LOAD_CELL_RESERVOIR_1_BACKUP ].measuredReadingSum += getFPGALoadCellA2();
+ loadcells[ LOAD_CELL_RESERVOIR_2_PRIMARY ].measuredReadingSum += getFPGALoadCellB1();
+ loadcells[ LOAD_CELL_RESERVOIR_2_BACKUP ].measuredReadingSum += getFPGALoadCellB2();
// filter every 100ms
if ( ++loadCellFilterTimerCount >= LOAD_CELL_SAMPLES_TO_AVERAGE )
@@ -117,8 +117,8 @@
loadCellDataPublicationTimerCounter = 0;
// broadcast load cell data
- broadcastLoadCellData( getLoadCellFilteredWeight( LOAD_CELL_A1 ), getLoadCellFilteredWeight( LOAD_CELL_A2 ),
- getLoadCellFilteredWeight( LOAD_CELL_B1 ), getLoadCellFilteredWeight( LOAD_CELL_B2 ) );
+ broadcastLoadCellData( getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ), getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_BACKUP ),
+ getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ), getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_2_BACKUP ) );
}
}
Index: firmware/App/Controllers/LoadCell.h
===================================================================
diff -u -r87a22cbaa87daab0d7cedabc67452cead83d8630 -r25770b4b27e75e730d89ac046f7db405b1bfe39f
--- firmware/App/Controllers/LoadCell.h (.../LoadCell.h) (revision 87a22cbaa87daab0d7cedabc67452cead83d8630)
+++ firmware/App/Controllers/LoadCell.h (.../LoadCell.h) (revision 25770b4b27e75e730d89ac046f7db405b1bfe39f)
@@ -19,6 +19,7 @@
#define __LOADCELL_H__
#include "DGCommon.h"
+#include "DGDefs.h"
/**
* @defgroup LoadCells LoadCells
@@ -30,16 +31,6 @@
// ********** public definitions **********
-/// Enumeration of load cells.
-typedef enum LoadCells
-{
- LOAD_CELL_A1 = 0, ///< Load cell A1
- LOAD_CELL_A2, ///< Load cell A2
- LOAD_CELL_B1, ///< Load cell B1
- LOAD_CELL_B2, ///< Load cell B2
- NUM_OF_LOAD_CELLS ///< Number of reservoirs
-} LOAD_CELL_ID_T;
-
// ********** public function prototypes **********
void initLoadCell( void ); // Initialize the LoadCell module.
Index: firmware/App/Controllers/ROPump.c
===================================================================
diff -u -rf68e01a2daee6cb88bb54816aee56668d662bcd4 -r25770b4b27e75e730d89ac046f7db405b1bfe39f
--- firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision f68e01a2daee6cb88bb54816aee56668d662bcd4)
+++ firmware/App/Controllers/ROPump.c (.../ROPump.c) (revision 25770b4b27e75e730d89ac046f7db405b1bfe39f)
@@ -48,46 +48,60 @@
#define RO_PUMP_DATA_PUB_INTERVAL ( MS_PER_SECOND / TASK_PRIORITY_INTERVAL ) ///< Interval (ms/task time) at which the RO Pump data is published on the CAN bus.
-#define MAX_RO_PUMP_DUTY_CYCLE 0.99 ///< max duty cycle.
-#define MIN_RO_PUMP_DUTY_CYCLE 0.0 ///< min duty cycle.
+#define MAX_RO_PUMP_DUTY_CYCLE 0.99 ///< Max duty cycle.
+#define MIN_RO_PUMP_DUTY_CYCLE 0.0 ///< Min duty cycle.
-#define ROP_CONTROL_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< interval (ms/task time) at which the RO pump is controlled.
-#define ROP_P_COEFFICIENT 0.0020 ///< P term for RO pump pressure control.
-#define ROP_I_COEFFICIENT 0.0015 ///< I term for RO pump pressure control.
+#define ROP_CONTROL_INTERVAL ( MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled.
+#define ROP_RAMP_UP_CONTROL_INTERVAL ( 500 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the RO pump is controlled.
+#define ROP_P_COEFFICIENT 0.0001 ///< P term for RO pump pressure control.
+#define ROP_I_COEFFICIENT 0.00005 ///< I term for RO pump pressure control.
-#define ROP_RAMP_UP_P_COEFFICIENT 0.0 ///< P term for RO pump flow control.
-#define ROP_RAMP_UP_I_COEFFICIENT 0.1 ///< I term for RO pump flow control.
-#define ROP_FLOW_TARGET_TOLERANCE 0.05 ///< Tolerance in between the target flow rate and the actual flow rate in liter.
+#define ROP_RAMP_UP_P_COEFFICIENT 0.0 ///< P term for RO pump flow control. TODO remove
+#define ROP_RAMP_UP_I_COEFFICIENT 0.1 ///< I term for RO pump flow control. TODO remove
+#define ROP_FLOW_TARGET_TOLERANCE 0.03 ///< Tolerance in between the target flow rate and the actual flow rate in percentage.
+#define ROP_RAMP_DOWN_DUTY_CYCLE_RATIO 0.01 ///< Pump ramp down duty cycle ratio when the pressure higher than max defined.
#define FLOW_SENSOR_ZERO_READING 0xFFFF ///< Flow sensor reading indicates zero flow (or flow lower than can be detected by sensor).
#define FLOW_SAMPLES_TO_AVERAGE ( 250 / TASK_PRIORITY_INTERVAL ) ///< Averaging flow data over 250 ms intervals.
#define FLOW_AVERAGE_MULTIPLIER ( 1.0 / (F32)FLOW_SAMPLES_TO_AVERAGE ) ///< Optimization - multiplying is faster than dividing.
-#define FLOW_VERIFICATION_COUNTER_TARGET 40U ///< The time in counts to check the flow and make sure it is in range.
-#define RO_FLOW_ADC_TO_LPM_FACTOR 10909.0909 ///< conversion factor from ADC counts to LPM (liters/min) for RO flow rate (multiply this by inverse of FPGA reading).
+/// The time in counts to check the flow and make sure it is in range.
+#define FLOW_VERIFICATION_COUNTER_TARGET ( 2 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) //TODO remove
-#define ROP_FLOW_TO_PWM_DC(flow) ( (F32)( flow / MAX_RO_FLOWRATE_LPM ) ) ///< Initial conversion factor from target flow rate to PWM duty cycle estimate.
+#define RO_FLOW_ADC_TO_LPM_FACTOR 5555 ///< Conversion factor from ADC counts to LPM (liters/min) for RO flow rate (multiply this by inverse of FPGA reading).
+#define ROP_FLOW_TO_PWM_SLOPE 0.5 ///< Slope of flow to PWM line equation.
+#define ROP_FLOW_TO_PWM_INTERCEPT 0.28 ///< Intercept of flow to PWM line equation.
+
+ /// Initial conversion factor from target flow rate to PWM duty cycle estimate.
+#define ROP_FLOW_TO_PWM_DC(flow) ( ROP_FLOW_TO_PWM_SLOPE * flow + ROP_FLOW_TO_PWM_INTERCEPT )
+
#define FLOW_SENSOR_ZERO_READING 0xFFFF ///< Flow sensor reading indicates zero flow (or flow lower than can be detected by sensor).
#define MAX_ALLOWED_FLOW_DEVIATION 0.1 ///< Max allowed deviation from target flow.
-#define FLOW_OUT_OF_RANGE_PERSISTENT_INTERVAL ( 5 * MS_PER_SECOND ) ///< Flow out of range time out in counts.
+#define FLOW_OUT_OF_RANGE_PERSISTENT_INTERVAL ( 10 * MS_PER_SECOND ) ///< Flow out of range time out in counts.
#define MAX_PRESSURE_TARGET_TOLERANCE 5 ///< Pressure tolerance from maximum set pressure by user in psi.
#define MAX_ALLOWED_PRESSURE_PSI 130 ///< Maximum allowed pressure that the RO pump can go to.
#define MIN_ALLOWED_PRESSURE_PSI 10 ///< Minimum allowed pressure that the RO pump can go to.
#define MAX_ALLOWED_MEASURED_PRESSURE_PSI 135 ///< Maximum allowed pressure that the sensor measures. RO pump shut off pressure is 140psi.
#define MAX_PRESSURE_OUT_OF_RANGE_PERSISTENT_INTERVAL MS_PER_SECOND ///< Maximum allowed time that the pressure can be very high.
-#define MAX_ALLOWED_RAMP_UP_TIME ( 20 * MS_PER_SECOND ) ///< Maximum allowed ramp up time to a flow rate in ms.
-#define ROP_PSI_TO_PWM_DC(p) ( 0.2 + ( (F32)((p) - 100) * 0.01 ) ) ///< conversion factor from target PSI to PWM duty cycle estimate.
-#define SAFETY_SHUTDOWN_TIMEOUT ( 2 * MS_PER_SECOND ) ///< RO pump safety shutdown activation timeout in ms.
+#define MAX_ALLOWED_RAMP_UP_TIME ( 10 * MS_PER_SECOND ) ///< Maximum allowed ramp up time to a flow rate in ms.
+#define ROP_PSI_TO_PWM_DC(p) ( 0.2 + ( (F32)((p) - 100) * 0.01 ) ) ///< Conversion factor from target PSI to PWM duty cycle estimate.
+#define SAFETY_SHUTDOWN_TIMEOUT ( 3 * MS_PER_SECOND ) ///< RO pump safety shutdown activation timeout in ms.
+#define ROP_FLOW_STABILIZE_TIME ( 3 * MS_PER_SECOND ) ///< Time required for RO flow to stabilize. TODO remove
+#define ROP_MAX_RAMP_UP_RETRY 5 ///< Maximum ramp up retires before alarm.
+// ************ New defines for pump control ****************//
+
+
/// Enumeration of RO pump states.
typedef enum ROPump_States
{
RO_PUMP_OFF_STATE = 0, ///< RO pump off state
+ RO_PUMP_CONTROL_SETUP_STATE, ///< RO pump control setup state TODO remove
RO_PUMP_RAMP_UP_STATE, ///< RO pump ramp up to target flow rate state
- RO_PUMP_VERIFY_FLOW_STATE, ///< RO pump maintain the flow rate for a set period of time
+ RO_PUMP_VERIFY_FLOW_STATE, ///< RO pump maintain the flow rate for a set period of time TODO remove
RO_PUMP_CONTROL_TO_TARGET_STATE, ///< RO pump control to target pressure state
RO_PUMP_OPEN_LOOP_STATE, ///< RO pump open loop state
NUM_OF_RO_PUMP_STATES ///< Number of RO pump states
@@ -113,18 +127,18 @@
static PUMP_CONTROL_MODE_T roPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP; ///< currently set RO pump control mode.
static F32 targetROPumpFlowRate = 0.0; ///< Target RO flow rate (in L/min).
-static U32 targetROPumpPressure = 0; ///< Target RO pressure (in PSI).
+static F32 targetROPumpPressure = 0; ///< Target RO pressure (in PSI).
static OVERRIDE_U32_T roPumpDataPublishInterval = { RO_PUMP_DATA_PUB_INTERVAL,
RO_PUMP_DATA_PUB_INTERVAL,
0, 0 }; ///< Interval (in ms) at which to publish RO flow data to CAN bus.
static OVERRIDE_F32_T measuredROFlowRateLPM = { 0.0, 0.0, 0.0, 0 }; ///< measured RO flow rate (in L/min).
-static U32 flowVerificationCounter = 0; ///< Counter to verify the flow is in range.
+static U32 flowVerificationCounter = 0; ///< Counter to verify the flow is in range. TODo remove
static U32 roControlTimerCounter = 0; ///< determines when to perform control on RO pump.
static F32 roPumpOpenLoopTargetDutyCycle = 0; ///< Target RO pump open loop PWM.
-static F32 roPumpFlowRateRunningSum = 0; ///< RO pump flow rate running sum.
-static F32 roPumpPressureRunningSum = 0; ///< RO pump pressure running sum.
+static F32 roPumpFlowRateRunningSum = 0; ///< RO pump flow rate running sum. TODO remove
+static F32 roPumpPressureRunningSum = 0; ///< RO pump pressure running sum. TODO remove
/* TODO These variables are used for POST. POST has not been implemented yet
static RO_PUMP_SELF_TEST_STATE_T roPumpSelfTestState = RO_PUMP_SELF_TEST_STATE_START; ///< Current RO pump self test state.
@@ -133,10 +147,14 @@
static S32 measuredFlowReadingsSum = 0; ///< Raw flow reading sums for averaging.
static U32 flowFilterCounter = 0; ///< Flow filtering counter.
+static U32 roPumpOnStartTime = 0; ///< Start time when RO pump turned on.
+static BOOL setupROPumpControl = 0; ///< Flag to indicate if we need to setup RO pump control. TODO remove
+static U32 rampUpRetryCount = 0; ///< Number of ramp up retries.
// ********** private function prototypes **********
static RO_PUMP_STATE_T handleROPumpOffState( void );
+static RO_PUMP_STATE_T handleROPumpControlSetupState( void );
static RO_PUMP_STATE_T handleROPumpRampUpState( void );
static RO_PUMP_STATE_T handleROPumpVerifyFlowState( void );
static RO_PUMP_STATE_T handleROPumpControlToTargetState( void );
@@ -146,7 +164,7 @@
static void setROPumpControlSignalDutyCycle( F32 dutyCycle );
static void stopROPump( void );
static void publishROPumpData( void );
-static U32 getPublishROPumpDataInterval( void );
+static U32 getPublishROPumpDataInterval( void );
/*********************************************************************//**
* @brief
@@ -166,10 +184,6 @@
initializePIController( PI_CONTROLLER_ID_RO_PUMP, MIN_RO_PUMP_DUTY_CYCLE, ROP_P_COEFFICIENT, ROP_I_COEFFICIENT,
MIN_RO_PUMP_DUTY_CYCLE, MAX_RO_PUMP_DUTY_CYCLE );
- // Initialize the I controller during ramp up
- initializePIController( I_CONTROLLER_ID_RO_PUMP_RAMP_UP, MIN_RO_PUMP_DUTY_CYCLE, ROP_RAMP_UP_P_COEFFICIENT, ROP_RAMP_UP_I_COEFFICIENT,
- MIN_RO_PUMP_DUTY_CYCLE, MAX_RO_PUMP_DUTY_CYCLE );
-
// Initialize the persistent alarm for flow out of upper and lower range
initPersistentAlarm( PERSISTENT_ALARM_RO_FLOW_RATE_OUT_OF_UPPER_RANGE, ALARM_ID_FLOW_RATE_OUT_OF_UPPER_RANGE, TRUE,
FLOW_OUT_OF_RANGE_PERSISTENT_INTERVAL, FLOW_OUT_OF_RANGE_PERSISTENT_INTERVAL );
@@ -197,6 +211,7 @@
flowFilterCounter = 0;
flowVerificationCounter = 0;
roPumpDataPublicationTimerCounter = 0;
+ rampUpRetryCount = 0;
roPumpState = RO_PUMP_OFF_STATE;
roPumpControlMode = NUM_OF_PUMP_CONTROL_MODES;
roPumpControlModeSet = roPumpControlMode;
@@ -232,6 +247,7 @@
roPumpControlMode = PUMP_CONTROL_MODE_CLOSED_LOOP;
// Get the initial guess of the duty cycle
roPumpPWMDutyCyclePct = ROP_FLOW_TO_PWM_DC( roFlowRate );
+ setupROPumpControl = TRUE;
result = TRUE;
}
// Requested max pressure is out of range
@@ -296,7 +312,7 @@
// to make sure the hardware (especially the ROF) is not damaged. If it is the case, we need to stop immediately
F32 actualPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET );
BOOL isPressureMax = actualPressure >= MAX_ALLOWED_MEASURED_PRESSURE_PSI;
- checkPersistentAlarm( PERSISTENT_ALARM_RO_PUMP_PRESSURE_OUT_OF_RANGE, isPressureMax, actualPressure, MAX_ALLOWED_MEASURED_PRESSURE_PSI );
+ checkPersistentAlarm( ALARM_ID_RO_PUMP_PRESSURE_OUT_OF_RANGE, isPressureMax, actualPressure, MAX_ALLOWED_MEASURED_PRESSURE_PSI );
// Read flow at the control set
if ( ++flowFilterCounter >= FLOW_SAMPLES_TO_AVERAGE )
@@ -322,18 +338,15 @@
// meaning, it is controlling to a certain pressure
if ( roPumpControlMode == PUMP_CONTROL_MODE_CLOSED_LOOP && roPumpState == RO_PUMP_CONTROL_TO_TARGET_STATE )
{
- F32 currentFlow = getMeasuredROFlowRate();
- F32 targetFlow = getTargetROPumpFlowRate();
- F32 error = fabs( 1.0 - ( currentFlow / targetFlow ) );
-
+ F32 const currentFlow = getMeasuredROFlowRate();
+ F32 const targetFlow = getTargetROPumpFlowRate();
+ BOOL const isFlowOutOfRange = fabs( 1.0 - ( currentFlow / targetFlow ) ) > MAX_ALLOWED_FLOW_DEVIATION;
// Figure out whether flow is out of range from which side
- if ( error > MAX_ALLOWED_FLOW_DEVIATION )
- {
- BOOL isFlowOutOfUpperRange = currentFlow > targetFlow;
- BOOL isFlowOutOfLowerRange = currentFlow < targetFlow;
- checkPersistentAlarm( PERSISTENT_ALARM_RO_FLOW_RATE_OUT_OF_UPPER_RANGE, isFlowOutOfUpperRange, currentFlow, targetFlow );
- checkPersistentAlarm( PERSISTENT_ALARM_RO_FLOW_RATE_OUT_OF_LOWER_RANGE, isFlowOutOfLowerRange, currentFlow, targetFlow );
- }
+ BOOL const isFlowOutOfUpperRange = isFlowOutOfRange && ( currentFlow > targetFlow );
+ BOOL const isFlowOutOfLowerRange = isFlowOutOfRange && ( currentFlow < targetFlow );
+
+ checkPersistentAlarm( ALARM_ID_FLOW_RATE_OUT_OF_UPPER_RANGE, isFlowOutOfUpperRange, currentFlow, targetFlow );
+ checkPersistentAlarm( ALARM_ID_FLOW_RATE_OUT_OF_LOWER_RANGE, isFlowOutOfLowerRange, currentFlow, targetFlow );
}
// If the pump is off and PPi + 5psi < PPo for a certain period of time, activate safety shutdown
@@ -342,7 +355,7 @@
F32 pressureInlet = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_INLET );
BOOL isPumpRunning = ( pressureInlet + MAX_PRESSURE_TARGET_TOLERANCE ) < actualPressure;
- checkPersistentAlarm( PERSISTEMT_ALARM_RO_PUMP_OFF_ERROR, isPumpRunning, pressureInlet, ( pressureInlet + MAX_PRESSURE_TARGET_TOLERANCE ) );
+ checkPersistentAlarm( ALARM_ID_RO_PUMP_OFF_FAULT, isPumpRunning, pressureInlet, ( pressureInlet + MAX_PRESSURE_TARGET_TOLERANCE ) );
// Check if it has timed out
if ( isAlarmActive( ALARM_ID_RO_PUMP_OFF_FAULT ) )
@@ -370,6 +383,10 @@
roPumpState = handleROPumpOffState();
break;
+ case RO_PUMP_CONTROL_SETUP_STATE:
+ //roPumpState = handleROPumpControlSetupState();
+ break;
+
case RO_PUMP_RAMP_UP_STATE:
roPumpState = handleROPumpRampUpState();
break;
@@ -427,11 +444,9 @@
* @brief
* The handleROPumpOffState function handles the RO pump off state of the
* controller state machine.
- * @details Inputs: roPumpControlMode, roPumpControlModeSet, roPumpControlMode,
- * roPumpPWMDutyCyclePctSet, roPumpPWMDutyCyclePct, isROPumpOn,
+ * @details Inputs: roPumpControlMode, roPumpPWMDutyCyclePctSet,
* roPumpOpenLoopTargetDutyCycle
- * @details Outputs: roPumpControlModeSet, roPumpPWMDutyCyclePctSet,
- * roPumpPWMDutyCyclePct, isROPumpOn
+ * @details Outputs: roPumpPWMDutyCyclePct, setupROPumpControl, isROPumpOn
* @return next state of the controller state machine
*************************************************************************/
static RO_PUMP_STATE_T handleROPumpOffState( void )
@@ -441,15 +456,13 @@
// If there is a flow, transition to the PI controller to get the corresponding pressure of that flow
if ( getTargetROPumpFlowRate() > 0 && roPumpControlMode == PUMP_CONTROL_MODE_CLOSED_LOOP )
{
- roPumpControlModeSet = roPumpControlMode;
- // Set initial PWM duty cycle
- roPumpDutyCyclePctSet = roPumpPWMDutyCyclePct;
- setROPumpControlSignalDutyCycle( roPumpDutyCyclePctSet );
- // Reset controller
- resetPIController( I_CONTROLLER_ID_RO_PUMP_RAMP_UP, roPumpDutyCyclePctSet );
+ roPumpControlModeSet = PUMP_CONTROL_MODE_CLOSED_LOOP;
// Set pump to on
isROPumpOn = TRUE;
+ roPumpDutyCyclePctSet = ( getTargetROPumpFlowRate() - getMeasuredROFlowRate() ) * 0.5; //ROP_FLOW_TO_PWM_DC( getTargetROPumpFlowRate() );
+ setROPumpControlSignalDutyCycle( roPumpDutyCyclePctSet );
result = RO_PUMP_RAMP_UP_STATE;
+ //setupROPumpControl = TRUE;
}
// 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
@@ -465,6 +478,39 @@
/*********************************************************************//**
* @brief
+ * The handleROPumpControlSetupState function handles the RO pump control
+ * setup state of the controller state machine.
+ * @details Inputs: setupROPumpControl, roPumpPWMDutyCyclePct
+ * @details Outputs: setup RO pump PI controller and wait for flow stabilize
+ * @return next state of the controller state machine
+ *************************************************************************/
+static RO_PUMP_STATE_T handleROPumpControlSetupState( void )
+{
+ RO_PUMP_STATE_T result = RO_PUMP_CONTROL_SETUP_STATE;
+
+ if ( TRUE == setupROPumpControl )
+ {
+ roPumpControlModeSet = roPumpControlMode;
+ // Set initial PWM duty cycle
+ roPumpDutyCyclePctSet = roPumpPWMDutyCyclePct;
+ setROPumpControlSignalDutyCycle( roPumpDutyCyclePctSet );
+ // Reset controller
+ resetPIController( I_CONTROLLER_ID_RO_PUMP_RAMP_UP, roPumpDutyCyclePctSet );
+ setupROPumpControl = FALSE;
+ roPumpOnStartTime = getMSTimerCount();
+ }
+
+ if ( TRUE == didTimeout( roPumpOnStartTime, ROP_FLOW_STABILIZE_TIME ) )
+ {
+ rampUpRetryCount = 0;
+ result = RO_PUMP_RAMP_UP_STATE;
+ }
+
+ return result;
+}
+
+/*********************************************************************//**
+ * @brief
* The handleROPumpRampUpState function handles the RO pump ramp up state
* of the controller state machine.
* @details Inputs: roControlTimerCounter, roPumpPWMDutyCyclePctSet,
@@ -482,19 +528,19 @@
F32 targetFlowRate = getTargetROPumpFlowRate();
F32 actualFlowRate = (F32)getMeasuredROFlowRate();
- BOOL isFlowInRange = fabs( targetFlowRate - actualFlowRate ) > ROP_FLOW_TARGET_TOLERANCE;
+ F32 flowRateDeviation = fabs( targetFlowRate - actualFlowRate ) / targetFlowRate;
+ BOOL isFlowOutOfRange = flowRateDeviation > ROP_FLOW_TARGET_TOLERANCE;
- // Check if the ramp up has timed out
- checkPersistentAlarm( PERSISTENT_ALARM_RO_PUMP_RAMP_UP_TO_TARGET_FLOW_TIMEOUT, isFlowInRange, actualFlowRate, MAX_ALLOWED_RAMP_UP_TIME );
-
// If the ramp up persistent alarm is active, turn off the pump and go to off state
- if ( isAlarmActive( ALARM_ID_RO_PUMP_RAMP_UP_TO_FLOW_TIMEOUT ) )
+ /*if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_RO_PUMP_RAMP_UP_TO_FLOW_TIMEOUT, isFlowOutOfRange ) )
{
stopROPump();
result = RO_PUMP_OFF_STATE;
- }
+ SET_ALARM_WITH_2_F32_DATA( ALARM_ID_RO_PUMP_RAMP_UP_TO_FLOW_TIMEOUT, actualFlowRate, MAX_ALLOWED_RAMP_UP_TIME );
+ }*/
// Control at set interval
- else if ( ++roControlTimerCounter >= ROP_CONTROL_INTERVAL )
+ //else if ( ++roControlTimerCounter >= ROP_RAMP_UP_CONTROL_INTERVAL )
+ if ( ++roControlTimerCounter >= ROP_RAMP_UP_CONTROL_INTERVAL )
{
F32 targetPressure = getTargetROPumpPressure();
@@ -504,23 +550,32 @@
// be reset to the corresponding pressure of the target flow rate.
if ( ( actualPressure > targetPressure ) || ( ( targetPressure - actualPressure ) < MAX_PRESSURE_TARGET_TOLERANCE ) )
{
+ resetPIController( PI_CONTROLLER_ID_RO_PUMP, roPumpDutyCyclePctSet );
result = RO_PUMP_CONTROL_TO_TARGET_STATE;
}
- // If the actual flow is still far from target flow, update the duty cycle using the I controller and stay in this state
- else if ( fabs( actualFlowRate - targetFlowRate ) > ROP_FLOW_TARGET_TOLERANCE )
+ //
+ else if ( TRUE == isFlowOutOfRange )
{
- roPumpDutyCyclePctSet = runPIController( I_CONTROLLER_ID_RO_PUMP_RAMP_UP, targetFlowRate, actualFlowRate );
+ roPumpDutyCyclePctSet += ( targetFlowRate - actualFlowRate ) * 0.5;
+ //roPumpDutyCyclePctSet = ROP_FLOW_TO_PWM_DC( getTargetROPumpFlowRate() );
setROPumpControlSignalDutyCycle( roPumpDutyCyclePctSet );
}
// Reached to the target flow go to the next state
else
{
- result = RO_PUMP_VERIFY_FLOW_STATE;
+ resetPIController( PI_CONTROLLER_ID_RO_PUMP, roPumpDutyCyclePctSet );
+ result = RO_PUMP_CONTROL_TO_TARGET_STATE;
}
roControlTimerCounter = 0;
}
+ /*if ( TRUE == setupROPumpControl )
+ {
+ //resetPersistentAlarmTimer( ALARM_ID_RO_PUMP_RAMP_UP_TO_FLOW_TIMEOUT );
+ result = RO_PUMP_CONTROL_SETUP_STATE;
+ }*/
+
return result;
}
@@ -545,39 +600,40 @@
// Check if the time for flow verification has elapsed
if ( ++flowVerificationCounter >= FLOW_VERIFICATION_COUNTER_TARGET )
{
- F32 actualPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET );
- // If the flow has been achieved without reaching to the maximum pressure, set the new pressure
- // otherwise, stay with the maximum allowed pressure as target pressure
- if ( actualPressure < getTargetROPumpPressure() )
+ // Calculate the average pressure and flow rate
+ F32 const targetFlowRate = getTargetROPumpFlowRate();
+ F32 const avgFlowRate = roPumpFlowRateRunningSum / flowVerificationCounter;
+ F32 const flowRateDeviation = fabs( targetFlowRate - avgFlowRate ) / targetFlowRate;
+
+ if ( flowRateDeviation < ROP_FLOW_TARGET_TOLERANCE )
{
- // Calculate the average pressure and flow rate
- F32 avgPressure = roPumpPressureRunningSum / flowVerificationCounter;
- F32 avgFlowRate = roPumpFlowRateRunningSum / flowVerificationCounter;
+ F32 const avgPressure = roPumpPressureRunningSum / flowVerificationCounter;
+ // If the flow has been achieved without reaching the maximum pressure, set the new pressure
+ // otherwise, stay with the maximum allowed pressure as target pressure
+ if ( avgPressure < getTargetROPumpPressure() )
+ {
+ targetROPumpPressure = avgPressure;
+ }
- F32 targetFlowRate = getTargetROPumpFlowRate();
-
- // Calculate the flow rate deviation from the target flow rate
- F32 flowRateDeviation = ( targetFlowRate - avgFlowRate ) / targetFlowRate;
- // Use the flow rate deviation to adjust the average calculated pressure. This
- // pressure is used as the target pressure
- avgPressure = avgPressure + ( avgPressure * flowRateDeviation );
- // Save the target pressure
- targetROPumpPressure = avgPressure;
+ // Set initial PWM duty cycle and reset controller
+ setROPumpControlSignalDutyCycle( roPumpDutyCyclePctSet );
+ resetPIController( PI_CONTROLLER_ID_RO_PUMP, roPumpDutyCyclePctSet );
+ result = RO_PUMP_CONTROL_TO_TARGET_STATE;
}
+ else
+ {
+ if ( ++rampUpRetryCount > ROP_MAX_RAMP_UP_RETRY )
+ {
+ SET_ALARM_WITH_2_F32_DATA( ALARM_ID_DG_RO_PUMP_TOO_MANY_RAMP_UP_RETRY, rampUpRetryCount, ROP_MAX_RAMP_UP_RETRY );
+ }
+ result = RO_PUMP_RAMP_UP_STATE;
+ }
+ }
- // Reset the I controller for the flow rate as it is no longer needed
- resetPIController( I_CONTROLLER_ID_RO_PUMP_RAMP_UP, MIN_RO_PUMP_DUTY_CYCLE );
-
- // Set initial PWM duty cycle
- setROPumpControlSignalDutyCycle( roPumpDutyCyclePctSet );
- // Reset controller
- resetPIController( PI_CONTROLLER_ID_RO_PUMP, roPumpDutyCyclePctSet );
- // Reset all the variables before leaving
- flowVerificationCounter = 0;
- roPumpFlowRateRunningSum = 0;
- roPumpPressureRunningSum = 0;
- result = RO_PUMP_CONTROL_TO_TARGET_STATE;
+ if ( TRUE == setupROPumpControl )
+ {
+ result = RO_PUMP_CONTROL_SETUP_STATE;
}
return result;
@@ -601,13 +657,26 @@
{
// Get the pressure to use it for setting the control
F32 actualPressure = getMeasuredDGPressure( PRESSURE_SENSOR_RO_PUMP_OUTLET );
+ if ( actualPressure >= targetROPumpPressure )
+ {
+ roPumpDutyCyclePctSet -= ROP_RAMP_DOWN_DUTY_CYCLE_RATIO;
+ //targetROPumpFlowRate = actualFlowRate;
+ }
+ else
+ {
+ roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP, getTargetROPumpFlowRate(), getMeasuredROFlowRate() );
+ }
- roPumpDutyCyclePctSet = runPIController( PI_CONTROLLER_ID_RO_PUMP, getTargetROPumpPressure(), actualPressure );
setROPumpControlSignalDutyCycle( roPumpDutyCyclePctSet );
roControlTimerCounter = 0;
}
+ /*if ( TRUE == setupROPumpControl )
+ {
+ result = RO_PUMP_CONTROL_SETUP_STATE;
+ }*/
+
return result;
}
@@ -750,6 +819,7 @@
{
RO_PUMP_DATA_T pumpData;
+ pumpData.roPumpTgtFlowRate = getTargetROPumpFlowRate();
pumpData.roPumpTgtPressure = getTargetROPumpPressure();
pumpData.measROFlowRate = getMeasuredROFlowRate();
pumpData.roPumpDutyCycle = roPumpDutyCyclePctSet * FRACTION_TO_PERCENT_FACTOR;
@@ -781,8 +851,8 @@
if ( TRUE == isTestingActivated() )
{
U32 intvl = value / TASK_PRIORITY_INTERVAL;
- roPumpDataPublishInterval.ovData = intvl;
- roPumpDataPublishInterval.override = OVERRIDE_KEY;
+ roPumpDataPublishInterval.ovData = intvl;
+ roPumpDataPublishInterval.override = OVERRIDE_KEY;
result = TRUE;
}
Index: firmware/App/Controllers/ROPump.h
===================================================================
diff -u -rfbc0a281b094ff309dcbf83db1878818a9b384f1 -r25770b4b27e75e730d89ac046f7db405b1bfe39f
--- firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision fbc0a281b094ff309dcbf83db1878818a9b384f1)
+++ firmware/App/Controllers/ROPump.h (.../ROPump.h) (revision 25770b4b27e75e730d89ac046f7db405b1bfe39f)
@@ -41,6 +41,7 @@
F32 measROFlowRate; ///< RO flow rate measurement
F32 roPumpDutyCycle; ///< RO pump duty cycle
U32 roPumpState; ///< RO pump current state
+ F32 roPumpTgtFlowRate; ///< RO pump target flow rate
} RO_PUMP_DATA_T;
// ********** public function prototypes **********
Index: firmware/App/Modes/ModeHeatDisinfect.c
===================================================================
diff -u -r9d5edd5658227136b3242bec69e9417107deab10 -r25770b4b27e75e730d89ac046f7db405b1bfe39f
--- firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 9d5edd5658227136b3242bec69e9417107deab10)
+++ firmware/App/Modes/ModeHeatDisinfect.c (.../ModeHeatDisinfect.c) (revision 25770b4b27e75e730d89ac046f7db405b1bfe39f)
@@ -751,8 +751,8 @@
// Get the current volumes of R1 & R2. These values will be used to make sure the reservoirs'
// volume does not change more than a certain amount during the actual heat disinfect cycle
- R1HeatDisinfectVol = getLoadCellFilteredWeight( LOAD_CELL_A1 );
- R2HeatDisinfectVol = getLoadCellFilteredWeight( LOAD_CELL_A2 );
+ R1HeatDisinfectVol = getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY );
+ R2HeatDisinfectVol = getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY );
stateTimer = getMSTimerCount();
rsrvrsVolMonitorTimer = getMSTimerCount();
@@ -806,13 +806,13 @@
// In this state, R2 is fully filled up and R1 is partially filled up with hot water
// So waiting for R1 to get to the level of defined partially full
- BOOL isR1PartiallyFull = fabs( getLoadCellFilteredWeight( LOAD_CELL_A1 ) - RSRVRS_PARTIAL_FILL_VOL_ML ) < RSRVRS_MAX_TARGET_VOL_CHANGE_ML;
+ BOOL isR1PartiallyFull = fabs( getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ) - RSRVRS_PARTIAL_FILL_VOL_ML ) < RSRVRS_MAX_TARGET_VOL_CHANGE_ML;
if ( isRsrvrFull( R2, RSRVRS_FULL_VOL_ML, RSRVRS_FILL_UP_TIMEOUT_MS, state ) && isR1PartiallyFull )
{
// Get the current volumes to be monitored during R2 to R1 heat disinfect state
- R1HeatDisinfectVol = getLoadCellFilteredWeight( LOAD_CELL_A1 );
- R2HeatDisinfectVol = getLoadCellFilteredWeight( LOAD_CELL_A2 );
+ R1HeatDisinfectVol = getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY );
+ R2HeatDisinfectVol = getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY );
//TODO turn on CP1 and CP2
@@ -1127,11 +1127,11 @@
if ( r == R1 )
{
- volume = getLoadCellFilteredWeight( LOAD_CELL_A1 );
+ volume = getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY );
}
else if ( r == R2 )
{
- volume = getLoadCellFilteredWeight( LOAD_CELL_B1 );
+ volume = getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY );
}
// Check the volume of the reservoir against the target volume
@@ -1168,11 +1168,11 @@
if ( r == R1 )
{
- volume = getLoadCellFilteredWeight( LOAD_CELL_A1 );
+ volume = getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY );
}
else if ( r == R2 )
{
- volume = getLoadCellFilteredWeight( LOAD_CELL_B1 );
+ volume = getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY );
}
if ( volume < RSRVRS_EMPTY_VOL_ML )
@@ -1205,8 +1205,8 @@
F32 TPoTemp = getTemperatureValue( TEMPSENSORS_OUTLET_PRIMARY_HEATER );
F32 TPmTemp = getTemperatureValue( TEMPSENSORS_INLET_DIALYSATE ); //TODO change this to actual TPm sensor later
- BOOL isR1OutOfRange = fabs( getLoadCellFilteredWeight( LOAD_CELL_A1 ) - R1HeatDisinfectVol ) > RSRVRS_MAX_TARGET_VOL_CHANGE_ML;
- BOOL isR2OutOfRange = fabs( getLoadCellFilteredWeight( LOAD_CELL_A2 ) - R2HeatDisinfectVol ) > RSRVRS_MAX_TARGET_VOL_CHANGE_ML;
+ BOOL isR1OutOfRange = fabs( getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_1_PRIMARY ) - R1HeatDisinfectVol ) > RSRVRS_MAX_TARGET_VOL_CHANGE_ML;
+ BOOL isR2OutOfRange = fabs( getLoadCellFilteredWeight( LOAD_CELL_RESERVOIR_2_PRIMARY ) - R2HeatDisinfectVol ) > RSRVRS_MAX_TARGET_VOL_CHANGE_ML;
// Check if either reservoir 1 or reservoir 2 are losing volume more than allowed volume
if ( isR1OutOfRange || isR2OutOfRange )
Index: firmware/App/Modes/ModeRecirculate.c
===================================================================
diff -u -rf68e01a2daee6cb88bb54816aee56668d662bcd4 -r25770b4b27e75e730d89ac046f7db405b1bfe39f
--- firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision f68e01a2daee6cb88bb54816aee56668d662bcd4)
+++ firmware/App/Modes/ModeRecirculate.c (.../ModeRecirculate.c) (revision 25770b4b27e75e730d89ac046f7db405b1bfe39f)
@@ -85,7 +85,7 @@
setValveState( VRC, VALVE_STATE_DRAIN_C_TO_NO );
setValveState( VDR, VALVE_STATE_DRAIN_C_TO_NO );
setValveState( VPO, VALVE_STATE_NOFILL_C_TO_NO );
- setROPumpTargetFlowRate( TARGET_RO_FLOW_RATE_L, TARGET_RO_PRESSURE_PSI );
+ setROPumpTargetFlowRate( TARGET_RO_FLOW_RATE_L, 50);//TARGET_RO_PRESSURE_PSI );
signalDrainPumpHardStop();
startPrimaryHeater();
requestConcentratePumpsOff( CONCENTRATEPUMPS_CP1 );
Index: firmware/App/Services/PIControllers.c
===================================================================
diff -u -r35246359c5a9080c704e0a6f1563e99a337e2e91 -r25770b4b27e75e730d89ac046f7db405b1bfe39f
--- firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 35246359c5a9080c704e0a6f1563e99a337e2e91)
+++ firmware/App/Services/PIControllers.c (.../PIControllers.c) (revision 25770b4b27e75e730d89ac046f7db405b1bfe39f)
@@ -64,7 +64,6 @@
{ 0.0, 0.0, 3000, 300, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CONTROLLER_BIDIRECTIONAL }, // PI_CONTROLLER_ID_DRAIN_PUMP
{ 0.0, 0.0, 1.39, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_PRIMARY_HEATER
{ 0.0, 0.0, 0.50, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CONTROLLER_UNIDIRECTIONAL }, // PI_CONTROLLER_ID_TRIMMER_HEATER
- { 0.0, 0.0, 0.99, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, CONTROLLER_UNIDIRECTIONAL }, // I_CONTROLLER_ID_RO_PUMP_RAMP_UP
};
/*********************************************************************//**
Index: firmware/App/Services/Reservoirs.c
===================================================================
diff -u -rdd7fad816b77aee7febdc79785eb74102b844370 -r25770b4b27e75e730d89ac046f7db405b1bfe39f
--- firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision dd7fad816b77aee7febdc79785eb74102b844370)
+++ firmware/App/Services/Reservoirs.c (.../Reservoirs.c) (revision 25770b4b27e75e730d89ac046f7db405b1bfe39f)
@@ -55,10 +55,10 @@
static OVERRIDE_U32_T fillVolumeTargetMl = { 0, 0, 0, 0 }; ///< The target reservoir fill volume (in mL).
static OVERRIDE_U32_T drainVolumeTargetMl = { 0, 0, 0, 0 }; ///< The target reservoir drain volume (in mL).
-static LOAD_CELL_ID_T associatedLoadCell[ NUM_OF_RESERVOIRS ] = { LOAD_CELL_A1,
- LOAD_CELL_B1 }; ///< The reservoirs' associate load cell.
-static LOAD_CELL_ID_T redundantLoadCell[ NUM_OF_RESERVOIRS ] = { LOAD_CELL_A2,
- LOAD_CELL_B2 }; ///< The reservoirs' associate redundant load cell.
+static LOAD_CELL_ID_T associatedLoadCell[ NUM_OF_RESERVOIRS ] = { LOAD_CELL_RESERVOIR_1_PRIMARY,
+ LOAD_CELL_RESERVOIR_1_BACKUP }; ///< The reservoirs' associate load cell.
+static LOAD_CELL_ID_T redundantLoadCell[ NUM_OF_RESERVOIRS ] = { LOAD_CELL_RESERVOIR_2_PRIMARY,
+ LOAD_CELL_RESERVOIR_2_BACKUP }; ///< The reservoirs' associate redundant load cell.
static F32 reservoirLowestWeight[ NUM_OF_RESERVOIRS ] = { MAX_RESERVOIR_WEIGHT,
MAX_RESERVOIR_WEIGHT }; ///< The reservoirs' lowest weight during draining.
Index: firmware/App/Services/SystemComm.c
===================================================================
diff -u -r5fc16235c1752c993b3f1285f3a2b9738372af7a -r25770b4b27e75e730d89ac046f7db405b1bfe39f
--- firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 5fc16235c1752c993b3f1285f3a2b9738372af7a)
+++ firmware/App/Services/SystemComm.c (.../SystemComm.c) (revision 25770b4b27e75e730d89ac046f7db405b1bfe39f)
@@ -1142,10 +1142,6 @@
handleTestDGAccelBroadcastIntervalOverrideRequest( message );
break;
- case MSG_ID_DG_ACCEL_SET_CALIBRATION:
- handleSetAccelCalibration( message );
- break;
-
case MSG_ID_DRAIN_PUMP_SET_DELTA_PRESSURE_OVERRIDE:
handleSetDrainPumpDeltaPressureOverrideRequest( message );
break;