Index: firmware/App/Controllers/DialysatePumps.c =================================================================== diff -u -rbbcdba8850dd6f6a53044eca6a5ece611654653a -rc85d9f0a8023fabdf1cd557965958d225e2b9085 --- firmware/App/Controllers/DialysatePumps.c (.../DialysatePumps.c) (revision bbcdba8850dd6f6a53044eca6a5ece611654653a) +++ firmware/App/Controllers/DialysatePumps.c (.../DialysatePumps.c) (revision c85d9f0a8023fabdf1cd557965958d225e2b9085) @@ -47,6 +47,7 @@ #define DIALYSATE_PUMP_CONTROL_STOP 0x00 ///< Dialysate pump control stop pump. #define DIALYSATE_PUMP_FORWARD_DIR 1 ///< Dialysate pump forward direction. reverse direction is not allowed. #define DIALYSATE_PUMP_SPEED_INCREMENT 5.0F ///< Speed increase when controlling dialysate pump to target step speed. +#define ZERO_SPEED 0.0F ///< Zero speed/RPM value. #define DIALYSATE_PUMP_MAX_CURRENT_WHEN_OFF_A 0.1F ///< Dialysate pump maximum current when the pump is off in amps. #define DIALYSATE_PUMP_MAX_CURRENT_A 2.2F ///< Dialysate pump maximum current in amps. @@ -67,10 +68,13 @@ #define DIALYSATE_PUMP_MAX_PRESSURE_PSI 40.0F ///< Maximum dialysate pump pressure in psi. #define DIALYSATE_PUMP_SPEED_ZERO_RPM 0 ///< Dialysate pump zero RPM speed. -#define DIALYSATE_PUMP_P_COEFFICIENT 1.0F ///< P term for dialysate pump delta pressure control. -#define DIALYSATE_PUMP_I_COEFFICIENT 1.0F ///< I term for dialysate pump delta pressure control. +#define FRESH_DIALYSATE_PUMP_P_COEFFICIENT 1.0F ///< P term for fresh dialysate pump delta pressure control. +#define FRESH_DIALYSATE_PUMP_I_COEFFICIENT 0.0F ///< I term for fresh dialysate pump delta pressure control. +#define SPENT_DIALYSATE_PUMP_P_COEFFICIENT 1.0F ///< P term for spent dialysate pump delta pressure control. +#define SPENT_DIALYSATE_PUMP_I_COEFFICIENT 0.0F ///< I term for spent dialysate pump delta pressure control. #define MAX_ALLOWED_RPM_OUT_OF_RANGE 300 ///< Maximum allowed RPM out of range from target RPM in open loop. +#define PUMP_TRANS_TO_RAMP_SPEED_THRESHOLD 20.0F ///< Speed change that alters the state to ramp during control state. #define RPM_OUT_OF_RANGE_TIME_OUT ( 10 * MS_PER_SECOND ) ///< Open loop RPM out of range time out in ms. #define SAFETY_SHUTDOWN_TIMEOUT ( 1 * MS_PER_SECOND ) ///< Dialysate pump safety shutdown activation timeout. @@ -98,7 +102,8 @@ U32 controlTimerCounter; ///< Timer counter to perform control on dialysate pump. DIALYSATE_PUMP_STATE_T dialysatePumpState; ///< Current state of dialysate pump controller state machine. BOOL isDialPumpOn; ///< Flag indicates dialysate pump On or Off state - OVERRIDE_F32_T pumpTargetSpeed; ///< Target dialysate pumps' speed (mL/min). + OVERRIDE_F32_T pumpTargetSpeed; ///< Target dialysate pumps' speed (mL/min).forward direction only, hence positive speed. + F32 prevPumpTargetSpeed; ///< Previous target dialysate pumps' speed (mL/min). F32 currentPumpSpeed; ///< Current controlled dialysate pumps' speed (mL/min). OVERRIDE_F32_T measuredPumpSpeed; ///< Measured dialysate pump speed (mL/min). OVERRIDE_F32_T dialysatePumpMeasuredCurrentA; ///< Measured dialysate pump current feedback. @@ -125,7 +130,6 @@ // ********** private function prototypes ********** static void publishDialysatePumpsData( void ); -static void stopDialysatePump( DIALYSATE_PUMPS_T pumpId ); static DIALYSATE_PUMP_STATE_T handleDialysatePumpControlToTargetState( DIALYSATE_PUMPS_T pumpId ); static BOOL stepDialysatePumpToTargetSpeed( DIALYSATE_PUMPS_T pumpId ); static DIALYSATE_PUMP_STATE_T handleDialysatePumpRampToTargetState( DIALYSATE_PUMPS_T pumpId ); @@ -143,7 +147,7 @@ { DIALYSATE_PUMPS_T pumpId; - dialysatePumpDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; + dialysatePumpDataPublicationTimerCounter = DATA_PUBLISH_COUNTER_START_COUNT; for ( pumpId = DIALYSATE_PUMPS_FIRST; pumpId < NUM_OF_DIALYSATE_PUMPS; pumpId++ ) { @@ -152,13 +156,22 @@ dialysatePumps[ pumpId ].isDialPumpOn = FALSE; dialysatePumps[ pumpId ].measuredPumpSpeed.data = 0.0F; dialysatePumps[ pumpId ].measuredPumpSpeed.ovInitData = 0.0F; + dialysatePumps[ pumpId ].measuredPumpSpeed.override = OVERRIDE_RESET; + dialysatePumps[ pumpId ].measuredPumpSpeed.ovData = 0.0F; dialysatePumps[ pumpId ].pumpTargetSpeed.data = 0.0F; dialysatePumps[ pumpId ].pumpTargetSpeed.ovInitData = 0.0F; + dialysatePumps[ pumpId ].pumpTargetSpeed.override = OVERRIDE_RESET; + dialysatePumps[ pumpId ].pumpTargetSpeed.ovData = 0.0F; dialysatePumps[ pumpId ].measuredDirection.data = DIALYSATE_PUMP_FORWARD_DIR; dialysatePumps[ pumpId ].measuredDirection.ovInitData = DIALYSATE_PUMP_FORWARD_DIR; + dialysatePumps[ pumpId ].measuredDirection.ovData = DIALYSATE_PUMP_FORWARD_DIR; + dialysatePumps[ pumpId ].measuredDirection.override = OVERRIDE_RESET; dialysatePumps[ pumpId ].dialysatePumpMeasuredCurrentA.data = 0.0F; dialysatePumps[ pumpId ].dialysatePumpMeasuredCurrentA.ovInitData = 0.0F; + dialysatePumps[ pumpId ].dialysatePumpMeasuredCurrentA.ovData = 0.0F; + dialysatePumps[ pumpId ].dialysatePumpMeasuredCurrentA.override = OVERRIDE_RESET; dialysatePumps[ pumpId ].currentPumpSpeed = 0.0F; + dialysatePumps[ pumpId ].prevPumpTargetSpeed = 0.0F; dialysatePumps[ pumpId ].control = DIALYSATE_PUMP_CONTROL_STOP; dialysatePumps[ pumpId ].directionErrorCount = 0; dialysatePumps[ pumpId ].lastDirectionErrorCount = 0; @@ -176,11 +189,11 @@ dialysatePumps[SPENT_DIALYSATE_PUMP].pumpTargetPressure.override = OVERRIDE_RESET; // Initialize the fresh dialysate pump PI controller - initializePIController( PI_CONTROLLER_ID_FRESH_DIALYSATE_PUMP, DIALYSATE_PUMP_MIN_PRESSURE_PSI, DIALYSATE_PUMP_P_COEFFICIENT, DIALYSATE_PUMP_I_COEFFICIENT, + initializePIController( PI_CONTROLLER_ID_FRESH_DIALYSATE_PUMP, DIALYSATE_PUMP_MIN_PRESSURE_PSI, FRESH_DIALYSATE_PUMP_P_COEFFICIENT, FRESH_DIALYSATE_PUMP_I_COEFFICIENT, DIALYSATE_PUMP_MIN_PRESSURE_PSI, DIALYSATE_PUMP_MAX_PRESSURE_PSI ); // Initialize spent dialysate pump PI controller - initializePIController( PI_CONTROLLER_ID_SPENT_DIALYSATE_PUMP, DIALYSATE_PUMP_MIN_PRESSURE_PSI, DIALYSATE_PUMP_P_COEFFICIENT, DIALYSATE_PUMP_I_COEFFICIENT, + initializePIController( PI_CONTROLLER_ID_SPENT_DIALYSATE_PUMP, DIALYSATE_PUMP_MIN_PRESSURE_PSI, SPENT_DIALYSATE_PUMP_P_COEFFICIENT, SPENT_DIALYSATE_PUMP_I_COEFFICIENT, DIALYSATE_PUMP_MIN_PRESSURE_PSI, DIALYSATE_PUMP_MAX_PRESSURE_PSI ); // Initialize the persistent alarms for fresh dialysate pump @@ -230,6 +243,18 @@ dialysatePumps[ pumpId ].pumpTargetSpeed.data = MAX_DIALYSATE_PUMP_RPM; } + //handle target speed update when pump is running + if ( DIALYSATE_PUMP_CONTROL_TO_TARGET_STATE == dialysatePumps[ pumpId ].dialysatePumpState ) + { + F32 diffSpeed = fabs( getDialysatePumpTargetSpeed( pumpId ) - dialysatePumps[ pumpId ].prevPumpTargetSpeed ); + if ( diffSpeed > PUMP_TRANS_TO_RAMP_SPEED_THRESHOLD ) + { + // change to ramp state + dialysatePumps[ pumpId ].dialysatePumpState = DIALYSATE_PUMP_RAMP_UP_STATE; + } + } + + dialysatePumps[ pumpId ].prevPumpTargetSpeed = getDialysatePumpTargetSpeed( pumpId ); result = TRUE; } else @@ -244,14 +269,27 @@ * @brief * The signalDialysatePumpHardStop function stops the Dialysate pump immediately. * @details \b Inputs: none - * @details \b Outputs: currentPumpSpeed,pumpTargetSpeed,dialysatePumpState, + * @details \b Outputs: control,currentPumpSpeed,pumpTargetSpeed,dialysatePumpState, * controlTimerCounter,isDialPumpOn. * @param pumpId pump id to stop the given dialysate pump * @return none *************************************************************************/ void signalDialysatePumpHardStop( DIALYSATE_PUMPS_T pumpId ) { - stopDialysatePump( pumpId ); + //Update control to stop the dialysate pump + if ( FRESH_DIALYSATE_PUMP == pumpId ) + { + // dialysate pump control run enable + dialysatePumps[ pumpId ].control = DIALYSATE_PUMP_CONTROL_STOP; + setFPGAFreshDialysatePumpControl( dialysatePumps[ pumpId ].control ); + setFPGAFreshDialysatePumpSpeed( DIALYSATE_PUMP_SPEED_ZERO_RPM ); + } + else + { + dialysatePumps[ pumpId ].control = DIALYSATE_PUMP_CONTROL_STOP; + setFPGASpentDialysatePumpControl( dialysatePumps[ pumpId ].control ); + setFPGASpentDialysatePumpSpeed( DIALYSATE_PUMP_SPEED_ZERO_RPM ); + } // Reset all the variables to stop mode dialysatePumps[ pumpId ].currentPumpSpeed = 0.0F; @@ -315,14 +353,18 @@ * by FPGA * @details \b Outputs: measuredPumpSpeed,dialysatePumpMeasuredCurrentA, * measuredDirection,directionErrorCount - * @detail \b Alarms: ALARM_ID_DD_XXX_DIALYSATE_PUMP_RPM_OUT_OF_RANGE when - * speed mismatch occurs between set and measured speed. - * @detail \b Alarms: ALARM_ID_DD_XXX_DIALYSATE_PUMP_OFF_FAULT when dialysate - * pump runs at certain speed when not commanded to run. - * @detail \b Alarms: ALARM_ID_DD_XXX_DIALYSATE_PUMP_DIRECTION_INVALID when - * dialysate pump is not running in forward direction. - * @detail \b Alarms:ALARM_ID_DD_XXX_DIALYSATE_PUMP_CURRENT_OUT_OF_RANGE when - * dialysate pump is drawing more current than expected. + * @detail \b Alarms: ALARM_ID_DD_FRESH_DIALYSATE_PUMP_RPM_OUT_OF_RANGE, + * ALARM_ID_DD_SPENT_DIALYSATE_PUMP_RPM_OUT_OF_RANGE when speed mismatch + * occurs between set and measured speed. + * @detail \b Alarms: ALARM_ID_DD_FRESH_DIALYSATE_PUMP_OFF_FAULT, + * ALARM_ID_DD_SPENT_DIALYSATE_PUMP_OFF_FAULT when dialysate pump runs at + * certain speed when not commanded to run. + * @detail \b Alarms: ALARM_ID_DD_FRESH_DIALYSATE_PUMP_DIRECTION_INVALID, + * ALARM_ID_DD_SPENT_DIALYSATE_PUMP_DIRECTION_INVALID when dialysate pump is + * not running in forward direction. + * @detail \b Alarms:ALARM_ID_DD_FRESH_DIALYSATE_PUMP_CURRENT_OUT_OF_RANGE, + * ALARM_ID_DD_SPENT_DIALYSATE_PUMP_CURRENT_OUT_OF_RANGE when dialysate pump + * is drawing more current than expected. * @return none *************************************************************************/ void execDialysatePumpMonitor( void ) @@ -486,7 +528,7 @@ SELF_TEST_STATUS_T execDialysatePumpSelfTest( void ) { SELF_TEST_STATUS_T result = SELF_TEST_STATUS_IN_PROGRESS; - BOOL calStatus = FALSE; + BOOL calStatus = TRUE; // TODO:initialize to false when calibration records avialble // This is only one record the number of items to check is 0 since the get NV data function does not do a for loop to check the calibration time // calStatus |= getNVRecord2Driver( GET_CAL_FRESH_DIALYSATE_PUMP_RECORD, (U08*)&freshDialysatePumpRecord, sizeof( DD_FRESH_DIALYSATE_PUMP_RECORD_T ), 0, @@ -513,7 +555,7 @@ * @brief * The isDialysatePumpOn function determines whether the dialysate pump is on * or Off state. - * @details \b Inputs: none + * @details \b Inputs: dialysatePumps[] * @details \b Outputs: none * @param pumpId dialysate pump id to return status of dialysate pump running state * @return TRUE if dialysate pump is on, FALSE if not. @@ -537,11 +579,11 @@ DIALYSATE_PUMP_STATE_T result = DIALYSATE_PUMP_OFF_STATE; F32 targetSpeed = getDialysatePumpTargetSpeed( pumpId ); - if ( targetSpeed > NEARLY_ZERO ) + if ( targetSpeed > ZERO_SPEED ) { if ( FRESH_DIALYSATE_PUMP == pumpId ) { - // dialysate pump control run enable + // dialysate pump control run enable, forward run only. dialysatePumps[ pumpId ].control = DIALYSATE_PUMP_CONTROL_RUN; setFPGAFreshDialysatePumpControl( dialysatePumps[ pumpId ].control ); } @@ -606,7 +648,7 @@ BOOL hasTgtBeenReached = FALSE; F32 currentToTargetDiff = fabs( getDialysatePumpTargetSpeed( pumpId ) - dialysatePumps[ pumpId ].currentPumpSpeed ); - if ( currentToTargetDiff > NEARLY_ZERO ) + if ( currentToTargetDiff > ZERO_SPEED ) { if ( currentToTargetDiff > DIALYSATE_PUMP_SPEED_INCREMENT ) { @@ -627,13 +669,13 @@ dialysatePumps[ pumpId ].currentPumpSpeed += speedIncrease; // If the pump's target speed is set to be 0, do not ramp down set it to zero immediately - if ( getDialysatePumpTargetSpeed( pumpId ) < NEARLY_ZERO ) + if ( getDialysatePumpTargetSpeed( pumpId ) < ZERO_SPEED ) { dialysatePumps[ pumpId ].currentPumpSpeed = 0.0F; } } - if ( dialysatePumps[ pumpId ].currentPumpSpeed > NEARLY_ZERO ) + if ( dialysatePumps[ pumpId ].currentPumpSpeed > ZERO_SPEED ) { if ( FRESH_DIALYSATE_PUMP == pumpId ) { @@ -700,41 +742,14 @@ //Set spent dialyate pump speed setFPGASpentDialysatePumpSpeed( (U16)dialysatePumps[ pumpId ].currentPumpSpeed ); } - dialysatePumps[ pumpId ].controlTimerCounter = 0; + dialysatePumps[ pumpId ].controlTimerCounter = 0; } return state; } /*********************************************************************//** * @brief - * The stopDialysatePump function sets the given dialysate pump rpm to zero and stops - * the pump. - * @details \b Inputs: dialysatePumps - * @details \b Outputs: dialysatePumps - * @param pumpId dialysate pump id to set the diaylsate pump control - * @return none - *************************************************************************/ -static void stopDialysatePump( DIALYSATE_PUMPS_T pumpId ) -{ - //Update control to stop the dialysate pump - if ( FRESH_DIALYSATE_PUMP == pumpId ) - { - // dialysate pump control run enable - dialysatePumps[ pumpId ].control = DIALYSATE_PUMP_CONTROL_STOP; - setFPGAFreshDialysatePumpControl( dialysatePumps[ pumpId ].control ); - setFPGAFreshDialysatePumpSpeed( DIALYSATE_PUMP_SPEED_ZERO_RPM ); - } - else - { - dialysatePumps[ pumpId ].control = DIALYSATE_PUMP_CONTROL_STOP; - setFPGASpentDialysatePumpControl( dialysatePumps[ pumpId ].control ); - setFPGASpentDialysatePumpSpeed( DIALYSATE_PUMP_SPEED_ZERO_RPM ); - } -} - -/*********************************************************************//** - * @brief * The getDialysatePumpTargetSpeed function gets the current target speed for the given * dialysate pump. * @details \b Inputs: pumpTargetSpeed