Index: firmware/App/Controllers/RinsePump.c =================================================================== diff -u -rcfa8ae21594d3471c37079eb708761fe9a047776 -rf66ffb2807dae4ad719d41520bc8c3739210bfd0 --- firmware/App/Controllers/RinsePump.c (.../RinsePump.c) (revision cfa8ae21594d3471c37079eb708761fe9a047776) +++ firmware/App/Controllers/RinsePump.c (.../RinsePump.c) (revision f66ffb2807dae4ad719d41520bc8c3739210bfd0) @@ -15,10 +15,10 @@ * ***************************************************************************/ +#include "AlarmMgmtDD.h" #include "FpgaDD.h" #include "Messaging.h" #include "OperationModes.h" -#include "PersistentAlarm.h" #include "RinsePump.h" #include "TaskGeneral.h" #include "Timers.h" @@ -43,11 +43,17 @@ #define RINSE_PUMP_TURN_OFF_CONTROL_BIT 0xFE ///< Rinse pump turn off control bit. #define RINSE_PUMP_TURN_ON_CONTROL_BIT 0xFF ///< Rinse pump turn on control bit. +#define RINSE_PUMP_PULSE_WIDTH_INVALID_MIN 0U ///< Invalid pulse width minimum (no rotation). +#define RINSE_PUMP_PULSE_WIDTH_INVALID_MAX 0xFFFFU ///< Invalid pulse width maximum (sensor fault). +#define RINSE_PUMP_SPD_OUT_OF_RANGE_TOL_PCT 0.10F ///< Rinse pump commanded vs measured speed tolerance (10%). +#define RINSE_PUMP_MAX_RPM_ESTIMATE 3000U ///< Estimated max rinse pump RPM (for PWM-to-target conversion). + // ********** private data ********** static RINSE_PUMP_STATE_T currentRinsePumpState; ///< Current rinse pump control state. static U32 rinsePumpDataPublicationTimerCounter; ///< Rinse pump data broadcast timer counter. -static U32 rinsePumpMeasuredSpeed; ///< Rinse pump measured speed +static U32 rinsePumpMeasuredSpeed; ///< Rinse pump measured speed (RPM) +static U32 rinsePumpTargetSpeedRPM; ///< Rinse pump commanded target speed (RPM) for monitor static OVERRIDE_F32_T rinsePumpPwmPercentage; ///< Rinse pump PWM percentage. static OVERRIDE_U32_T rinsePumpDataPublishInterval; ///< Rinse pump data broadcast interval (in ms). @@ -79,7 +85,8 @@ rinsePumpPwmPercentage.ovData = RINSE_PUMP_DEFAULT_PWM_PERCENT; rinsePumpPwmPercentage.ovInitData = RINSE_PUMP_DEFAULT_PWM_PERCENT; rinsePumpPwmPercentage.override = OVERRIDE_RESET; - rinsePumpMeasuredSpeed = 0; + rinsePumpMeasuredSpeed = 0U; + rinsePumpTargetSpeedRPM = 0U; } /*********************************************************************//** @@ -117,6 +124,32 @@ /*********************************************************************//** * @brief + * The getRinsePumpMeasuredSpeed function returns the rinse pump measured + * speed from FPGA feedback. + * @details \b Inputs: rinsePumpMeasuredSpeed + * @details \b Outputs: none + * @return Measured rinse pump speed in RPM + *************************************************************************/ +U32 getRinsePumpMeasuredSpeed( void ) +{ + return rinsePumpMeasuredSpeed; +} + +/*********************************************************************//** + * @brief + * The getRinsePumpTargetSpeedRPM function returns the rinse pump commanded + * target speed for monitor tolerance checking. + * @details \b Inputs: rinsePumpTargetSpeedRPM + * @details \b Outputs: none + * @return Target rinse pump speed in RPM + *************************************************************************/ +U32 getRinsePumpTargetSpeedRPM( void ) +{ + return rinsePumpTargetSpeedRPM; +} + +/*********************************************************************//** + * @brief * The calculateRinsePumpSpeed function calculate rinse pump speed based * on FPGA report pulse width value. * @details \b Inputs: fpgaD79PumpSpeed @@ -129,7 +162,7 @@ U16 pumpPulseWidth = getFPGAD79RinsePumpPulseWidth(); U32 pumpSpeedPerSec = 0U; - if ( ( 0U != pumpPulseWidth ) && ( 0xFFFFU != pumpPulseWidth ) ) + if ( ( RINSE_PUMP_PULSE_WIDTH_INVALID_MIN != pumpPulseWidth ) && ( RINSE_PUMP_PULSE_WIDTH_INVALID_MAX != pumpPulseWidth ) ) { pumpSpeedPerSec = US_PER_SECOND / ( pumpPulseWidth * RINSE_PUMP_PWM_PULSE_RESOLUTION_US ); @@ -144,6 +177,43 @@ /*********************************************************************//** * @brief + * The execRinsePumpMonitor function executes the rinse pump monitor. + * @details \b Inputs: none + * @details \b Outputs: publish rinse pump data + * @details \b Alarm: ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE when + * commanded vs measured speed deviates beyond tolerance. Data1=measured RPM, Data2=target RPM. + * @return none + *************************************************************************/ +void execRinsePumpMonitor( void ) +{ + U08 fpgaConcPumpsFault = getFPGAConcentratePumpsFault(); + BOOL isConcPumpFault = ( fpgaConcPumpsFault > 0 ? TRUE : FALSE ); + + + // Check if a new calibration is available +// if ( TRUE == isNewCalibrationRecordAvailable() ) +// { +// // Get the calibration values of acid and bicarb +// getNVRecord2Driver( GET_CAL_ACID_CONCENTREATES, (U08*)&acidConcentrateCalRecord, sizeof( acidConcentrateCalRecord ), +// NUMBER_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK, ALARM_ID_DD_ACID_CONCENTRATE_INVALID_CAL_RECORD ); +// getNVRecord2Driver( GET_CAL_BICARB_CONCENTRATES, (U08*)&bicarbConcentrateCalRecord, sizeof( bicarbConcentrateCalRecord ), +// NUMBER_OF_ACID_AND_BICARB_NV_DATA_TO_CHECK, ALARM_ID_DD_BICARB_CONCENTRATE_INVALID_CAL_RECORD ); +// } + + // Calculate rinse pump speed + calculateRinsePumpSpeed(); + + + // Monitor pump speed (commanded vs measured tolerance, triggers ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE) + monitorRinsePumpSpeed(); + + //Publish rinse pump data // TODO should be done in monitor or controller? +// publishRinsePumpData(); +} + + +/*********************************************************************//** + * @brief * The execRinsePumpController function executes the rinse pump state machine. * @details \b Alarm: ALARM_ID_DD_SOFTWARE_FAULT if the current state is invalid. * @details \b Inputs: currentRinsePumpState @@ -152,7 +222,6 @@ *************************************************************************/ void execRinsePumpController( void ) { - calculateRinsePumpSpeed(); switch( currentRinsePumpState ) { @@ -178,6 +247,44 @@ /*********************************************************************//** * @brief + * The monitorRinsePumpSpeed function monitors the rinse pump speed and + * triggers the alarms if they are out of range. + * @details \b Inputs: none + * @details \b Outputs: none + * @return none + *************************************************************************/ +static void monitorRinsePumpSpeed( void ) +{ + F32 rpTargetSpeed = (F32)rinsePumpTargetSpeedRPM; + F32 rpMeasSpeed = (F32)rinsePumpMeasuredSpeed; + F32 rpError = 0.0F; + BOOL isRpSpeedOut = FALSE; + F32 tolerance = RINSE_PUMP_SPD_OUT_OF_RANGE_TOL_PCT; + + if ( RINSE_PUMP_STATE_ON == currentRinsePumpState ) + { + rpError = fabs( rpMeasSpeed - rpTargetSpeed ); + + if ( rpTargetSpeed > 0.0F ) + { + rpError = rpError / rpTargetSpeed; + } + + isRpSpeedOut = ( rpError > tolerance ? TRUE : FALSE ); + } + + if ( TRUE == isRpSpeedOut ) + { + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE, rinsePumpMeasuredSpeed, rinsePumpTargetSpeedRPM ); + } + else + { + clearAlarmConditionDD( ALARM_ID_DD_D79_RINSE_PUMP_SPEED_OUT_OF_RANGE ); + } +} + +/*********************************************************************//** + * @brief * The handleRinsePumpStartState function starts the rinse pump state machine. * @details \b Inputs: none * @details \b Outputs: none @@ -201,6 +308,8 @@ { RINSE_PUMP_STATE_T state = RINSE_PUMP_STATE_OFF; + rinsePumpTargetSpeedRPM = 0U; + if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_2_0_HW ) ) { // Set PWM count zero to stop the logical rinse pump @@ -227,11 +336,13 @@ if ( TRUE == getTestConfigStatus( TEST_CONFIG_DD_FP_ENABLE_BETA_2_0_HW ) ) { - F32 pwmPercent = getF32OverrideValue( &rinsePumpPwmPercentage ); - U32 pwmInCount = (U32)( ( pwmPercent / RINSE_PUMP_MAX_PWM_PERCENT ) * RINSE_PUMP_PWM_IN_COUNT_MAX ); + F32 pwmPercent = getF32OverrideValue( &rinsePumpPwmPercentage ); // TODO should this conversion happen in setPWMCount function? + U08 pwmInCount = (U08)( ( pwmPercent / RINSE_PUMP_MAX_PWM_PERCENT ) * RINSE_PUMP_PWM_IN_COUNT_MAX ); + rinsePumpTargetSpeedRPM = (U32)( ( (F32)pwmInCount / RINSE_PUMP_PWM_IN_COUNT_MAX ) * (F32)RINSE_PUMP_MAX_RPM_ESTIMATE ); + // Turn on logical rinse pump with given PWM value - setRinsePumpPwmCount( D79_RINSE_PUMP, pwmInCount ); + setRinsePumpPwmCount( D79_RINSE_PUMP, (U32)pwmInCount ); } else {