Index: firmware/App/Controllers/SubstitutionPump.c =================================================================== diff -u -r999e55125e62af895a8b2bed425c0a61eb887a0a -r43c231c0f9a56e2481f94cdbc51f45ef1af23c46 --- firmware/App/Controllers/SubstitutionPump.c (.../SubstitutionPump.c) (revision 999e55125e62af895a8b2bed425c0a61eb887a0a) +++ firmware/App/Controllers/SubstitutionPump.c (.../SubstitutionPump.c) (revision 43c231c0f9a56e2481f94cdbc51f45ef1af23c46) @@ -15,6 +15,8 @@ * ***************************************************************************/ +#include // For fabs() + #include "FpgaDD.h" #include "MessageSupport.h" #include "Messaging.h" @@ -57,6 +59,9 @@ #define SUBSTITUTION_PUMP_TRANS_TO_RAMP_SPEED_THRESHOLD_MLPM 10.0F ///< Substitution pump transition to ramp to target speed threshold in mL/min. #define SUBSTITUTION_PUMP_RAMP_SPEED_INCREMENT 5.0F ///< Speed increase (mL/min) when controlling Substitution pump to target step speed. +#define SUBSTITUTION_PUMP_CNT_TO_RPM(cnt) ( 60 / ( cnt * 0.0001 ) ) ///< Conversion function for hall sensor cnt to rpm. rpm = 60/(cnt*100uS). +#define MAX_ALLOWED_ML_OUT_OF_RANGE 20 ///< Maximum allowed mL/min out of range from target ml/min in open loop. +#define RPM_OUT_OF_RANGE_TIME_OUT ( 5 * MS_PER_SECOND ) ///< Open loop RPM out of range time out in ms. static const U32 SUBSTITUTION_PUMP_CONTROL_FORWARD = SUBSTITUTION_PUMP_CONTROL_SLEEP_OFF | SUBSTITUTION_PUMP_CONTROL_NOT_RESET | @@ -90,6 +95,7 @@ U32 togglePeriodCount; ///< Converted pump speed (mL/min) to toggle period counts (0.5 uS increment counts per step). U08 direction; ///< Substitution pump motor direction. U08 controlSet; ///< Substitution pump control set. + F32 measuredPumpSpeed; ///< Substitution pump measured pump speed. } SUBSTITUTION_PUMP_T; /// Payload record structure for Substitution pump start/stop request @@ -143,6 +149,8 @@ substitutionPumpDataPublishInterval.ovInitData = SUBSTITUTION_PUMP_DATA_PUBLISH_INTERVAL; substitutionPumpDataPublishInterval.ovData = 0; substitutionPumpDataPublishInterval.override = OVERRIDE_RESET; + + initPersistentAlarm( ALARM_ID_DD_D92_PUMP_RPM_OUT_OF_RANGE, RPM_OUT_OF_RANGE_TIME_OUT, RPM_OUT_OF_RANGE_TIME_OUT ); } /*********************************************************************//** @@ -173,7 +181,7 @@ // The switch case is in a for loop so the default case cannot be covered in VectorCAST default: - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_EXEC_INVALID_STATE, pumpId ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_SUBSTITUTION_PUMP_EXEC_INVALID_STATE, pumpId ) substitutionPumps[ pumpId ].execState = SUBSTITUTION_PUMP_OFF_STATE; break; } @@ -185,6 +193,29 @@ /*********************************************************************//** * @brief + * The execSubstitutionPumpMonitor function executes the substitution pump monitor. + * @details \b Inputs: execState + * @details \b Outputs: execState + * @details \b Alarms: ALARM_ID_DD_SOFTWARE_FAULT when invalid pump state is seen. + * @return none + *************************************************************************/ +void execSubstitutionPumpMonitor( void ) +{ + F32 rpmDiff = 0.0; + BOOL isRPMOutOfRange = FALSE; + U32 d92SpeedCnt = getFPGAD92PumpHallSenseCount(); + F32 d92SpeedmLmin = SUBSTITUTION_PUMP_CNT_TO_RPM( d92SpeedCnt ) * SUBSTITUTION_PUMP_VOLUME_PER_REV; + + substitutionPumps[ D92_PUMP ].measuredPumpSpeed = d92SpeedmLmin; + rpmDiff = fabs( substitutionPumps[ D92_PUMP ].measuredPumpSpeed - substitutionPumps[ D92_PUMP ].currentPumpSpeed ); + + isRPMOutOfRange = ( rpmDiff > MAX_ALLOWED_ML_OUT_OF_RANGE ? TRUE : FALSE ); + + checkPersistentAlarm( ALARM_ID_DD_D92_PUMP_RPM_OUT_OF_RANGE, isRPMOutOfRange, d92SpeedmLmin, MAX_ALLOWED_ML_OUT_OF_RANGE ); +} + +/*********************************************************************//** + * @brief * The handleSubstitutionPumpOffState function turns on a given substitution * pumps and switch to on state upon request. * @details \b Inputs: none @@ -375,7 +406,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_SUBSTITUTION_PUMP_INVALID_ID, pumpId ); } return speed; @@ -399,7 +430,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_SUBSTITUTION_PUMP_INVALID_ID, pumpId ); } } @@ -422,7 +453,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_SUBSTITUTION_PUMP_INVALID_ID, pumpId ); } } @@ -457,7 +488,7 @@ } else { - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_CONCENTRATE_PUMP_INVALID_PUMP_ID, pumpId ); + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_SOFTWARE_FAULT, SW_FAULT_ID_SUBSTITUTION_PUMP_INVALID_ID, pumpId ); } } @@ -479,6 +510,7 @@ pumpData.d92_PumpTargetSpeed = pumpTargetSpeed[ D92_PUMP ].data; pumpData.d92_PumpCurrentSetSpeed = substitutionPumps[ D92_PUMP ].currentPumpSpeed; pumpData.d92_PumpState = (U32)substitutionPumps[ D92_PUMP ].execState; + pumpData.d92_PumpMeasuredSpeed = substitutionPumps[ D92_PUMP ].measuredPumpSpeed; broadcastData( MSG_ID_DD_SUBSTITUTION_PUMP_DATA, COMM_BUFFER_OUT_CAN_DD_BROADCAST, (U08*)&pumpData, sizeof( SUBSTITUTION_PUMP_DATA_T ) ); substitutionPumpPublishTimerCounter = 0;