Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -r21180e0b65fddfa27f66d8fb59cb55b2db304230 -r1ed578758e10879581ed9c6acfaddd9a7c661168 --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 21180e0b65fddfa27f66d8fb59cb55b2db304230) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 1ed578758e10879581ed9c6acfaddd9a7c661168) @@ -98,7 +98,7 @@ #define SYRINGE_PUMP_RETRACT_POS_MIN ( SYRINGE_ENCODER_COUNTS_PER_ML * -0.5 ) #define SYRINGE_PUMP_START_RAMP_SPEED 300000 ///< Starting speed for all syringe pump operations to ramp up from. -#define SYRINGE_PUMP_RAMP_DIVISOR 11 ///< Used for ramping profile. +#define SYRINGE_PUMP_RAMP_DIVISOR 15 ///< Used for ramping profile. #define SYRINGE_PUMP_RATE_CHECK_MARGIN 0.05 ///< 5 pct margin on commanded vs. measured rate check. #define SYRINGE_PUMP_VOLUME_CHECK_MARGIN 0.05 ///< 5 pct margin on commanded vs. encoder based volume check. @@ -143,8 +143,9 @@ #define SYRINGE_PUMP_ENCODER_DIRECTION_ERROR_BITS 0x3F ///< Syringe pump encoder direction error counter bits in FPGA register. #define SYRINGE_PUMP_ENCODER_DIRECTION_BIT 0x80 ///< Syringe pump encoder direction bit in FPGA register. -#define SYRINGE_PUMP_RAMP_STALL_TIME ( 500 / TASK_PRIORITY_INTERVAL ) ///< Syringe pump ramp stall timeout. +#define SYRINGE_PUMP_RAMP_STALL_TIME ( 1500 / TASK_PRIORITY_INTERVAL ) ///< Syringe pump ramp stall timeout. #define SYRINGE_PUMP_RAMP_STALL_RETRIES 3 ///< Syringe pump ramp stall retries allowed. +#define SYRINGE_PUMP_STALL_SPEED_THRESHOLD 0.05 ///< Minimum syringe pump speed to be considered not stalled. /// Defined states for the syringe pump control state machine. typedef enum SyringePump_States @@ -972,7 +973,7 @@ if ( TRUE == isPersistentAlarmTriggered( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR, ( ( getCurrentOperationMode() > MODE_INIT ) && ( lastSyringePumpADCReadCtr == getSyringePumpADCReadCounter() ) ) ) ) { - activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR ); +// activateAlarmNoData( ALARM_ID_HD_SYRINGE_PUMP_ADC_ERROR ); } lastSyringePumpADCReadCtr = getSyringePumpADCReadCounter(); @@ -1154,6 +1155,30 @@ SYRINGE_PUMP_STATE_T result = SYRINGE_PUMP_RETRACT_STATE; BOOL stopPump = FALSE; + // Check for stall + if ( 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 rampSyringePump(); @@ -1620,31 +1645,6 @@ *************************************************************************/ static void rampSyringePump( void ) { - // Check for ramp stall - restart ramp if retry allowed - if ( syringePumpLastPosition == getSyringePumpPosition() ) - { - syringePumpStallCtr++; - if ( syringePumpStallCtr >= SYRINGE_PUMP_RAMP_STALL_TIME ) - { - if ( ++syringePumpStallRetryCount <= SYRINGE_PUMP_RAMP_STALL_RETRIES ) - { - // Restart ramp - syringePumpRampTimerCtr = 0; - syringePumpRampUpToggleTime = SYRINGE_PUMP_START_RAMP_SPEED; - } - else - { - // TODO - stall alarm - stopSyringePump(); - syringePumpState = SYRINGE_PUMP_OFF_STATE; - } - } - else - { - syringePumpStallCtr = 0; - } - } - // Ramp up syringe pump toward target speed syringePumpRampTimerCtr++; if ( syringePumpRampUpToggleTime > syringePumpSetToggleTime ) @@ -1673,13 +1673,14 @@ *************************************************************************/ static void calcStepperToggleTimeForTargetRate( F32 rate ) { - F32 conv = 0.0; + double temp; + F32 conv; // Convert given rate to stepper toggle period - conv = rate * SYRINGE_MICRO_STEPS_PER_ML; // = uSteps/hr - conv /= (F32)( MIN_PER_HOUR * SEC_PER_MIN); // = uSteps/sec - conv /= MICRO_SECONDS_PER_SECOND; // = uSteps/uSec - conv *= SYRINGE_TOGGLES_PER_STEP; // = toggles/uSec + temp = (double)rate * SYRINGE_MICRO_STEPS_PER_ML; // = uSteps/hr + temp /= (double)( MIN_PER_HOUR * SEC_PER_MIN); // = uSteps/sec + temp /= MICRO_SECONDS_PER_SECOND; // = uSteps/uSec + conv = (F32)temp * SYRINGE_TOGGLES_PER_STEP; // = toggles/uSec conv = 1.0 / conv; // = uSec/toggle // Set stepper toggle time to calculated value syringePumpSetToggleTime = FLOAT_TO_INT_WITH_ROUND( conv );