Index: firmware/App/Controllers/ConcentratePumps.c =================================================================== diff -u -r673b5a1cbab7728b638ee966627e6d926a7de092 -rac305d5eedc7fb0e85adef5cd4aa34e58e94e3b8 --- firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision 673b5a1cbab7728b638ee966627e6d926a7de092) +++ firmware/App/Controllers/ConcentratePumps.c (.../ConcentratePumps.c) (revision ac305d5eedc7fb0e85adef5cd4aa34e58e94e3b8) @@ -39,7 +39,9 @@ #define CONCENTRATE_PUMP_SPEED_INCREMENT 2.0F ///< Speed increase (mL/min) when controlling concentrate pump to target step speed. #define CONCENTRATE_PUMP_MIN_SPEED 3.0F ///< Minimum speed for concentrate pump in mL per min. -#define CONCENTRATE_PUMP_ERROR_TOLERANCE 0.02F ///< Measured speed needs to be within 2% of commanded speed. +#define CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_ON_PCT 0.02F ///< Concentrate pump speed out of range tolerance when on in percentage. +#define CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_OFF_MLPM 1.0F ///< Concentrate pump speed out of range tolerance when off in mL/min. +#define CONCENTRATE_PUMP_LOW_SPEED_THRESHOLD_MLPM 10.0F ///< Concentrate pump low speed threshold in mL/min. #define CONCENTRATE_PUMP_ZERO_FLOW_RATE 0xFFFF ///< Pulse width value when zero flow rate or pump is off. #define CONCENTRATE_PUMP_VOLUME_PER_REV 0.1F ///< Volume output every revolution (mL). @@ -57,7 +59,7 @@ #define CONCENTRATE_PUMP_DATA_PUBLISH_INTERVAL ( 1000 / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is monitored. #define CONCENTRATE_PUMP_CONTROL_INTERVAL ( 1 * MS_PER_SECOND / TASK_GENERAL_INTERVAL ) ///< Interval (ms/task time) at which the concentrate pump is controlled. -#define CONCENTRATE_PUMP_SPEED_CONTROL_PERSISTENCE_PERIOD ( 5 * MS_PER_SECOND ) ///< Persistence period for concentrate pump speed control error. +#define CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ( 10 * MS_PER_SECOND ) ///< Concentrate pumps speed out of range timeout in milliseconds. #define NUMBER_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK 1 ///< Number of acid and bicarb non-volatile data to check. @@ -171,8 +173,8 @@ stopConcentratePump( pumpId ); } - initPersistentAlarm( ALARM_ID_DG_CP1_SPEED_CONTROL_ERROR, CONCENTRATE_PUMP_SPEED_CONTROL_PERSISTENCE_PERIOD, CONCENTRATE_PUMP_SPEED_CONTROL_PERSISTENCE_PERIOD ); - initPersistentAlarm( ALARM_ID_DG_CP2_SPEED_CONTROL_ERROR, CONCENTRATE_PUMP_SPEED_CONTROL_PERSISTENCE_PERIOD, CONCENTRATE_PUMP_SPEED_CONTROL_PERSISTENCE_PERIOD ); + initPersistentAlarm( ALARM_ID_DG_CP1_SPEED_CONTROL_ERROR, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); + initPersistentAlarm( ALARM_ID_DG_CP2_SPEED_CONTROL_ERROR, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS, CONCENTRATE_PUMP_SPEED_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DG_CONC_PUMP_HALL_SENSOR_OUT_OF_RANGE, CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS, CONCENTRATE_PUMP_HALL_SENSORS_OUT_OF_RANGE_TIME_MS ); initPersistentAlarm( ALARM_ID_DG_ACID_CONCENTRATE_PUMP_PARK_FAULT, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DG_BICARB_CONCENTRATE_PUMP_PARK_FAULT, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS, CONENTREATE_PUMP_PARK_FAULT_TIMEOUT_MS ); @@ -856,17 +858,19 @@ F32 cpTargetSpeed = concentratePumps[ pumpId ].currentPumpSpeed; F32 cpError = fabs( getMeasuredPumpSpeed( pumpId ) - cpTargetSpeed ); BOOL isCpSpeedOut = FALSE; + F32 tolerance = CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_OFF_MLPM; - if ( cpTargetSpeed > NEARLY_ZERO ) + if ( ( cpTargetSpeed > NEARLY_ZERO ) && ( cpTargetSpeed > CONCENTRATE_PUMP_LOW_SPEED_THRESHOLD_MLPM ) ) { - // Check if the pump is not in the off state and if it is not, divide the error - // to target speed. If the pump is off the target speed is 0 - cpError = cpError / cpTargetSpeed; + // Check if the pump is not in the off state and if it is not and greater than the minimum threshold, divide the error + // to target speed. If the pump is off the target speed is 0 so the speed check is done differently + cpError = cpError / cpTargetSpeed; + tolerance = CONCENTRATE_PUMP_SPD_OUT_OF_RANGE_TOL_WHEN_ON_PCT; } - isCpSpeedOut = ( cpError > CONCENTRATE_PUMP_ERROR_TOLERANCE ? TRUE : FALSE ); + isCpSpeedOut = ( cpError > tolerance ? TRUE : FALSE ); - checkPersistentAlarm( alarm, isCpSpeedOut, cpError, CONCENTRATE_PUMP_ERROR_TOLERANCE ); + checkPersistentAlarm( alarm, isCpSpeedOut, cpError, tolerance ); }