Index: firmware/App/Drivers/PressureSensor.c =================================================================== diff -u -re2e51b0219db0132cebb6f65f3dbd803e1f01e30 -rfefb47e88a5285e99498efb830fdceb9e95c2c3e --- firmware/App/Drivers/PressureSensor.c (.../PressureSensor.c) (revision e2e51b0219db0132cebb6f65f3dbd803e1f01e30) +++ firmware/App/Drivers/PressureSensor.c (.../PressureSensor.c) (revision fefb47e88a5285e99498efb830fdceb9e95c2c3e) @@ -20,6 +20,7 @@ #include "Messaging.h" #include "PersistentAlarm.h" #include "PressureSensor.h" +#include "TemperatureSensors.h" /** * @addtogroup PressureSensor @@ -29,17 +30,39 @@ // ********** private definitions ********** #define PRES_SENSORS_COUNT_ERROR_TIMEOUT_MS ( 2 * MS_PER_SECOND ) ///< Pressure sensors read and error count timeout in milliseconds. +#define ONE_BAR_TO_MILLI_BAR 1000 ///< 1 bar to milli-bar conversion. +#define COUNTS_TO_MILLI_BAR 100 ///< Counts to milli-bar conversion. +#define BAR_TO_MMHG ( 750.062F ) ///< Conversion factor for converting bar to mmHg. + +/// Barometric sensor conversion coefficients +typedef struct +{ + U16 pressureSensitivity; ///< Barometric sensor pressure sensitivity constant. + U16 pressureOffset; ///< Barometric sensor pressure offset constant. + U16 pressureSensitivityTempCoeff; ///< Barometric sensor pressure sensitivity temperature coefficient. + U16 pressureOffsetTempCoeff; ///< Barometric sensor pressure offset temperature coefficient. +} BARO_SENSOR_CONSTS_T; // ********** private data ********** static OVERRIDE_F32_T currentPressureReadings[ NUM_OF_PRESSURE_SENSORS ]; ///< Current pressure sensor pressure readings (overrideable). static OVERRIDE_F32_T currentPresTempReadings[ NUM_OF_PRESSURE_SENSORS ]; ///< Current pressure sensor temperature readings (overrideable). static OVERRIDE_U32_T lastPressureReadCounter[ NUM_OF_PRESSURE_SENSORS ]; ///< Last pressure sensor read count (Overrideable). static OVERRIDE_U32_T lastPressureErrorCounter[ NUM_OF_PRESSURE_SENSORS ]; ///< Last pressure sensor error count (Overrideable). +static BARO_SENSOR_CONSTS_T baroConvConsts; ///< Barometric sensor conversion constants. + +static const U32 TWO_TO_POWER_OF_6 = ( 1 << 6 ); ///< 2^6. +static const U32 TWO_TO_POWER_OF_7 = ( 1 << 7 ); ///< 2^7. +static const U32 TWO_TO_POWER_OF_15 = ( 1 << 15 ); ///< 2^15. +static const U32 TWO_TO_POWER_OF_16 = ( 1 << 16 ); ///< 2^16. +static const U32 TWO_TO_POWER_OF_17 = ( 1 << 17 ); ///< 2^17. +static const U32 TWO_TO_POWER_OF_21 = ( 1 << 21 ); ///< 2^21. // ********** private function prototypes ********** static void checkPressureSensors( void ); +static F32 convertBaroPressureReading2mmHg( U32 rawPressure ); +static F32 calculateBaroPressure( U32 pressure ); /*********************************************************************//** * @brief @@ -76,6 +99,12 @@ lastPressureErrorCounter[ i ].override = OVERRIDE_RESET; } + //Initialize baro variable + baroConvConsts.pressureOffset = 0; + baroConvConsts.pressureOffsetTempCoeff = 0; + baroConvConsts.pressureSensitivity = 0; + baroConvConsts.pressureSensitivityTempCoeff = 0; + // Initialize the FPGA persistent alarms initFPGAPersistentAlarm( FPGA_PERS_ERROR_HYDRAULICS_OUTLET_PRESSURE, ALARM_ID_DD_HYD_OUTLET_PRES_TIMEOUT_FAULT, PRES_SENSORS_COUNT_ERROR_TIMEOUT_MS, PRES_SENSORS_COUNT_ERROR_TIMEOUT_MS ); @@ -110,6 +139,7 @@ currentPressureReadings[ PRESSURE_SENSOR_SPENT_DIALYSATE ].data = convertPressureReading2mmHg( getFPGAPDsRawPressure() ); currentPressureReadings[ PRESSURE_SENSOR_FRESH_DIALYSATE ].data = convertPressureReading2mmHg( getFPGAPDfRawPressure() ); currentPressureReadings[ PRESSURE_SENSOR_TRANSMEMBRANE ].data = convertPressureReading2mmHg( getFPGAPtmRawPressure() ); + currentPressureReadings[ PRESSURE_SENSOR_BAROMETRIC ].data = convertBaroPressureReading2mmHg( getFPGABaroPressure() ); // Update and convert raw pressure sensor temperatures to deg C currentPresTempReadings[ PRESSURE_SENSOR_HYDRAULICS_OUTLET ].data = convertPressureTempReading2DegC( getFPGAPnRawTemperature() ); @@ -137,6 +167,52 @@ /*********************************************************************//** * @brief + * The convertBaroPressureReading2mmHg function converts the raw pressure counts + * in to mmHg unit. + * @details \b Inputs: FPGA + * @details \b Outputs: baroConvConsts + * @param rawPressure the raw baro sensor reading from FPGA. + * @return the converted baro pressure (in mmHg). + *************************************************************************/ +static F32 convertBaroPressureReading2mmHg( U32 rawPressure ) +{ + F32 baroPressure = 0.0F; + + baroConvConsts.pressureSensitivity = getFPGABaroPressureSensitivity(); + baroConvConsts.pressureSensitivityTempCoeff = getFPGABaroTempCoeffOfPressSensitvity(); + baroConvConsts.pressureOffset = getFPGABaroPressureOffset(); + baroConvConsts.pressureOffsetTempCoeff = getFPGABaroTempCoeffOfPressOffset(); + baroPressure = calculateBaroPressure( rawPressure ); + + return baroPressure; +} + +/*********************************************************************//** + * @brief + * The calculateBaroPressure function performs the required calculations + * to compute the baro pressure readings. + * @details \b Inputs: baroConvConsts + * @details \b Outputs: none + * @param pressure the raw baro sensor reading from FPGA. + * @return converted baro pressure (in mmHg). + *************************************************************************/ +static F32 calculateBaroPressure( U32 pressure ) +{ + S32 tempDiff = getBaroSensorTemperatureDiff(); + S64 tempOffset = ( baroConvConsts.pressureOffsetTempCoeff * tempDiff ) / TWO_TO_POWER_OF_6; + S64 presOffset = baroConvConsts.pressureOffset * TWO_TO_POWER_OF_17; + S64 offset = presOffset + tempOffset; + S64 tempSensitivity = ( baroConvConsts.pressureSensitivityTempCoeff * tempDiff ) / TWO_TO_POWER_OF_7; + S64 presSensitivity = baroConvConsts.pressureSensitivity * TWO_TO_POWER_OF_16; + S64 sensitivity = tempSensitivity + presSensitivity; + S32 pres = (S32)( ( ( pressure * sensitivity ) / TWO_TO_POWER_OF_21 ) - offset ) / TWO_TO_POWER_OF_15; + F32 presmmHg = ( (F32)pres / (F32)( COUNTS_TO_MILLI_BAR * ONE_BAR_TO_MILLI_BAR ) ) * BAR_TO_MMHG; + + return presmmHg; +} + +/*********************************************************************//** + * @brief * The checkPressureSensors function checks the read and error counters for * each pressure sensor. * @details \b Alarm: ALARM_ID_DD_HYD_OUTLET_PRES_TIMEOUT_FAULT if the