Committer:
mcm
Date:
Mon Dec 10 14:49:48 2018 +0000
Revision:
1:e8e0ef45b115
Parent:
0:9d62c3a02ba5
Child:
3:f632c66b30df
The driver is ready to be tested, both function and header file were completed

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 1:e8e0ef45b115 153 #define A1 0.00175 /*!< A1 */
mcm 1:e8e0ef45b115 154 #define A2 -0.00001678 /*!< A2 */
mcm 1:e8e0ef45b115 155 #define T_REF 298.15 /*!< T_REF, Kelvin */
mcm 1:e8e0ef45b115 156 #define B0 -0.0000294 /*!< B0 */
mcm 1:e8e0ef45b115 157 #define B1 -0.00000057 /*!< B1 */
mcm 1:e8e0ef45b115 158 #define B2 -0.00000000463 /*!< B2 */
mcm 1:e8e0ef45b115 159 #define C2 13.4 /*!< C2 */
mcm 1:e8e0ef45b115 160 #define S0 ( 0.00000000000005 + 0.00000000000007 ) / 2.0 /*!< Primary calibration sensitivity factor ( mean of typical values ) */
mcm 1:e8e0ef45b115 161 #define TEMP_1LSB 0.03125 /*!< Temperature: 1 LSB = 1 / 32°C = 0.03125 */
mcm 1:e8e0ef45b115 162
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 1:e8e0ef45b115 172 float TemperatureK; /*!< T_DIE in Kelvins degrees */
mcm 1:e8e0ef45b115 173 float TemperatureC; /*!< T_DIE in Celsius degrees */
mcm 1:e8e0ef45b115 174 float s0; /*!< Primary calibration sensitivity factor ( typical values: 5×10^–14 and 7×10^–14 ) */
mcm 1:e8e0ef45b115 175
mcm 1:e8e0ef45b115 176 uint16_t SensorVoltageResultRegister; /*!< V_sensor */
mcm 1:e8e0ef45b115 177 uint16_t TemperatureRegister; /*!< T_DIE */
mcm 1:e8e0ef45b115 178 uint16_t ConfigurationRegister; /*!< Configuration register */
mcm 1:e8e0ef45b115 179
mcm 1:e8e0ef45b115 180 uint16_t ManufacturerID; /*!< Manufacturer ID */
mcm 1:e8e0ef45b115 181 uint16_t DeviceID; /*!< Device ID */
mcm 1:e8e0ef45b115 182 } TMP006_data_t;
mcm 1:e8e0ef45b115 183 #endif
mcm 1:e8e0ef45b115 184
mcm 1:e8e0ef45b115 185
mcm 1:e8e0ef45b115 186 /**
mcm 1:e8e0ef45b115 187 * @brief INTERNAL CONSTANTS
mcm 1:e8e0ef45b115 188 */
mcm 1:e8e0ef45b115 189 typedef enum {
mcm 1:e8e0ef45b115 190 TMP006_SUCCESS = 0U,
mcm 1:e8e0ef45b115 191 TMP006_FAILURE = 1U,
mcm 1:e8e0ef45b115 192 I2C_SUCCESS = 0U /*!< I2C communication was fine */
mcm 1:e8e0ef45b115 193 } TMP006_status_t;
mcm 1:e8e0ef45b115 194
mcm 1:e8e0ef45b115 195
mcm 1:e8e0ef45b115 196
mcm 1:e8e0ef45b115 197
mcm 1:e8e0ef45b115 198 /** Create an TMP006 object connected to the specified I2C pins.
mcm 1:e8e0ef45b115 199 *
mcm 1:e8e0ef45b115 200 * @param sda I2C data pin
mcm 1:e8e0ef45b115 201 * @param scl I2C clock pin
mcm 1:e8e0ef45b115 202 * @param addr I2C slave address
mcm 1:e8e0ef45b115 203 * @param freq I2C frequency
mcm 1:e8e0ef45b115 204 */
mcm 1:e8e0ef45b115 205 TMP006 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq );
mcm 1:e8e0ef45b115 206
mcm 1:e8e0ef45b115 207 /** Delete TMP006 object.
mcm 1:e8e0ef45b115 208 */
mcm 1:e8e0ef45b115 209 ~TMP006();
mcm 1:e8e0ef45b115 210
mcm 1:e8e0ef45b115 211 /** It gets the manufacturer ID.
mcm 1:e8e0ef45b115 212 */
mcm 1:e8e0ef45b115 213 TMP006_status_t TMP006_GetManufacturerID ( TMP006_data_t* myManufacturerID );
mcm 1:e8e0ef45b115 214
mcm 1:e8e0ef45b115 215 /** It gets the device ID.
mcm 1:e8e0ef45b115 216 */
mcm 1:e8e0ef45b115 217 TMP006_status_t TMP006_GetDeviceID ( TMP006_data_t* myDeviceID );
mcm 1:e8e0ef45b115 218
mcm 1:e8e0ef45b115 219 /** It reads the configuration register.
mcm 1:e8e0ef45b115 220 */
mcm 1:e8e0ef45b115 221 TMP006_status_t TMP006_ReadConfigurationRegister ( TMP006_data_t* myConfReg );
mcm 1:e8e0ef45b115 222
mcm 1:e8e0ef45b115 223 /** It performs a software reset.
mcm 1:e8e0ef45b115 224 */
mcm 1:e8e0ef45b115 225 TMP006_status_t TMP006_SoftwareReset ( void );
mcm 1:e8e0ef45b115 226
mcm 1:e8e0ef45b115 227 /** It sets mode of operation.
mcm 1:e8e0ef45b115 228 */
mcm 1:e8e0ef45b115 229 TMP006_status_t TMP006_SetModeOperation ( TMP006_mod_t myModeOpreation );
mcm 1:e8e0ef45b115 230
mcm 1:e8e0ef45b115 231 /** It sets conversion rate.
mcm 1:e8e0ef45b115 232 */
mcm 1:e8e0ef45b115 233 TMP006_status_t TMP006_SetConversionRate ( TMP006_cr_t myConversionRate );
mcm 1:e8e0ef45b115 234
mcm 1:e8e0ef45b115 235 /** It sets #DRDY control.
mcm 1:e8e0ef45b115 236 */
mcm 1:e8e0ef45b115 237 TMP006_status_t TMP006_SetnDRDY_EnableBit ( TMP006_en_t myEnableBit );
mcm 1:e8e0ef45b115 238
mcm 1:e8e0ef45b115 239 /** It reads raw temperature ( T_DIE ) register.
mcm 1:e8e0ef45b115 240 */
mcm 1:e8e0ef45b115 241 TMP006_status_t TMP006_GetRawTemperature ( TMP006_data_t* myRawTemperature );
mcm 1:e8e0ef45b115 242
mcm 1:e8e0ef45b115 243 /** It reads raw sensor voltage result ( V_SENSOR ) register.
mcm 1:e8e0ef45b115 244 */
mcm 1:e8e0ef45b115 245 TMP006_status_t TMP006_GetRawSensorVoltage ( TMP006_data_t* myRawVoltage );
mcm 1:e8e0ef45b115 246
mcm 1:e8e0ef45b115 247 /** It calculates the real temperature ( T_DIE ) value.
mcm 1:e8e0ef45b115 248 */
mcm 1:e8e0ef45b115 249 TMP006_status_t TMP006_CalculateTemperature ( TMP006_data_t* myTemperature );
mcm 1:e8e0ef45b115 250
mcm 1:e8e0ef45b115 251 /** It calculates the object temperature ( T_OBJ ) value.
mcm 1:e8e0ef45b115 252 */
mcm 1:e8e0ef45b115 253 TMP006_status_t TMP006_CalculateObjectTemperature( TMP006_data_t* myObjTemperature );
mcm 1:e8e0ef45b115 254
mcm 1:e8e0ef45b115 255
mcm 1:e8e0ef45b115 256 private:
mcm 1:e8e0ef45b115 257 I2C _i2c;
mcm 1:e8e0ef45b115 258 uint32_t _TMP006_Addr;
mcm 1:e8e0ef45b115 259 };
mcm 1:e8e0ef45b115 260
mcm 1:e8e0ef45b115 261 #endif