Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r3250a641e46b5338671a5b830189ffb3694d1284 -r8d1ae378f26055b881c2b06b7163997d858b1342 --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 3250a641e46b5338671a5b830189ffb3694d1284) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 8d1ae378f26055b881c2b06b7163997d858b1342) @@ -65,7 +65,7 @@ #ifndef SLOW_SYRINGE_RETRACT #define SYRINGE_PUMP_RETRACT_RATE 10800.0 ///< Retract rate is 15 mL/ 5 s = 3 mL/s = 10,800 mL/hr. #else -#define SYRINGE_PUMP_RETRACT_RATE 3600.0 ///< Retract rate is 15 mL/ 5 s = 3 mL/s = 10,800 mL/hr. +#define SYRINGE_PUMP_RETRACT_RATE 3600.0 ///< Retract rate is 5 mL/ 5 s = 1 mL/s = 3,600 mL/hr. #endif #define SYRINGE_PUMP_SEEK_RATE 3600.0 ///< Seek plunger rate is 5 mL/ 5 s = 1 mL/s = 3,600 mL/hr. #define SYRINGE_PUMP_PRIME_RATE 635.0 ///< Prime rate is 0.5 mm ^ 2 x PI x 450 mm = 0.353 mL / 2s = 635 mL/hr. @@ -249,6 +249,7 @@ static BOOL checkMaxTravel( BOOL stopPump, S32 maxPos ); static BOOL checkMeasRate( BOOL stopPump, F32 pctMargin ); static BOOL checkVolumeVsSafetyVolume( BOOL stopPump, F32 pctMargin ); +static BOOL checkForStall( BOOL stopPump ); static void publishSyringePumpData( void ); /*********************************************************************//** @@ -1142,6 +1143,9 @@ // Calculate target FPGA rate from set rate in mL/hr converted to microstep toggle interval in uSec calcStepperToggleTimeForTargetRate( syringePumpSetRate ); setFPGASyringePumpStepToggleTime( syringePumpRampUpToggleTime ); + // Reset stall detect variables + syringePumpStallRetryCount = 0; + syringePumpStallCtr = 0; } // Reset ramp up timer @@ -1163,31 +1167,7 @@ SYRINGE_PUMP_STATE_T result = SYRINGE_PUMP_RETRACT_STATE; BOOL stopPump = FALSE; - // Check for stall - if ( fabs( getSyringePumpMeasRate() ) < SYRINGE_PUMP_STALL_SPEED_THRESHOLD ) - { - if ( ++syringePumpStallCtr > SYRINGE_PUMP_RAMP_STALL_TIME ) - { - if ( ++syringePumpStallRetryCount <= SYRINGE_PUMP_RAMP_STALL_RETRIES ) - { - syringePumpSetToggleTime++; // lower target rate - syringePumpRampTimerCtr = 0; // restart ramp - syringePumpRampUpToggleTime = SYRINGE_PUMP_START_RAMP_SPEED; - syringePumpStallCtr = 0; // reset stall counter - } - else - { - stopPump = TRUE; - // TODO - stall alarm? - } - } - } - else - { - syringePumpStallCtr = 0; - } - - // Handle ramp up + // Handle ramp up rampSyringePump(); // Stop retract when home position is detected @@ -1216,6 +1196,8 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SYRINGE_PUMP_OVER_TRAVEL_ERROR, (U32)getSyringePumpPosition(), (U32)SYRINGE_PUMP_RETRACT_STATE ); } + stopPump = checkForStall( stopPump ); + stopPump = checkDirection( stopPump, MOTOR_DIR_REVERSE ); // If anything found that would require stopping the pump, stop pump and go to off state @@ -1648,6 +1630,33 @@ return result; } +static BOOL checkForStall( BOOL stopPump ) +{ + // Check for stall + if ( fabs( getSyringePumpMeasRate() ) < SYRINGE_PUMP_STALL_SPEED_THRESHOLD ) + { + if ( ++syringePumpStallCtr > SYRINGE_PUMP_RAMP_STALL_TIME ) + { + if ( ++syringePumpStallRetryCount <= SYRINGE_PUMP_RAMP_STALL_RETRIES ) + { + syringePumpSetToggleTime++; // lower target rate + syringePumpRampTimerCtr = 0; // restart ramp + syringePumpRampUpToggleTime = SYRINGE_PUMP_START_RAMP_SPEED; + syringePumpStallCtr = 0; // reset stall counter + } + else + { + stopPump = TRUE; + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SYRINGE_PUMP_STALL, (U32)getSyringePumpPosition(), (U32)syringePumpState ); + } + } + } + else + { + syringePumpStallCtr = 0; + } +} + /*********************************************************************//** * @brief * The rampSyringePump function handles the ramp-up for the syringe pump.