Index: firmware/App/Controllers/DrainPump.c =================================================================== diff -u -rc7ea3969643ead419cbfcd34c3cb203c45bcad71 -r80b41ef317abec16b133aa4145d994a5b95f4df6 --- firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision c7ea3969643ead419cbfcd34c3cb203c45bcad71) +++ firmware/App/Controllers/DrainPump.c (.../DrainPump.c) (revision 80b41ef317abec16b133aa4145d994a5b95f4df6) @@ -7,8 +7,8 @@ * * @file DrainPump.c * -* @author (last) Dara Navaei -* @date (last) 26-Apr-2023 +* @author (last) Bill Bracken +* @date (last) 01-Jun-2023 * * @author (original) Sean * @date (original) 08-Apr-2020 @@ -87,8 +87,10 @@ #define DRAIN_PUMP_FORWARD_DIR 1 ///< Drain pump forward direction. #define DRAIN_PUMP_DIR_BIT_MASK 0x80 ///< Drain pump direction bit clear mask. #define DRAIN_PUMP_DIR_ERROR_CNT_BIT_MASK 0x3F ///< Drain pump direction error count bit mask. -#define DRAIN_PUMP_DIR_FPGA_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Drain pump direction hall sensor FPGA error time out in milliseconds. +#define MAX_FPGA_DRAIN_PUMP_DIRECTION_FAULT_WINDOW_MS ( 1 * SEC_PER_MIN * MS_PER_SECOND ) ///< FPGA drain pump direction fault window +#define MAX_FPGA_DRAIN_PUMP_DIRECTION_FAULT_FAILURES 10 ///< FPGA drain pump direction fault failures per MAX_FPGA_DRAIN_PUMP_DIRECTION_FAULT_WINDOW_MS + /// Enumeration of drain pump states. typedef enum DrainPump_States { @@ -138,6 +140,9 @@ static const F32 RPM_CONVERSION_COEFF = (F32) SEC_PER_MIN / ( 2.0F * TOGGLE_PERIOD_RESOLUTION_SECONDS * ROTATIONAL_TO_TOGGLE_PERIOD_CONVERSION ); static const F32 CURRENT_CONVERSION_COEFF = (F32)( 2.5F / ( BITS_12_FULL_SCALE - 1.0F ) ); +/// Drain pump hall sensor failure count +static U32 lastDirHallSensorErrorCount = 0; ///< Last drain pump encoder errors for hal sensor + // ********** private function prototypes ********** static DRAIN_PUMP_STATE_T handleDrainPumpOffState( void ); @@ -156,7 +161,7 @@ * drainPumpControlMode, drainPumpControlModeSet, targetDrainPumpRPM, * targetDrainPumpOutletFlowLPM, drainControlTimerCtr, * pendingDrainPumpCmd, pendingDrainPumpCmdTarget, pendingDrainPumpCmdCountDown, - * hasClosedLoopBeenRequested, signalNewRPMRequest, + * hasClosedLoopBeenRequested, signalNewRPMRequest, lastDrainPumpEncoderErrors, * drainPumpDataPublicationTimerCounter, isDrainPumpControlInFlowMode * @return none *************************************************************************/ @@ -179,6 +184,7 @@ signalNewRPMRequest = FALSE; drainPumpDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; isDrainPumpControlInFlowMode = TRUE; + lastDirHallSensorErrorCount = 0; // Initialize the drain pump PI controller initializePIController( PI_CONTROLLER_ID_DRAIN_PUMP, DRAIN_PUMP_MIN_DAC, DRAIN_PUMP_P_COEFFICIENT, DRAIN_PUMP_I_COEFFICIENT, @@ -190,8 +196,9 @@ initPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_CURRENT_OUT_OF_RANGE, DRAIN_PUMP_CURRENT_OUT_OF_RANGE_TIMEOUT_MS, DRAIN_PUMP_CURRENT_OUT_OF_RANGE_TIMEOUT_MS ); initPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_DIRECTION_INVALID, DRAIN_PUMP_DIR_OF_RANGE_TIMEOUT_MS, DRAIN_PUMP_DIR_OF_RANGE_TIMEOUT_MS ); - initFPGAPersistentAlarm( FPGA_PERS_ERROR_DRAIN_PUMP_DIR_HALL_SENSOR, ALARM_ID_DG_DRAIN_PUMP_DIRECTION_FPGA_FAULT, - DRAIN_PUMP_DIR_FPGA_ERROR_TIMEOUT_MS, DRAIN_PUMP_DIR_FPGA_ERROR_TIMEOUT_MS ); + // initialize FPGA drain pump hall sensor error + initTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_DRAIN_PUMP_HALL_SENSOR_ERROR, MAX_FPGA_DRAIN_PUMP_DIRECTION_FAULT_FAILURES, MAX_FPGA_DRAIN_PUMP_DIRECTION_FAULT_WINDOW_MS); + } /*********************************************************************//** @@ -356,18 +363,25 @@ if ( getHardwareConfigStatus() != HW_CONFIG_BETA ) #endif { - checkFPGAPersistentErrorCountAlarm( FPGA_PERS_ERROR_DRAIN_PUMP_DIR_HALL_SENSOR, dirHallSensorErrorCount ); + if ( dirHallSensorErrorCount != lastDirHallSensorErrorCount ) + { + if ( TRUE == incTimeWindowedCount( TIME_WINDOWED_COUNT_FPGA_DRAIN_PUMP_HALL_SENSOR_ERROR ) ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_DRAIN_PUMP_DIRECTION_FPGA_FAULT, MAX_FPGA_DRAIN_PUMP_DIRECTION_FAULT_FAILURES, dirHallSensorErrorCount ) + } + lastDirHallSensorErrorCount = dirHallSensorErrorCount; + } } switch( drainPumpState ) { case DRAIN_PUMP_OFF_STATE: { - BOOL isRPMTooHigh = FALSE; - isOffCurrentOut = ( currentA > DRAIN_PUMP_MAX_CURRENT_WHEN_OFF_A ? TRUE : FALSE ); + BOOL isRPMTooHigh = FALSE; - isRPMTooHigh |= ( getDrainPumpMeasuredRPM( DRAIN_PUMP_HALL_SNSR_FB ) > MIN_DRAIN_PUMP_RPM ? TRUE : FALSE ); - isRPMTooHigh |= ( getDrainPumpMeasuredRPM( DRAIN_PUMP_MAXON_SNSR_FB ) > MIN_DRAIN_PUMP_RPM ? TRUE : FALSE ); + isOffCurrentOut = ( currentA > DRAIN_PUMP_MAX_CURRENT_WHEN_OFF_A ? TRUE : FALSE ); + isRPMTooHigh |= ( getDrainPumpMeasuredRPM( DRAIN_PUMP_HALL_SNSR_FB ) > MIN_DRAIN_PUMP_RPM ? TRUE : FALSE ); + isRPMTooHigh |= ( getDrainPumpMeasuredRPM( DRAIN_PUMP_MAXON_SNSR_FB ) > MIN_DRAIN_PUMP_RPM ? TRUE : FALSE ); checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_RPM_OUT_OF_RANGE, FALSE, getDrainPumpMeasuredRPM( DRAIN_PUMP_MAXON_SNSR_FB ), MAX_ALLOWED_OPEN_LOOP_RPM_OUT_OF_RANGE ); checkPersistentAlarm( ALARM_ID_DG_DRAIN_PUMP_OFF_FAULT, isRPMTooHigh, getDrainPumpMeasuredRPM( DRAIN_PUMP_MAXON_SNSR_FB ), MIN_DRAIN_PUMP_RPM );