Index: firmware/App/Drivers/GLXferPump.c =================================================================== diff -u -r395522dffef1348e176564925656012f529c1910 -ra452377c3d89ff36fa90faef5e3790e2322237a3 --- firmware/App/Drivers/GLXferPump.c (.../GLXferPump.c) (revision 395522dffef1348e176564925656012f529c1910) +++ firmware/App/Drivers/GLXferPump.c (.../GLXferPump.c) (revision a452377c3d89ff36fa90faef5e3790e2322237a3) @@ -15,6 +15,8 @@ * ***************************************************************************/ +#include + #include "AlarmMgmtTD.h" #include "FpgaTD.h" #include "GLXferPump.h" @@ -29,13 +31,20 @@ // ********** private definitions ********** #define AIR_PUMP_PWM_TIME 20 ///< Time (in 10ns increments) per PWM register count for the air pump = 20 kHz. +#define AIR_PUMP_RPM_FACTOR 60 ///< Air pump rpm pump factor +#define TEN_MICRO ( 10 * 1E-6F ) ///< 10 X 10^-6 +#define MOTOR_RPM_ZERO_RAW 0xFFFFU ///< Air pump Zero RPM // ********** private data ********** -static U08 currentAirPumpMotorPowerLevel; ///< Current air pump motor state: 0=off, 1..255=power level. +static F32 currentAirPumpMotorPowerLevel; ///< Current air pump motor state: 0=off, 1..255=power level. // ********** private function prototypes ********** +static U08 convertPercentageToScalar( F32 percentage ); +// TODO: remove after validating power +static U08 scalarPowerLevel; ///< Current scalar power level + /*********************************************************************//** * @brief * The initGasLiqXferPumpDriver function initializes the gas/liquid transfer @@ -44,7 +53,7 @@ * @details \b Outputs: currentAirPumpMotorPowerLevel * @return none *************************************************************************/ -void initGasLiqXferPumpDriver(void) +void initGasLiqXferPumpDriver( void ) { currentAirPumpMotorPowerLevel = AIR_PUMP_MOTOR_OFF; setH12AirPumpMotorPowerLevel( currentAirPumpMotorPowerLevel ); @@ -54,20 +63,22 @@ /*********************************************************************//** * @brief * The setAirPumpMotorPower function sets the air pump motor to the given - * power level. + * power level in duty cycle percentage (0..100%). * @details \b Message \b Sent: MSG_ID_TD_EVENT if changing air pump power level. * @details \b Inputs: none * @details \b Outputs: currentAirPumpMotorPowerLevel - * @param power Power level for air pump (0=off, 1..255=lower to higher power level). + * @param power Power level for air pump (0=off, 1..100=lower to higher power level). * @return none. *************************************************************************/ -void setAirPumpMotorPower( U08 power ) +void setAirPumpMotorPower( F32 power ) { + U08 scalarPower = scalarPowerLevel = convertPercentageToScalar( power ); + // if state is changing, set the air pump to the given on/off state and send event if ( power != currentAirPumpMotorPowerLevel ) { - SEND_EVENT_WITH_2_U32_DATA( TD_EVENT_AIR_PUMP_ON_OFF, (U32)currentAirPumpMotorPowerLevel, (U32)power ); - setH12AirPumpMotorPowerLevel( power ); + setH12AirPumpMotorPowerLevel( scalarPower ); + SEND_EVENT_WITH_2_F32_DATA( TD_EVENT_AIR_PUMP_ON_OFF, currentAirPumpMotorPowerLevel, power ); currentAirPumpMotorPowerLevel = power; } } @@ -80,12 +91,86 @@ * @details \b Outputs: none * @return Current set power level of the air pump motor. *************************************************************************/ -U08 getAirPumpMotorPower( void ) +F32 getAirPumpMotorPower( void ) { return currentAirPumpMotorPowerLevel; } +/*********************************************************************//** + * @brief + * The getAirPumpMotorScalarPower function gets the current set scalar power level of the + * air pump motor. + * @details \b Inputs: none + * @details \b Outputs: scalarPowerLevel + * @return Current set scalar power level of the air pump motor. + *************************************************************************/ +U32 getAirPumpMotorScalarPower( void ) +{ + return (U32)scalarPowerLevel; +} +/*********************************************************************//** +* @brief +* The getAirPumpMotorFPGARPM function reads the air pump RPM from FPGA. +* minimum RPM that reports is 400 rpm and anything slower considered 0 (0xFFFF) +* @details \b Inputs: none +* @details \b Outputs: none +* @return air pump motor FPGA_RPM value. +*************************************************************************/ +U16 getAirPumpMotorFPGARPM( void ) +{ + U16 fpgaRPM = getH12AirPumpMotorRPM(); + + return fpgaRPM; +} + +/*********************************************************************//** +* @brief +* The getAirPumpMotorRPM function reads the air pump RPM from FPGA. +* minimum RPM that reports is 400 rpm and anything slower considered 0 (0xFFFF) +* to convert the real RPM, use the formula rpm = (60.0 / ( getH12AirPumpMotorRPM() * 10 * 1E-6 ) +* @details \b Inputs: none +* @details \b Outputs: none +* @return air pump motor RPM value. +*************************************************************************/ +U16 getAirPumpMotorRPM( void ) +{ + F32 realRPM; + U16 fpgaRPM = getH12AirPumpMotorRPM(); + + if ( MOTOR_RPM_ZERO_RAW == fpgaRPM ) + { + realRPM = 0.0F; + } + else + { + realRPM = ( ( ( F32 )AIR_PUMP_RPM_FACTOR ) / ( F32 )( fpgaRPM * TEN_MICRO ) ); + } + + return ( U16 )realRPM; +} + +/*********************************************************************//** + * @brief + * The PercentageToScalar function convert percentage 0-100% duty + * cycle to 0-250 scalar value. + * @details \b Inputs: none + * @details \b Outputs: none + * @param percentage Power level for air pump (0=off, 1-100.0 for ON). + * @return U08 8-bit PWM value (0-250) + *************************************************************************/ +static U08 convertPercentageToScalar( F32 percentage ) +{ + F32 power; + + // Clamp input to 0-100% + power = RANGE( percentage, AIR_PUMP_DUTY_CYCLE_MIN, AIR_PUMP_DUTY_CYCLE_MAX ); + + // Calculate 0-250 scalar value = ( power / 100 ) * 250 + return (U08)( ceilf ( ( ( power / FRACTION_TO_PERCENT_FACTOR ) * (F32)AIR_PUMP_MAX_PWM ) ) ); +} + + /************************************************************************* * TEST SUPPORT FUNCTIONS *************************************************************************/