Index: firmware/App/Controllers/SyringePump.c =================================================================== diff -u -rcda8fe9d5b19e8a8bc20c8d4aeb0bb286e555b6f -r893bdb4ea1636ae343babcd830d6ddf7c71535d0 --- firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision cda8fe9d5b19e8a8bc20c8d4aeb0bb286e555b6f) +++ firmware/App/Controllers/SyringePump.c (.../SyringePump.c) (revision 893bdb4ea1636ae343babcd830d6ddf7c71535d0) @@ -79,8 +79,7 @@ #define SYRINGE_PUMP_PRIME_VOLUME_ML 0.353 ///< Target syringe prime volume (in mL). #define SYRINGE_PUMP_START_RAMP_SPEED 300000 ///< Starting speed for all syringe pump operations to ramp up from. -#define SYRINGE_PUMP_RAMP_NUMERATOR 15 ///< Numerator of ramp period reduction fraction. -#define SYRINGE_PUMP_RAMP_DENOMINATOR 16 ///< Denominator of ramp period reduction fraction. +#define SYRINGE_PUMP_RAMP_DIVISOR 5 ///< Used for ramping profile. // Bit definitions for syringe pump control register #define SYRINGE_PUMP_CONTROL_SLEEP_OFF 0x40 ///< Syringe pump control register bit for sleep mode (active low). @@ -146,6 +145,7 @@ static SYRINGE_PUMP_STATE_T syringePumpState; ///< Current state of syringe pump control state machine. static U32 syringePumpDataPublicationTimerCounter; ///< Used to schedule syringe pump data publication to CAN bus. static U32 syringePumpSpeedCalcTimerCounter; ///< Used to calculate measured rate from change in position over time. +static U32 syringePumpRampTimerCtr; ///< Used to track ramp up time. /// Interval (in ms) at which to publish syringe pump data to CAN bus. static OVERRIDE_U32_T syringePumpDataPublishInterval = { SYRINGE_PUMP_DATA_PUB_INTERVAL, SYRINGE_PUMP_DATA_PUB_INTERVAL, 0, 0 }; @@ -178,9 +178,6 @@ static SYRINGE_PUMP_SELF_TEST_STATE_T syringePumpSelfTestState; ///< Current syringe pump self-test state. static U32 syringePumpSelfTestTimerCount; ///< Timer counter for syringe pump self-test. - -// TODO - test code -static U32 xTimerCtr; // ********** private function prototypes ********** @@ -200,6 +197,7 @@ static SYRINGE_PUMP_STATE_T handleSyringePumpBolusState( void ); static SYRINGE_PUMP_STATE_T handleSyringePumpContinuousState( void ); static SYRINGE_PUMP_STATE_T handleSyringePumpCalibrateForceSensorState( void ); +static void rampSyringePump( void ); static void calcStepperToggleTimeForTargetRate( F32 rate ); static void calcMeasRate( void ); static void calcSafetyVolumeDelivered( void ); @@ -233,6 +231,7 @@ syringePumpDataPublicationTimerCounter = 0; syringePumpSelfTestTimerCount = 0; syringePumpSpeedCalcTimerCounter = 0; + syringePumpRampTimerCtr = 0; lastSyringePumpADCReadCtr = 0; @@ -769,8 +768,8 @@ setFPGASyringePumpStepToggleTime( syringePumpRampUpToggleTime ); } - // TODO - test code - xTimerCtr = 0; + // Reset ramp up timer + syringePumpRampTimerCtr = 1; return result; } @@ -788,26 +787,9 @@ SYRINGE_PUMP_STATE_T result = SYRINGE_PUMP_RETRACT_STATE; // Handle ramp up - xTimerCtr++; - if ( syringePumpRampUpToggleTime > syringePumpSetToggleTime ) - { - //syringePumpRampUpToggleTime *= SYRINGE_PUMP_RAMP_NUMERATOR; - //syringePumpRampUpToggleTime /= SYRINGE_PUMP_RAMP_DENOMINATOR; - syringePumpRampUpToggleTime = (F32)SYRINGE_PUMP_START_RAMP_SPEED / (F32)(xTimerCtr * xTimerCtr * xTimerCtr / 3); - if ( syringePumpRampUpToggleTime > syringePumpSetToggleTime ) - { - setFPGASyringePumpStepToggleTime( syringePumpRampUpToggleTime ); - } - else - { - setFPGASyringePumpStepToggleTime( syringePumpSetToggleTime ); - } - } -// else -// { -// setFPGASyringePumpStepToggleTime( syringePumpSetToggleTime ); -// } + rampSyringePump(); + // Stop retract when home position is detected if ( TRUE == isSyringePumpHome() ) { stopSyringePump(); @@ -817,6 +799,7 @@ syringePumpHasBeenHomed = TRUE; result = SYRINGE_PUMP_OFF_STATE; } + // Stop retract if syringe is detected (should not have a syringe loaded during retract) else if ( TRUE == isSyringeDetected() ) { stopSyringePump(); @@ -841,20 +824,10 @@ BOOL stopPump = FALSE; // Handle ramp up - xTimerCtr++; - if ( syringePumpRampUpToggleTime > syringePumpSetToggleTime ) - { - syringePumpRampUpToggleTime *= SYRINGE_PUMP_RAMP_NUMERATOR; - syringePumpRampUpToggleTime /= SYRINGE_PUMP_RAMP_DENOMINATOR; - setFPGASyringePumpStepToggleTime( syringePumpRampUpToggleTime ); - } - else - { - setFPGASyringePumpStepToggleTime( syringePumpSetToggleTime ); - } + rampSyringePump(); // Is plunger contact detected? - if ( ( xTimerCtr > 500 ) ) //|| ( getSyringePumpForceV() >= SYRINGE_FORCE_PLUNGER_THRESHOLD_V ) ) + if ( ( syringePumpRampTimerCtr > 500 ) ) //|| ( getSyringePumpForceV() >= SYRINGE_FORCE_PLUNGER_THRESHOLD_V ) ) { stopPump = TRUE; syringePumpVolumeDelivered.data = 0.0; @@ -891,17 +864,7 @@ BOOL stopPump = FALSE; // Handle ramp up - xTimerCtr++; - if ( syringePumpRampUpToggleTime > syringePumpSetToggleTime ) - { - syringePumpRampUpToggleTime *= SYRINGE_PUMP_RAMP_NUMERATOR; - syringePumpRampUpToggleTime /= SYRINGE_PUMP_RAMP_DENOMINATOR; - setFPGASyringePumpStepToggleTime( syringePumpRampUpToggleTime ); - } - else - { - setFPGASyringePumpStepToggleTime( syringePumpSetToggleTime ); - } + rampSyringePump(); // Has prime volume been delivered? if ( getSyringePumpVolumeDelivered() >= SYRINGE_PUMP_PRIME_VOLUME_ML ) @@ -939,6 +902,9 @@ SYRINGE_PUMP_STATE_T result = SYRINGE_PUMP_HEP_BOLUS_STATE; BOOL stopPump = FALSE; + // Handle ramp up + rampSyringePump(); + // Is bolus completed? if ( getSyringePumpVolumeDelivered() >= 2.0 ) // TODO - get bolus volume from treatment params { @@ -978,6 +944,9 @@ SYRINGE_PUMP_STATE_T result = SYRINGE_PUMP_HEP_CONTINUOUS_STATE; BOOL stopPump = FALSE; + // Handle ramp up + rampSyringePump(); + // Has syringe been removed? stopPump = checkSyringeRemoved( stopPump ); @@ -1131,6 +1100,31 @@ return result; } + +/*********************************************************************//** + * @brief + * The rampSyringePump function handles the ramp-up for the syringe pump. + * @details Inputs: syringePumpRampTimerCtr, syringePumpSetToggleTime + * @details Outputs: syringePumpRampUpToggleTime + * @return none + *************************************************************************/ +static void rampSyringePump( void ) +{ + syringePumpRampTimerCtr++; + if ( syringePumpRampUpToggleTime > syringePumpSetToggleTime ) + { + syringePumpRampUpToggleTime = (U32)((F32)SYRINGE_PUMP_START_RAMP_SPEED / + (F32)( syringePumpRampTimerCtr * syringePumpRampTimerCtr * syringePumpRampTimerCtr / SYRINGE_PUMP_RAMP_DIVISOR )); + if ( syringePumpRampUpToggleTime > syringePumpSetToggleTime ) + { + setFPGASyringePumpStepToggleTime( syringePumpRampUpToggleTime ); + } + else + { + setFPGASyringePumpStepToggleTime( syringePumpSetToggleTime ); + } + } +} /*********************************************************************//** * @brief