Index: firmware/App/Drivers/PeristalticPump.c =================================================================== diff -u -r52e1d4487a69a1ef0475321084527c0ba86c0892 -raa6d45143096dfab776ce2ed7c775cfe2dd6db18 --- firmware/App/Drivers/PeristalticPump.c (.../PeristalticPump.c) (revision 52e1d4487a69a1ef0475321084527c0ba86c0892) +++ firmware/App/Drivers/PeristalticPump.c (.../PeristalticPump.c) (revision aa6d45143096dfab776ce2ed7c775cfe2dd6db18) @@ -38,15 +38,21 @@ #define H4_HZ_TO_RPM(h) ((h) * H4_HZ_TO_RPM_SCALAR) ///< Blood pump Hz to RPM conversion macro. #define H4_ZERO_SPEED_PERIOD 0xFFFF ///< Blood pump period reported when pump is stopped. +#define H4_ROT_GEAR_RATIO 64.0F ///< Blood pump rotor to motor gear ratio. +#define H4_ROT_PERIOD_SEC 0.001F ///< Blood pump rotor feedback period in seconds. +#define H4_ROT_PERIOD_TO_HZ(p) ( 1.0F / (F32)((S32)(p) * H4_ROT_PERIOD_SEC) ) ///< Blood pump rotor period to Hz conversion macro. +#define H4_ROT_PERIOD_TO_RPM(p) ((H4_ROT_PERIOD_TO_HZ(p)) * (F32)SEC_PER_MIN) ///< Blood pump rotor period to RPM conversion macro. + #define H4_HOME_SPEED_RPM 400 ///< Blood pump set speed for rotor homing operation. #define H6_STATUS_HOME_BIT_POS 0x1 ///< Bit position in H6 status register that indicates whether rotor is in home position. // ********** private data ********** static S32 pumpSetSpeedRPM; ///< Current set speed for the pump (in RPM). Negative indicates reverse direction. -static OVERRIDE_F32_T pumpMeasSpeedRPM; ///< Latest measured pump speed (in RPM). -static BOOL pumpHomeRequested; ///< Flag indicates a pump home operation has been requested. +static F32 pumpMeasSpeedRPM; ///< Latest measured pump speed (in RPM). +static F32 pumpMeasRotSpeedRPM; ///< Latest measured pump rotor speed (in RPM). +static BOOL pumpHomeInProgress; ///< Flag indicates a pump home operation is in progress. // ********** private function prototypes ********** @@ -60,12 +66,10 @@ *************************************************************************/ void initPeristalticPumpDriver(void) { - pumpHomeRequested = FALSE; + pumpHomeInProgress = FALSE; pumpSetSpeedRPM = 0; - pumpMeasSpeedRPM.data = 0.0F; - pumpMeasSpeedRPM.ovData = 0.0F; - pumpMeasSpeedRPM.ovInitData = 0.0F; - pumpMeasSpeedRPM.override = OVERRIDE_RESET; + pumpMeasSpeedRPM = 0.0F; + pumpMeasRotSpeedRPM = 0.0F; setH4Direction( MOTOR_DIR_FORWARD ); setH4SetSpeed( 0 ); @@ -78,37 +82,49 @@ * peristaltic pump from the FPGA. * @note This function should be called periodically to maintain fresh * sensor readings for the pump. - * @details \b Inputs: pumpSetSpeedRPM, pumpHomeRequested, FPGA - * @details \b Outputs: pumpMeasSpeedRPM, pumpHomeRequested + * @details \b Inputs: pumpSetSpeedRPM, pumpHomeInProgress, FPGA + * @details \b Outputs: pumpMeasSpeedRPM, pumpHomeInProgress * @return none *************************************************************************/ void readPeristalticPumps( void ) { U16 period = getH4Period(); - F32 Hz = H4_PERIOD_TO_HZ(period); - F32 rpm = H4_HZ_TO_RPM(Hz); + S16 rotPer = getH4RotorCount(); - // update measured pump speed + // update measured pump motor speed if ( period != H4_ZERO_SPEED_PERIOD ) { + F32 Hz = H4_PERIOD_TO_HZ( period ); + F32 rpm = H4_HZ_TO_RPM( Hz ); + if ( pumpSetSpeedRPM < 0 ) // TODO - can we get a real measured direction to base measured speed sign on? { - pumpMeasSpeedRPM.data = rpm * -1.0F; + pumpMeasSpeedRPM = rpm * -1.0F; } else { - pumpMeasSpeedRPM.data = rpm; + pumpMeasSpeedRPM = rpm; } } else { - pumpMeasSpeedRPM.data = 0.0F; + pumpMeasSpeedRPM = 0.0F; } - // monitor home command status if in progress, stop pump if rotor in home position - if ( ( TRUE == pumpHomeRequested ) && ( TRUE == isPeristalticPumpHome() ) ) + // update measured pump rotor speed + if ( rotPer != 0 ) { - pumpHomeRequested = FALSE; + pumpMeasRotSpeedRPM = H4_ROT_PERIOD_TO_RPM( rotPer ); + } + else + { + pumpMeasRotSpeedRPM = 0.0F; + } + + // monitor home command status if in progress, stop pump if rotor is in home position + if ( ( TRUE == pumpHomeInProgress ) && ( TRUE == isPeristalticPumpHome() ) ) + { + pumpHomeInProgress = FALSE; setPeristalticPumpSetSpeed( 0 ); } } @@ -117,17 +133,18 @@ * @brief * The cmdPeristalticPumpHome function initiates a pump home operation. * @details \b Inputs: none - * @details \b Outputs: pumpHomeRequested, FPGA + * @details \b Outputs: pumpHomeInProgress, FPGA * @return TRUE if home operation is initiated, FALSE if not *************************************************************************/ BOOL cmdPeristalticPumpHome( void ) { BOOL result = FALSE; - if ( ( 0 == pumpSetSpeedRPM ) && ( pumpHomeRequested != TRUE ) ) + // Pump must be stopped before homing + if ( ( 0 == pumpSetSpeedRPM ) && ( pumpHomeInProgress != TRUE ) ) { result = TRUE; - pumpHomeRequested = TRUE; + pumpHomeInProgress = TRUE; setPeristalticPumpSetSpeed( H4_HOME_SPEED_RPM ); } @@ -213,9 +230,21 @@ *************************************************************************/ F32 getPeristalticPumpMeasSpeed( void ) { - F32 result = getF32OverrideValue( &pumpMeasSpeedRPM ); + return pumpMeasSpeedRPM; +} - return result; +/*********************************************************************//** + * @brief + * The getPeristalticPumpMeasRotorSpeed function gets the latest measured pump + * rotor speed in RPM. + * @note A negative speed indicates reverse direction. + * @details \b Inputs: pumpMeasRotSpeedRPM + * @details \b Outputs: none + * @return Latest measured pump rotor speed in RPM. + *************************************************************************/ +F32 getPeristalticPumpMeasRotorSpeed( void ) +{ + return pumpMeasRotSpeedRPM; } /**@}*/