Committer:
mcm
Date:
Mon Dec 10 16:29:14 2018 +0000
Revision:
3:f632c66b30df
Parent:
1:e8e0ef45b115
Child:
4:56398c14bf1f
Sensor voltage value function was added, it is important to calculate the sensor voltage in terms of voltage

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 1:e8e0ef45b115 1 /**
mcm 1:e8e0ef45b115 2 * @brief TMP006.h
mcm 1:e8e0ef45b115 3 * @details Infrared Thermopile Sensor in Chip-Scale Package.
mcm 1:e8e0ef45b115 4 * Header file.
mcm 1:e8e0ef45b115 5 *
mcm 1:e8e0ef45b115 6 *
mcm 1:e8e0ef45b115 7 * @return N/A
mcm 1:e8e0ef45b115 8 *
mcm 1:e8e0ef45b115 9 * @author Manuel Caballero
mcm 1:e8e0ef45b115 10 * @date 10/December/2018
mcm 1:e8e0ef45b115 11 * @version 10/December/2018 The ORIGIN
mcm 1:e8e0ef45b115 12 * @pre N/A
mcm 1:e8e0ef45b115 13 * @warning N/A
mcm 1:e8e0ef45b115 14 * @pre This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ). All rights reserved.
mcm 1:e8e0ef45b115 15 */
mcm 1:e8e0ef45b115 16 #ifndef TMP006_H
mcm 1:e8e0ef45b115 17 #define TMP006_H
mcm 1:e8e0ef45b115 18
mcm 1:e8e0ef45b115 19 #include "mbed.h"
mcm 1:e8e0ef45b115 20 #include <math.h>
mcm 1:e8e0ef45b115 21
mcm 1:e8e0ef45b115 22
mcm 1:e8e0ef45b115 23 /**
mcm 1:e8e0ef45b115 24 Example:
mcm 1:e8e0ef45b115 25 @code
mcm 1:e8e0ef45b115 26
mcm 1:e8e0ef45b115 27 @endcode
mcm 1:e8e0ef45b115 28 */
mcm 1:e8e0ef45b115 29
mcm 1:e8e0ef45b115 30
mcm 1:e8e0ef45b115 31 /*!
mcm 1:e8e0ef45b115 32 Library for the TMP006 Infrared Thermopile Sensor in Chip-Scale Package.
mcm 1:e8e0ef45b115 33 */
mcm 1:e8e0ef45b115 34 class TMP006
mcm 1:e8e0ef45b115 35 {
mcm 1:e8e0ef45b115 36 public:
mcm 1:e8e0ef45b115 37 /**
mcm 1:e8e0ef45b115 38 * @brief DEFAULT ADDRESSES
mcm 1:e8e0ef45b115 39 */
mcm 1:e8e0ef45b115 40 typedef enum
mcm 1:e8e0ef45b115 41 {
mcm 1:e8e0ef45b115 42 TMP006_ADDRESS_ADR1_0_ADR0_0 = ( 0b1000000 << 1U ), /*!< TMP006 I2C Address: ADR1 = 0 | ADR0 = 0 */
mcm 1:e8e0ef45b115 43 TMP006_ADDRESS_ADR1_0_ADR0_1 = ( 0b1000001 << 1U ), /*!< TMP006 I2C Address: ADR1 = 0 | ADR0 = 1 */
mcm 1:e8e0ef45b115 44 TMP006_ADDRESS_ADR1_0_ADR0_SDA = ( 0b1000010 << 1U ), /*!< TMP006 I2C Address: ADR1 = 0 | ADR0 = SDA */
mcm 1:e8e0ef45b115 45 TMP006_ADDRESS_ADR1_0_ADR0_SCL = ( 0b1000011 << 1U ), /*!< TMP006 I2C Address: ADR1 = 0 | ADR0 = SCL */
mcm 1:e8e0ef45b115 46 TMP006_ADDRESS_ADR1_1_ADR0_0 = ( 0b1000100 << 1U ), /*!< TMP006 I2C Address: ADR1 = 1 | ADR0 = 0 */
mcm 1:e8e0ef45b115 47 TMP006_ADDRESS_ADR1_1_ADR0_1 = ( 0b1000101 << 1U ), /*!< TMP006 I2C Address: ADR1 = 1 | ADR0 = 1 */
mcm 1:e8e0ef45b115 48 TMP006_ADDRESS_ADR1_1_ADR0_SDA = ( 0b1000110 << 1U ), /*!< TMP006 I2C Address: ADR1 = 1 | ADR0 = SDA */
mcm 1:e8e0ef45b115 49 TMP006_ADDRESS_ADR1_1_ADR0_SCL = ( 0b1000111 << 1U ) /*!< TMP006 I2C Address: ADR1 = 1 | ADR0 = SCL */
mcm 1:e8e0ef45b115 50 } TMP006_addresses_t;
mcm 1:e8e0ef45b115 51
mcm 1:e8e0ef45b115 52
mcm 1:e8e0ef45b115 53
mcm 1:e8e0ef45b115 54 /**
mcm 1:e8e0ef45b115 55 * @brief REGISTER MAP
mcm 1:e8e0ef45b115 56 */
mcm 1:e8e0ef45b115 57 typedef enum
mcm 1:e8e0ef45b115 58 {
mcm 1:e8e0ef45b115 59 TMP006_SENSOR_VOLTAGE = 0x00, /*!< Sensor voltage ( Read Only ) */
mcm 1:e8e0ef45b115 60 TMP006_LOCAL_TEMPERATURE = 0x01, /*!< Local temperature ( Read Only ) */
mcm 1:e8e0ef45b115 61 TMP006_CONFIGURATION = 0x02, /*!< Configuration ( Read/Write ) */
mcm 1:e8e0ef45b115 62 TMP006_MANUFACTURER_ID = 0xFE, /*!< Manufacturer ID ( Read Only ) */
mcm 1:e8e0ef45b115 63 TMP006_DEVICE_ID = 0xFF /*!< Device ID ( Read Only ) */
mcm 1:e8e0ef45b115 64 } TMP006_register_map_t;
mcm 1:e8e0ef45b115 65
mcm 1:e8e0ef45b115 66
mcm 1:e8e0ef45b115 67
mcm 1:e8e0ef45b115 68 /**
mcm 1:e8e0ef45b115 69 * @brief CONFIGURATION REGISTER
mcm 1:e8e0ef45b115 70 */
mcm 1:e8e0ef45b115 71 /* SOFTWARE RESET BIT <15>
mcm 1:e8e0ef45b115 72 */
mcm 1:e8e0ef45b115 73 typedef enum
mcm 1:e8e0ef45b115 74 {
mcm 1:e8e0ef45b115 75 RST_BIT_MASK = ( 1U << 15U ), /*!< Software reset bit mask */
mcm 1:e8e0ef45b115 76 RST_NORMAL_OPERATION = ( 0U << 15U ), /*!< Software reset bit: Normal operation ( RESET ) */
mcm 1:e8e0ef45b115 77 RST_SOFTWARE_RESET = ( 1U << 15U ) /*!< Software reset bit: Software reset */
mcm 1:e8e0ef45b115 78 } TMP006_rst_t;
mcm 1:e8e0ef45b115 79
mcm 1:e8e0ef45b115 80
mcm 1:e8e0ef45b115 81 /* MODE OF OPERATION <14:12>
mcm 1:e8e0ef45b115 82 */
mcm 1:e8e0ef45b115 83 typedef enum
mcm 1:e8e0ef45b115 84 {
mcm 1:e8e0ef45b115 85 MOD_MASK = ( 0b111 << 12U ), /*!< Mode of operation mask */
mcm 1:e8e0ef45b115 86 MOD_POWER_DOWN = ( 0b000 << 12U ), /*!< Mode of operation: Power-down */
mcm 1:e8e0ef45b115 87 MOD_SENSOR_AND_DIE_CONT_CONVERSION = ( 0b111 << 12U ) /*!< Mode of operation: Sensor and die continuous conversion (MOD) ( RESET ) */
mcm 1:e8e0ef45b115 88 } TMP006_mod_t;
mcm 1:e8e0ef45b115 89
mcm 1:e8e0ef45b115 90
mcm 1:e8e0ef45b115 91 /* ADC CONVERSION RATE <11:9>
mcm 1:e8e0ef45b115 92 */
mcm 1:e8e0ef45b115 93 typedef enum
mcm 1:e8e0ef45b115 94 {
mcm 1:e8e0ef45b115 95 CR_MASK = ( 0b111 << 9U ), /*!< ADC Conversion rate mask */
mcm 1:e8e0ef45b115 96 CR_1_AVERAGED_SAMPLES = ( 0b000 << 9U ), /*!< ADC Conversion rate: 1 number of averaged sample */
mcm 1:e8e0ef45b115 97 CR_2_AVERAGED_SAMPLES = ( 0b001 << 9U ), /*!< ADC Conversion rate: 2 number of averaged sample */
mcm 1:e8e0ef45b115 98 CR_4_AVERAGED_SAMPLES = ( 0b010 << 9U ), /*!< ADC Conversion rate: 4 number of averaged sample ( RESET ) */
mcm 1:e8e0ef45b115 99 CR_8_AVERAGED_SAMPLES = ( 0b011 << 9U ), /*!< ADC Conversion rate: 8 number of averaged sample */
mcm 1:e8e0ef45b115 100 CR_16_AVERAGED_SAMPLES = ( 0b100 << 9U ) /*!< ADC Conversion rate: 16 number of averaged sample */
mcm 1:e8e0ef45b115 101 } TMP006_cr_t;
mcm 1:e8e0ef45b115 102
mcm 1:e8e0ef45b115 103
mcm 1:e8e0ef45b115 104 /* #DRDY ENABLE BIT <8>
mcm 1:e8e0ef45b115 105 */
mcm 1:e8e0ef45b115 106 typedef enum
mcm 1:e8e0ef45b115 107 {
mcm 1:e8e0ef45b115 108 EN_MASK = ( 1U << 8U ), /*!< #DRDY enable bit mask */
mcm 1:e8e0ef45b115 109 EN_nDRDY_PIN_DISABLED = ( 0U << 8U ), /*!< #DRDY enable bit: Pin disabled ( RESET ) */
mcm 1:e8e0ef45b115 110 EN_nDRDY_PIN_ENABLED = ( 1U << 8U ) /*!< #DRDY enable bit: Pin enabled */
mcm 1:e8e0ef45b115 111 } TMP006_en_t;
mcm 1:e8e0ef45b115 112
mcm 1:e8e0ef45b115 113
mcm 1:e8e0ef45b115 114 /* DATA READY BIT <7>
mcm 1:e8e0ef45b115 115 */
mcm 1:e8e0ef45b115 116 typedef enum
mcm 1:e8e0ef45b115 117 {
mcm 1:e8e0ef45b115 118 nDRDY_MASK = ( 1U << 7U ), /*!< Data ready bit mask */
mcm 1:e8e0ef45b115 119 nDRDY_CONVERSION_IN_PROGRESS = ( 0U << 7U ), /*!< Data ready bit: Conversion in progress ( RESET ) */
mcm 1:e8e0ef45b115 120 nDRDY_CONVERSION_COMPLETED = ( 1U << 7U ) /*!< Data ready bit: Conversion completed */
mcm 1:e8e0ef45b115 121 } TMP006_ndrdy_t;
mcm 1:e8e0ef45b115 122
mcm 1:e8e0ef45b115 123
mcm 1:e8e0ef45b115 124
mcm 1:e8e0ef45b115 125
mcm 1:e8e0ef45b115 126 /**
mcm 1:e8e0ef45b115 127 * @brief MANUFACTURER ID REGISTER
mcm 1:e8e0ef45b115 128 */
mcm 1:e8e0ef45b115 129 typedef enum
mcm 1:e8e0ef45b115 130 {
mcm 1:e8e0ef45b115 131 MANUFACTURER_ID_MASK = 0xFFFF, /*!< Manufacturer ID mask */
mcm 1:e8e0ef45b115 132 MANUFACTURER_ID_VALUE = 0x5449 /*!< Manufacturer ID value ( RESET ) */
mcm 1:e8e0ef45b115 133 } TMP006_manufacturer_id_register_t;
mcm 1:e8e0ef45b115 134
mcm 1:e8e0ef45b115 135
mcm 1:e8e0ef45b115 136
mcm 1:e8e0ef45b115 137 /**
mcm 1:e8e0ef45b115 138 * @brief DEVICE ID REGISTER
mcm 1:e8e0ef45b115 139 */
mcm 1:e8e0ef45b115 140 typedef enum
mcm 1:e8e0ef45b115 141 {
mcm 1:e8e0ef45b115 142 DEVICE_ID_MASK = 0xFFFF, /*!< Device ID mask */
mcm 1:e8e0ef45b115 143 DEVICE_ID_VALUE = 0x0067 /*!< Device ID value ( RESET ) */
mcm 1:e8e0ef45b115 144 } TMP006_device_id_register_t;
mcm 1:e8e0ef45b115 145
mcm 1:e8e0ef45b115 146
mcm 1:e8e0ef45b115 147
mcm 1:e8e0ef45b115 148
mcm 1:e8e0ef45b115 149 /**
mcm 1:e8e0ef45b115 150 * @brief CONSTANS TO BE USED IN THE FORMULAS
mcm 1:e8e0ef45b115 151 * NOTE: User Guide ( sbou107.pdf ) 5.1 Equations for Calculating Target Object Temperatures, p10.
mcm 1:e8e0ef45b115 152 */
mcm 3:f632c66b30df 153 #define A1 0.00175 /*!< A1 */
mcm 3:f632c66b30df 154 #define A2 -0.00001678 /*!< A2 */
mcm 3:f632c66b30df 155 #define T_REF 298.15 /*!< T_REF, Kelvin */
mcm 3:f632c66b30df 156 #define B0 -0.0000294 /*!< B0 */
mcm 3:f632c66b30df 157 #define B1 -0.00000057 /*!< B1 */
mcm 3:f632c66b30df 158 #define B2 -0.00000000463 /*!< B2 */
mcm 3:f632c66b30df 159 #define C2 13.4 /*!< C2 */
mcm 3:f632c66b30df 160 #define S0 ( ( 0.00000000000005 + 0.00000000000007 ) / 2.0 ) /*!< Primary calibration sensitivity factor ( mean of typical values ) */
mcm 3:f632c66b30df 161 #define TEMP_1LSB 0.03125 /*!< Temperature: 1 LSB = 1 / 32°C = 0.03125 */
mcm 3:f632c66b30df 162 #define SVOL_1LSB 156.25 /*!< Sensor voltage: 1 LSB = 156.25 nV */
mcm 1:e8e0ef45b115 163
mcm 1:e8e0ef45b115 164
mcm 1:e8e0ef45b115 165 #ifndef TMP006_VECTOR_STRUCT_H
mcm 1:e8e0ef45b115 166 #define TMP006_VECTOR_STRUCT_H
mcm 1:e8e0ef45b115 167 typedef struct
mcm 1:e8e0ef45b115 168 {
mcm 1:e8e0ef45b115 169 float ObjectTemperatureC; /*!< Temperature of the target object in Celsius degrees */
mcm 1:e8e0ef45b115 170 float ObjectTemperatureK; /*!< Temperature of the target object in Kelvins degrees */
mcm 1:e8e0ef45b115 171
mcm 3:f632c66b30df 172 float TemperatureK; /*!< T_DIE in Kelvins degrees */
mcm 3:f632c66b30df 173 float TemperatureC; /*!< T_DIE in Celsius degrees */
mcm 3:f632c66b30df 174 float V_Sensor; /*!< Sensor voltage result */
mcm 3:f632c66b30df 175 float s0; /*!< Primary calibration sensitivity factor ( typical values: 5×10^–14 and 7×10^–14 ) */
mcm 1:e8e0ef45b115 176
mcm 3:f632c66b30df 177 uint16_t SensorVoltageResultRegister; /*!< V_sensor */
mcm 3:f632c66b30df 178 uint16_t TemperatureRegister; /*!< T_DIE */
mcm 3:f632c66b30df 179 uint16_t ConfigurationRegister; /*!< Configuration register */
mcm 1:e8e0ef45b115 180
mcm 3:f632c66b30df 181 uint16_t ManufacturerID; /*!< Manufacturer ID */
mcm 3:f632c66b30df 182 uint16_t DeviceID; /*!< Device ID */
mcm 1:e8e0ef45b115 183 } TMP006_data_t;
mcm 1:e8e0ef45b115 184 #endif
mcm 1:e8e0ef45b115 185
mcm 1:e8e0ef45b115 186
mcm 1:e8e0ef45b115 187 /**
mcm 1:e8e0ef45b115 188 * @brief INTERNAL CONSTANTS
mcm 1:e8e0ef45b115 189 */
mcm 1:e8e0ef45b115 190 typedef enum {
mcm 1:e8e0ef45b115 191 TMP006_SUCCESS = 0U,
mcm 1:e8e0ef45b115 192 TMP006_FAILURE = 1U,
mcm 1:e8e0ef45b115 193 I2C_SUCCESS = 0U /*!< I2C communication was fine */
mcm 1:e8e0ef45b115 194 } TMP006_status_t;
mcm 1:e8e0ef45b115 195
mcm 1:e8e0ef45b115 196
mcm 1:e8e0ef45b115 197
mcm 1:e8e0ef45b115 198
mcm 1:e8e0ef45b115 199 /** Create an TMP006 object connected to the specified I2C pins.
mcm 1:e8e0ef45b115 200 *
mcm 1:e8e0ef45b115 201 * @param sda I2C data pin
mcm 1:e8e0ef45b115 202 * @param scl I2C clock pin
mcm 1:e8e0ef45b115 203 * @param addr I2C slave address
mcm 1:e8e0ef45b115 204 * @param freq I2C frequency
mcm 1:e8e0ef45b115 205 */
mcm 1:e8e0ef45b115 206 TMP006 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );
mcm 1:e8e0ef45b115 207
mcm 1:e8e0ef45b115 208 /** Delete TMP006 object.
mcm 1:e8e0ef45b115 209 */
mcm 1:e8e0ef45b115 210 ~TMP006();
mcm 1:e8e0ef45b115 211
mcm 1:e8e0ef45b115 212 /** It gets the manufacturer ID.
mcm 1:e8e0ef45b115 213 */
mcm 1:e8e0ef45b115 214 TMP006_status_t TMP006_GetManufacturerID ( TMP006_data_t* myManufacturerID );
mcm 1:e8e0ef45b115 215
mcm 1:e8e0ef45b115 216 /** It gets the device ID.
mcm 1:e8e0ef45b115 217 */
mcm 1:e8e0ef45b115 218 TMP006_status_t TMP006_GetDeviceID ( TMP006_data_t* myDeviceID );
mcm 1:e8e0ef45b115 219
mcm 1:e8e0ef45b115 220 /** It reads the configuration register.
mcm 1:e8e0ef45b115 221 */
mcm 1:e8e0ef45b115 222 TMP006_status_t TMP006_ReadConfigurationRegister ( TMP006_data_t* myConfReg );
mcm 1:e8e0ef45b115 223
mcm 1:e8e0ef45b115 224 /** It performs a software reset.
mcm 1:e8e0ef45b115 225 */
mcm 1:e8e0ef45b115 226 TMP006_status_t TMP006_SoftwareReset ( void );
mcm 1:e8e0ef45b115 227
mcm 1:e8e0ef45b115 228 /** It sets mode of operation.
mcm 1:e8e0ef45b115 229 */
mcm 1:e8e0ef45b115 230 TMP006_status_t TMP006_SetModeOperation ( TMP006_mod_t myModeOpreation );
mcm 1:e8e0ef45b115 231
mcm 1:e8e0ef45b115 232 /** It sets conversion rate.
mcm 1:e8e0ef45b115 233 */
mcm 1:e8e0ef45b115 234 TMP006_status_t TMP006_SetConversionRate ( TMP006_cr_t myConversionRate );
mcm 1:e8e0ef45b115 235
mcm 1:e8e0ef45b115 236 /** It sets #DRDY control.
mcm 1:e8e0ef45b115 237 */
mcm 1:e8e0ef45b115 238 TMP006_status_t TMP006_SetnDRDY_EnableBit ( TMP006_en_t myEnableBit );
mcm 1:e8e0ef45b115 239
mcm 1:e8e0ef45b115 240 /** It reads raw temperature ( T_DIE ) register.
mcm 1:e8e0ef45b115 241 */
mcm 1:e8e0ef45b115 242 TMP006_status_t TMP006_GetRawTemperature ( TMP006_data_t* myRawTemperature );
mcm 1:e8e0ef45b115 243
mcm 1:e8e0ef45b115 244 /** It reads raw sensor voltage result ( V_SENSOR ) register.
mcm 1:e8e0ef45b115 245 */
mcm 1:e8e0ef45b115 246 TMP006_status_t TMP006_GetRawSensorVoltage ( TMP006_data_t* myRawVoltage );
mcm 1:e8e0ef45b115 247
mcm 1:e8e0ef45b115 248 /** It calculates the real temperature ( T_DIE ) value.
mcm 1:e8e0ef45b115 249 */
mcm 1:e8e0ef45b115 250 TMP006_status_t TMP006_CalculateTemperature ( TMP006_data_t* myTemperature );
mcm 1:e8e0ef45b115 251
mcm 3:f632c66b30df 252 /** It calculates the real sensor voltage ( V_SENSOR ) value.
mcm 3:f632c66b30df 253 */
mcm 3:f632c66b30df 254 TMP006_status_t TMP006_CalculateSensorVoltage ( TMP006_data_t* myV_sensor );
mcm 3:f632c66b30df 255
mcm 1:e8e0ef45b115 256 /** It calculates the object temperature ( T_OBJ ) value.
mcm 1:e8e0ef45b115 257 */
mcm 1:e8e0ef45b115 258 TMP006_status_t TMP006_CalculateObjectTemperature( TMP006_data_t* myObjTemperature );
mcm 1:e8e0ef45b115 259
mcm 1:e8e0ef45b115 260
mcm 1:e8e0ef45b115 261 private:
mcm 1:e8e0ef45b115 262 I2C _i2c;
mcm 1:e8e0ef45b115 263 uint32_t _TMP006_Addr;
mcm 1:e8e0ef45b115 264 };
mcm 1:e8e0ef45b115 265
mcm 1:e8e0ef45b115 266 #endif