Committer:
mcm
Date:
Tue Dec 11 12:47:11 2018 +0000
Revision:
4:56398c14bf1f
Parent:
3:f632c66b30df
The driver was completed and tested ( NUCLEO-L152RE ), it works as expected

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcm 1:e8e0ef45b115 1 /**
mcm 1:e8e0ef45b115 2 * @brief TMP006.c
mcm 1:e8e0ef45b115 3 * @details Infrared Thermopile Sensor in Chip-Scale Package.
mcm 1:e8e0ef45b115 4 * Functions 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
mcm 1:e8e0ef45b115 17 #include "TMP006.h"
mcm 1:e8e0ef45b115 18
mcm 1:e8e0ef45b115 19
mcm 1:e8e0ef45b115 20 TMP006::TMP006 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
mcm 1:e8e0ef45b115 21 : _i2c ( sda, scl )
mcm 1:e8e0ef45b115 22 , _TMP006_Addr ( addr )
mcm 1:e8e0ef45b115 23 {
mcm 1:e8e0ef45b115 24 _i2c.frequency( freq );
mcm 1:e8e0ef45b115 25 }
mcm 1:e8e0ef45b115 26
mcm 1:e8e0ef45b115 27
mcm 1:e8e0ef45b115 28 TMP006::~TMP006()
mcm 1:e8e0ef45b115 29 {
mcm 1:e8e0ef45b115 30 }
mcm 1:e8e0ef45b115 31
mcm 1:e8e0ef45b115 32
mcm 1:e8e0ef45b115 33 /**
mcm 1:e8e0ef45b115 34 * @brief TMP006_GetManufacturerID ( TMP006_data_t* )
mcm 1:e8e0ef45b115 35 *
mcm 1:e8e0ef45b115 36 * @details It gets the manufacturer ID.
mcm 1:e8e0ef45b115 37 *
mcm 1:e8e0ef45b115 38 * @param[in] N/A
mcm 1:e8e0ef45b115 39 *
mcm 1:e8e0ef45b115 40 * @param[out] myManufacturerID: Manufacturer ID.
mcm 1:e8e0ef45b115 41 *
mcm 1:e8e0ef45b115 42 *
mcm 1:e8e0ef45b115 43 * @return Status of TMP006_GetManufacturerID.
mcm 1:e8e0ef45b115 44 *
mcm 1:e8e0ef45b115 45 *
mcm 1:e8e0ef45b115 46 * @author Manuel Caballero
mcm 2:97a7f871b612 47 * @date 10/December/2018
mcm 2:97a7f871b612 48 * @version 10/December/2018 The ORIGIN
mcm 1:e8e0ef45b115 49 * @pre N/A.
mcm 1:e8e0ef45b115 50 * @warning N/A.
mcm 1:e8e0ef45b115 51 */
mcm 1:e8e0ef45b115 52 TMP006::TMP006_status_t TMP006::TMP006_GetManufacturerID ( TMP006_data_t* myManufacturerID )
mcm 1:e8e0ef45b115 53 {
mcm 1:e8e0ef45b115 54 char cmd[] = { 0U, 0U };
mcm 1:e8e0ef45b115 55 uint32_t aux;
mcm 1:e8e0ef45b115 56
mcm 1:e8e0ef45b115 57
mcm 1:e8e0ef45b115 58 /* Read the register */
mcm 1:e8e0ef45b115 59 cmd[0] = TMP006_MANUFACTURER_ID;
mcm 1:e8e0ef45b115 60 aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
mcm 1:e8e0ef45b115 61 aux = _i2c.read ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 1:e8e0ef45b115 62
mcm 1:e8e0ef45b115 63
mcm 1:e8e0ef45b115 64 /* Parse data */
mcm 1:e8e0ef45b115 65 myManufacturerID->ManufacturerID = ( cmd[0] << 8U );
mcm 1:e8e0ef45b115 66 myManufacturerID->ManufacturerID |= cmd[1];
mcm 1:e8e0ef45b115 67
mcm 1:e8e0ef45b115 68
mcm 1:e8e0ef45b115 69
mcm 1:e8e0ef45b115 70
mcm 1:e8e0ef45b115 71 if ( aux == I2C_SUCCESS )
mcm 1:e8e0ef45b115 72 {
mcm 1:e8e0ef45b115 73 return TMP006_SUCCESS;
mcm 1:e8e0ef45b115 74 }
mcm 1:e8e0ef45b115 75 else
mcm 1:e8e0ef45b115 76 {
mcm 1:e8e0ef45b115 77 return TMP006_FAILURE;
mcm 1:e8e0ef45b115 78 }
mcm 1:e8e0ef45b115 79 }
mcm 1:e8e0ef45b115 80
mcm 1:e8e0ef45b115 81
mcm 1:e8e0ef45b115 82
mcm 1:e8e0ef45b115 83 /**
mcm 1:e8e0ef45b115 84 * @brief TMP006_GetDeviceID ( TMP006_data_t* )
mcm 1:e8e0ef45b115 85 *
mcm 1:e8e0ef45b115 86 * @details It gets the device ID.
mcm 1:e8e0ef45b115 87 *
mcm 1:e8e0ef45b115 88 * @param[in] N/A.
mcm 1:e8e0ef45b115 89 *
mcm 1:e8e0ef45b115 90 * @param[out] myDeviceID: Device ID.
mcm 1:e8e0ef45b115 91 *
mcm 1:e8e0ef45b115 92 *
mcm 1:e8e0ef45b115 93 * @return Status of TMP006_GetDeviceID.
mcm 1:e8e0ef45b115 94 *
mcm 1:e8e0ef45b115 95 *
mcm 1:e8e0ef45b115 96 * @author Manuel Caballero
mcm 2:97a7f871b612 97 * @date 10/December/2018
mcm 2:97a7f871b612 98 * @version 10/December/2018 The ORIGIN
mcm 1:e8e0ef45b115 99 * @pre N/A.
mcm 1:e8e0ef45b115 100 * @warning N/A.
mcm 1:e8e0ef45b115 101 */
mcm 1:e8e0ef45b115 102 TMP006::TMP006_status_t TMP006::TMP006_GetDeviceID ( TMP006_data_t* myDeviceID )
mcm 1:e8e0ef45b115 103 {
mcm 1:e8e0ef45b115 104 char cmd[] = { 0U, 0U };
mcm 1:e8e0ef45b115 105 uint32_t aux;
mcm 1:e8e0ef45b115 106
mcm 1:e8e0ef45b115 107
mcm 1:e8e0ef45b115 108 /* Read the register */
mcm 1:e8e0ef45b115 109 cmd[0] = TMP006_DEVICE_ID;
mcm 1:e8e0ef45b115 110 aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
mcm 1:e8e0ef45b115 111 aux = _i2c.read ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 1:e8e0ef45b115 112
mcm 1:e8e0ef45b115 113
mcm 1:e8e0ef45b115 114 /* Parse data */
mcm 1:e8e0ef45b115 115 myDeviceID->DeviceID = ( cmd[0] << 8U );
mcm 1:e8e0ef45b115 116 myDeviceID->DeviceID |= cmd[1];
mcm 1:e8e0ef45b115 117
mcm 1:e8e0ef45b115 118
mcm 1:e8e0ef45b115 119
mcm 1:e8e0ef45b115 120
mcm 1:e8e0ef45b115 121 if ( aux == I2C_SUCCESS )
mcm 1:e8e0ef45b115 122 {
mcm 1:e8e0ef45b115 123 return TMP006_SUCCESS;
mcm 1:e8e0ef45b115 124 }
mcm 1:e8e0ef45b115 125 else
mcm 1:e8e0ef45b115 126 {
mcm 1:e8e0ef45b115 127 return TMP006_FAILURE;
mcm 1:e8e0ef45b115 128 }
mcm 1:e8e0ef45b115 129 }
mcm 1:e8e0ef45b115 130
mcm 1:e8e0ef45b115 131
mcm 1:e8e0ef45b115 132
mcm 1:e8e0ef45b115 133 /**
mcm 1:e8e0ef45b115 134 * @brief TMP006_ReadConfigurationRegister ( TMP006_data_t* )
mcm 1:e8e0ef45b115 135 *
mcm 1:e8e0ef45b115 136 * @details It reads the configuration register.
mcm 1:e8e0ef45b115 137 *
mcm 1:e8e0ef45b115 138 * @param[in] N/A
mcm 1:e8e0ef45b115 139 *
mcm 1:e8e0ef45b115 140 * @param[out] myConfReg: Configuration register value.
mcm 1:e8e0ef45b115 141 *
mcm 1:e8e0ef45b115 142 *
mcm 1:e8e0ef45b115 143 * @return Status of TMP006_ReadConfigurationRegister.
mcm 1:e8e0ef45b115 144 *
mcm 1:e8e0ef45b115 145 *
mcm 1:e8e0ef45b115 146 * @author Manuel Caballero
mcm 2:97a7f871b612 147 * @date 10/December/2018
mcm 2:97a7f871b612 148 * @version 10/December/2018 The ORIGIN
mcm 1:e8e0ef45b115 149 * @pre N/A.
mcm 1:e8e0ef45b115 150 * @warning N/A.
mcm 1:e8e0ef45b115 151 */
mcm 1:e8e0ef45b115 152 TMP006::TMP006_status_t TMP006::TMP006_ReadConfigurationRegister ( TMP006_data_t* myConfReg )
mcm 1:e8e0ef45b115 153 {
mcm 1:e8e0ef45b115 154 char cmd[] = { 0U, 0U };
mcm 1:e8e0ef45b115 155 uint32_t aux;
mcm 1:e8e0ef45b115 156
mcm 1:e8e0ef45b115 157
mcm 1:e8e0ef45b115 158 /* Read the register */
mcm 1:e8e0ef45b115 159 cmd[0] = TMP006_CONFIGURATION;
mcm 1:e8e0ef45b115 160 aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
mcm 1:e8e0ef45b115 161 aux = _i2c.read ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 1:e8e0ef45b115 162
mcm 1:e8e0ef45b115 163
mcm 1:e8e0ef45b115 164 /* Parse data */
mcm 1:e8e0ef45b115 165 myConfReg->ConfigurationRegister = ( cmd[0] << 8U );
mcm 1:e8e0ef45b115 166 myConfReg->ConfigurationRegister |= cmd[1];
mcm 1:e8e0ef45b115 167
mcm 1:e8e0ef45b115 168
mcm 1:e8e0ef45b115 169
mcm 1:e8e0ef45b115 170
mcm 1:e8e0ef45b115 171 if ( aux == I2C_SUCCESS )
mcm 1:e8e0ef45b115 172 {
mcm 1:e8e0ef45b115 173 return TMP006_SUCCESS;
mcm 1:e8e0ef45b115 174 }
mcm 1:e8e0ef45b115 175 else
mcm 1:e8e0ef45b115 176 {
mcm 1:e8e0ef45b115 177 return TMP006_FAILURE;
mcm 1:e8e0ef45b115 178 }
mcm 1:e8e0ef45b115 179 }
mcm 1:e8e0ef45b115 180
mcm 1:e8e0ef45b115 181
mcm 1:e8e0ef45b115 182
mcm 1:e8e0ef45b115 183 /**
mcm 1:e8e0ef45b115 184 * @brief TMP006_SoftwareReset ( void )
mcm 1:e8e0ef45b115 185 *
mcm 1:e8e0ef45b115 186 * @details It performs a software reset.
mcm 1:e8e0ef45b115 187 *
mcm 1:e8e0ef45b115 188 * @param[in] N/A.
mcm 1:e8e0ef45b115 189 *
mcm 1:e8e0ef45b115 190 * @param[out] N/A.
mcm 1:e8e0ef45b115 191 *
mcm 1:e8e0ef45b115 192 *
mcm 1:e8e0ef45b115 193 * @return Status of TMP006_SoftwareReset.
mcm 1:e8e0ef45b115 194 *
mcm 1:e8e0ef45b115 195 *
mcm 1:e8e0ef45b115 196 * @author Manuel Caballero
mcm 2:97a7f871b612 197 * @date 10/December/2018
mcm 2:97a7f871b612 198 * @version 10/December/2018 The ORIGIN
mcm 1:e8e0ef45b115 199 * @pre N/A.
mcm 1:e8e0ef45b115 200 * @warning N/A.
mcm 1:e8e0ef45b115 201 */
mcm 1:e8e0ef45b115 202 TMP006::TMP006_status_t TMP006::TMP006_SoftwareReset ( void )
mcm 1:e8e0ef45b115 203 {
mcm 1:e8e0ef45b115 204 char cmd[] = { 0U, 0U, 0U };
mcm 1:e8e0ef45b115 205 uint32_t aux;
mcm 1:e8e0ef45b115 206
mcm 1:e8e0ef45b115 207
mcm 1:e8e0ef45b115 208 /* Read the register */
mcm 1:e8e0ef45b115 209 cmd[0] = TMP006_CONFIGURATION;
mcm 1:e8e0ef45b115 210 aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
mcm 1:e8e0ef45b115 211 aux = _i2c.read ( _TMP006_Addr, &cmd[0], 2U );
mcm 1:e8e0ef45b115 212
mcm 1:e8e0ef45b115 213 /* Mask the option and update the register */
mcm 1:e8e0ef45b115 214 cmd[2] = cmd[1];
mcm 1:e8e0ef45b115 215 cmd[1] = ( ( cmd[0] & ~RST_BIT_MASK ) | RST_SOFTWARE_RESET );
mcm 1:e8e0ef45b115 216 cmd[0] = TMP006_CONFIGURATION;
mcm 1:e8e0ef45b115 217 aux = _i2c.write ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 1:e8e0ef45b115 218
mcm 1:e8e0ef45b115 219
mcm 1:e8e0ef45b115 220
mcm 1:e8e0ef45b115 221
mcm 1:e8e0ef45b115 222 if ( aux == I2C_SUCCESS )
mcm 1:e8e0ef45b115 223 {
mcm 1:e8e0ef45b115 224 return TMP006_SUCCESS;
mcm 1:e8e0ef45b115 225 }
mcm 1:e8e0ef45b115 226 else
mcm 1:e8e0ef45b115 227 {
mcm 1:e8e0ef45b115 228 return TMP006_FAILURE;
mcm 1:e8e0ef45b115 229 }
mcm 1:e8e0ef45b115 230 }
mcm 1:e8e0ef45b115 231
mcm 1:e8e0ef45b115 232
mcm 1:e8e0ef45b115 233
mcm 1:e8e0ef45b115 234 /**
mcm 1:e8e0ef45b115 235 * @brief TMP006_SetModeOperation ( TMP006_mod_t )
mcm 1:e8e0ef45b115 236 *
mcm 1:e8e0ef45b115 237 * @details It sets mode of operation.
mcm 1:e8e0ef45b115 238 *
mcm 1:e8e0ef45b115 239 * @param[in] myModeOpreation: Mode of operation ( low power mode ).
mcm 1:e8e0ef45b115 240 *
mcm 1:e8e0ef45b115 241 * @param[out] N/A.
mcm 1:e8e0ef45b115 242 *
mcm 1:e8e0ef45b115 243 *
mcm 1:e8e0ef45b115 244 * @return Status of TMP006_SetModeOperation.
mcm 1:e8e0ef45b115 245 *
mcm 1:e8e0ef45b115 246 *
mcm 1:e8e0ef45b115 247 * @author Manuel Caballero
mcm 2:97a7f871b612 248 * @date 10/December/2018
mcm 2:97a7f871b612 249 * @version 10/December/2018 The ORIGIN
mcm 1:e8e0ef45b115 250 * @pre N/A.
mcm 1:e8e0ef45b115 251 * @warning N/A.
mcm 1:e8e0ef45b115 252 */
mcm 1:e8e0ef45b115 253 TMP006::TMP006_status_t TMP006::TMP006_SetModeOperation ( TMP006_mod_t myModeOpreation )
mcm 1:e8e0ef45b115 254 {
mcm 1:e8e0ef45b115 255 char cmd[] = { 0U, 0U, 0U };
mcm 1:e8e0ef45b115 256 uint32_t aux;
mcm 1:e8e0ef45b115 257
mcm 1:e8e0ef45b115 258
mcm 1:e8e0ef45b115 259 /* Read the register */
mcm 1:e8e0ef45b115 260 cmd[0] = TMP006_CONFIGURATION;
mcm 1:e8e0ef45b115 261 aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
mcm 1:e8e0ef45b115 262 aux = _i2c.read ( _TMP006_Addr, &cmd[0], 2U );
mcm 1:e8e0ef45b115 263
mcm 1:e8e0ef45b115 264 /* Mask the option and update the register */
mcm 1:e8e0ef45b115 265 cmd[2] = cmd[1];
mcm 1:e8e0ef45b115 266 cmd[1] = ( ( cmd[0] & ~MOD_MASK ) | myModeOpreation );
mcm 1:e8e0ef45b115 267 cmd[0] = TMP006_CONFIGURATION;
mcm 1:e8e0ef45b115 268 aux = _i2c.write ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 1:e8e0ef45b115 269
mcm 1:e8e0ef45b115 270
mcm 1:e8e0ef45b115 271
mcm 1:e8e0ef45b115 272
mcm 1:e8e0ef45b115 273 if ( aux == I2C_SUCCESS )
mcm 1:e8e0ef45b115 274 {
mcm 1:e8e0ef45b115 275 return TMP006_SUCCESS;
mcm 1:e8e0ef45b115 276 }
mcm 1:e8e0ef45b115 277 else
mcm 1:e8e0ef45b115 278 {
mcm 1:e8e0ef45b115 279 return TMP006_FAILURE;
mcm 1:e8e0ef45b115 280 }
mcm 1:e8e0ef45b115 281 }
mcm 1:e8e0ef45b115 282
mcm 1:e8e0ef45b115 283
mcm 1:e8e0ef45b115 284
mcm 1:e8e0ef45b115 285 /**
mcm 1:e8e0ef45b115 286 * @brief TMP006_SetConversionRate ( TMP006_cr_t )
mcm 1:e8e0ef45b115 287 *
mcm 1:e8e0ef45b115 288 * @details It sets conversion rate.
mcm 1:e8e0ef45b115 289 *
mcm 1:e8e0ef45b115 290 * @param[in] myConversionRate: Conversion rate.
mcm 1:e8e0ef45b115 291 *
mcm 1:e8e0ef45b115 292 * @param[out] N/A.
mcm 1:e8e0ef45b115 293 *
mcm 1:e8e0ef45b115 294 *
mcm 1:e8e0ef45b115 295 * @return Status of TMP006_SetConversionRate.
mcm 1:e8e0ef45b115 296 *
mcm 1:e8e0ef45b115 297 *
mcm 1:e8e0ef45b115 298 * @author Manuel Caballero
mcm 2:97a7f871b612 299 * @date 10/December/2018
mcm 2:97a7f871b612 300 * @version 10/December/2018 The ORIGIN
mcm 1:e8e0ef45b115 301 * @pre N/A.
mcm 1:e8e0ef45b115 302 * @warning N/A.
mcm 1:e8e0ef45b115 303 */
mcm 1:e8e0ef45b115 304 TMP006::TMP006_status_t TMP006::TMP006_SetConversionRate ( TMP006_cr_t myConversionRate )
mcm 1:e8e0ef45b115 305 {
mcm 1:e8e0ef45b115 306 char cmd[] = { 0U, 0U, 0U };
mcm 1:e8e0ef45b115 307 uint32_t aux;
mcm 1:e8e0ef45b115 308
mcm 1:e8e0ef45b115 309
mcm 1:e8e0ef45b115 310 /* Read the register */
mcm 1:e8e0ef45b115 311 cmd[0] = TMP006_CONFIGURATION;
mcm 1:e8e0ef45b115 312 aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
mcm 1:e8e0ef45b115 313 aux = _i2c.read ( _TMP006_Addr, &cmd[0], 2U );
mcm 1:e8e0ef45b115 314
mcm 1:e8e0ef45b115 315 /* Mask the option and update the register */
mcm 1:e8e0ef45b115 316 cmd[2] = cmd[1];
mcm 1:e8e0ef45b115 317 cmd[1] = ( ( cmd[0] & ~CR_MASK ) | myConversionRate );
mcm 1:e8e0ef45b115 318 cmd[0] = TMP006_CONFIGURATION;
mcm 1:e8e0ef45b115 319 aux = _i2c.write ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 1:e8e0ef45b115 320
mcm 1:e8e0ef45b115 321
mcm 1:e8e0ef45b115 322
mcm 1:e8e0ef45b115 323
mcm 1:e8e0ef45b115 324 if ( aux == I2C_SUCCESS )
mcm 1:e8e0ef45b115 325 {
mcm 1:e8e0ef45b115 326 return TMP006_SUCCESS;
mcm 1:e8e0ef45b115 327 }
mcm 1:e8e0ef45b115 328 else
mcm 1:e8e0ef45b115 329 {
mcm 1:e8e0ef45b115 330 return TMP006_FAILURE;
mcm 1:e8e0ef45b115 331 }
mcm 1:e8e0ef45b115 332 }
mcm 1:e8e0ef45b115 333
mcm 1:e8e0ef45b115 334
mcm 1:e8e0ef45b115 335
mcm 1:e8e0ef45b115 336 /**
mcm 1:e8e0ef45b115 337 * @brief TMP006_SetnDRDY_EnableBit ( TMP006_en_t )
mcm 1:e8e0ef45b115 338 *
mcm 1:e8e0ef45b115 339 * @details It sets conversion rate.
mcm 1:e8e0ef45b115 340 *
mcm 1:e8e0ef45b115 341 * @param[in] myEnableBit: Enable bit pin behaviour.
mcm 1:e8e0ef45b115 342 *
mcm 1:e8e0ef45b115 343 * @param[out] N/A.
mcm 1:e8e0ef45b115 344 *
mcm 1:e8e0ef45b115 345 *
mcm 1:e8e0ef45b115 346 * @return Status of TMP006_SetnDRDY_EnableBit.
mcm 1:e8e0ef45b115 347 *
mcm 1:e8e0ef45b115 348 *
mcm 1:e8e0ef45b115 349 * @author Manuel Caballero
mcm 2:97a7f871b612 350 * @date 10/December/2018
mcm 2:97a7f871b612 351 * @version 10/December/2018 The ORIGIN
mcm 1:e8e0ef45b115 352 * @pre N/A.
mcm 1:e8e0ef45b115 353 * @warning N/A.
mcm 1:e8e0ef45b115 354 */
mcm 1:e8e0ef45b115 355 TMP006::TMP006_status_t TMP006::TMP006_SetnDRDY_EnableBit ( TMP006_en_t myEnableBit )
mcm 1:e8e0ef45b115 356 {
mcm 1:e8e0ef45b115 357 char cmd[] = { 0U, 0U, 0U };
mcm 1:e8e0ef45b115 358 uint32_t aux;
mcm 1:e8e0ef45b115 359
mcm 1:e8e0ef45b115 360
mcm 1:e8e0ef45b115 361 /* Read the register */
mcm 1:e8e0ef45b115 362 cmd[0] = TMP006_CONFIGURATION;
mcm 1:e8e0ef45b115 363 aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
mcm 1:e8e0ef45b115 364 aux = _i2c.read ( _TMP006_Addr, &cmd[0], 2U );
mcm 1:e8e0ef45b115 365
mcm 1:e8e0ef45b115 366 /* Mask the option and update the register */
mcm 1:e8e0ef45b115 367 cmd[2] = cmd[1];
mcm 1:e8e0ef45b115 368 cmd[1] = ( ( cmd[0] & ~EN_MASK ) | myEnableBit );
mcm 1:e8e0ef45b115 369 cmd[0] = TMP006_CONFIGURATION;
mcm 1:e8e0ef45b115 370 aux = _i2c.write ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
mcm 1:e8e0ef45b115 371
mcm 1:e8e0ef45b115 372
mcm 1:e8e0ef45b115 373
mcm 1:e8e0ef45b115 374
mcm 1:e8e0ef45b115 375 if ( aux == I2C_SUCCESS )
mcm 1:e8e0ef45b115 376 {
mcm 1:e8e0ef45b115 377 return TMP006_SUCCESS;
mcm 1:e8e0ef45b115 378 }
mcm 1:e8e0ef45b115 379 else
mcm 1:e8e0ef45b115 380 {
mcm 1:e8e0ef45b115 381 return TMP006_FAILURE;
mcm 1:e8e0ef45b115 382 }
mcm 1:e8e0ef45b115 383 }
mcm 1:e8e0ef45b115 384
mcm 1:e8e0ef45b115 385
mcm 1:e8e0ef45b115 386
mcm 1:e8e0ef45b115 387 /**
mcm 1:e8e0ef45b115 388 * @brief TMP006_GetRawTemperature ( TMP006_data_t* )
mcm 1:e8e0ef45b115 389 *
mcm 1:e8e0ef45b115 390 * @details It reads raw temperature ( T_DIE ) value.
mcm 1:e8e0ef45b115 391 *
mcm 1:e8e0ef45b115 392 * @param[in] N/A
mcm 1:e8e0ef45b115 393 *
mcm 1:e8e0ef45b115 394 * @param[out] myRawTemperature: Raw temperature value.
mcm 1:e8e0ef45b115 395 *
mcm 1:e8e0ef45b115 396 *
mcm 1:e8e0ef45b115 397 * @return Status of TMP006_GetRawTemperature.
mcm 1:e8e0ef45b115 398 *
mcm 1:e8e0ef45b115 399 *
mcm 1:e8e0ef45b115 400 * @author Manuel Caballero
mcm 1:e8e0ef45b115 401 * @date 10/December/2018
mcm 1:e8e0ef45b115 402 * @version 10/December/2018 The ORIGIN
mcm 1:e8e0ef45b115 403 * @pre N/A.
mcm 1:e8e0ef45b115 404 * @warning N/A.
mcm 1:e8e0ef45b115 405 */
mcm 1:e8e0ef45b115 406 TMP006::TMP006_status_t TMP006::TMP006_GetRawTemperature ( TMP006_data_t* myRawTemperature )
mcm 1:e8e0ef45b115 407 {
mcm 1:e8e0ef45b115 408 char cmd[] = { 0U, 0U };
mcm 1:e8e0ef45b115 409 uint32_t aux;
mcm 1:e8e0ef45b115 410
mcm 1:e8e0ef45b115 411
mcm 1:e8e0ef45b115 412 /* Read the register */
mcm 1:e8e0ef45b115 413 cmd[0] = TMP006_LOCAL_TEMPERATURE;
mcm 1:e8e0ef45b115 414 aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
mcm 1:e8e0ef45b115 415 aux = _i2c.read ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 1:e8e0ef45b115 416
mcm 1:e8e0ef45b115 417 /* Parse the data */
mcm 1:e8e0ef45b115 418 myRawTemperature->TemperatureRegister = cmd[0];
mcm 1:e8e0ef45b115 419 myRawTemperature->TemperatureRegister <<= 8U;
mcm 1:e8e0ef45b115 420 myRawTemperature->TemperatureRegister |= cmd[1];
mcm 1:e8e0ef45b115 421
mcm 1:e8e0ef45b115 422 /* Temperature register is configured as a 14-bit value */
mcm 1:e8e0ef45b115 423 myRawTemperature->TemperatureRegister >>= 2U;
mcm 1:e8e0ef45b115 424
mcm 1:e8e0ef45b115 425
mcm 1:e8e0ef45b115 426
mcm 1:e8e0ef45b115 427
mcm 1:e8e0ef45b115 428 if ( aux == I2C_SUCCESS )
mcm 1:e8e0ef45b115 429 {
mcm 1:e8e0ef45b115 430 return TMP006_SUCCESS;
mcm 1:e8e0ef45b115 431 }
mcm 1:e8e0ef45b115 432 else
mcm 1:e8e0ef45b115 433 {
mcm 1:e8e0ef45b115 434 return TMP006_FAILURE;
mcm 1:e8e0ef45b115 435 }
mcm 1:e8e0ef45b115 436 }
mcm 1:e8e0ef45b115 437
mcm 1:e8e0ef45b115 438
mcm 1:e8e0ef45b115 439
mcm 1:e8e0ef45b115 440 /**
mcm 1:e8e0ef45b115 441 * @brief TMP006_GetRawSensorVoltage ( TMP006_data_t* )
mcm 1:e8e0ef45b115 442 *
mcm 1:e8e0ef45b115 443 * @details It reads raw sensor voltage result ( V_SENSOR ) register.
mcm 1:e8e0ef45b115 444 *
mcm 1:e8e0ef45b115 445 * @param[in] N/A.
mcm 1:e8e0ef45b115 446 *
mcm 1:e8e0ef45b115 447 * @param[out] myRawVoltage: Raw sensor voltage value.
mcm 1:e8e0ef45b115 448 *
mcm 1:e8e0ef45b115 449 *
mcm 1:e8e0ef45b115 450 * @return Status of TMP006_GetRawSensorVoltage.
mcm 1:e8e0ef45b115 451 *
mcm 1:e8e0ef45b115 452 *
mcm 1:e8e0ef45b115 453 * @author Manuel Caballero
mcm 1:e8e0ef45b115 454 * @date 10/December/2018
mcm 1:e8e0ef45b115 455 * @version 10/December/2018 The ORIGIN
mcm 1:e8e0ef45b115 456 * @pre N/A.
mcm 1:e8e0ef45b115 457 * @warning N/A.
mcm 1:e8e0ef45b115 458 */
mcm 1:e8e0ef45b115 459 TMP006::TMP006_status_t TMP006::TMP006_GetRawSensorVoltage ( TMP006_data_t* myRawVoltage )
mcm 1:e8e0ef45b115 460 {
mcm 1:e8e0ef45b115 461 char cmd[] = { 0U, 0U };
mcm 1:e8e0ef45b115 462 uint32_t aux;
mcm 1:e8e0ef45b115 463
mcm 1:e8e0ef45b115 464
mcm 1:e8e0ef45b115 465 /* Read the register */
mcm 1:e8e0ef45b115 466 cmd[0] = TMP006_SENSOR_VOLTAGE;
mcm 1:e8e0ef45b115 467 aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
mcm 1:e8e0ef45b115 468 aux = _i2c.read ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
mcm 1:e8e0ef45b115 469
mcm 1:e8e0ef45b115 470 /* Parse the data */
mcm 1:e8e0ef45b115 471 myRawVoltage->SensorVoltageResultRegister = cmd[0];
mcm 1:e8e0ef45b115 472 myRawVoltage->SensorVoltageResultRegister <<= 8U;
mcm 1:e8e0ef45b115 473 myRawVoltage->SensorVoltageResultRegister |= cmd[1];
mcm 1:e8e0ef45b115 474
mcm 1:e8e0ef45b115 475
mcm 1:e8e0ef45b115 476
mcm 1:e8e0ef45b115 477
mcm 1:e8e0ef45b115 478 if ( aux == I2C_SUCCESS )
mcm 1:e8e0ef45b115 479 {
mcm 1:e8e0ef45b115 480 return TMP006_SUCCESS;
mcm 1:e8e0ef45b115 481 }
mcm 1:e8e0ef45b115 482 else
mcm 1:e8e0ef45b115 483 {
mcm 1:e8e0ef45b115 484 return TMP006_FAILURE;
mcm 1:e8e0ef45b115 485 }
mcm 1:e8e0ef45b115 486 }
mcm 1:e8e0ef45b115 487
mcm 1:e8e0ef45b115 488
mcm 1:e8e0ef45b115 489
mcm 1:e8e0ef45b115 490 /**
mcm 3:f632c66b30df 491 * @brief TMP006_CalculateSensorVoltage ( TMP006_data_t* )
mcm 3:f632c66b30df 492 *
mcm 3:f632c66b30df 493 * @details It calculates the real sensor voltage ( V_SENSOR ) value.
mcm 3:f632c66b30df 494 *
mcm 3:f632c66b30df 495 * @param[in] SensorVoltageResultRegister: Raw sensor voltage value.
mcm 3:f632c66b30df 496 *
mcm 3:f632c66b30df 497 * @param[out] myV_sensor: Real sensor voltage value.
mcm 3:f632c66b30df 498 *
mcm 3:f632c66b30df 499 *
mcm 3:f632c66b30df 500 * @return Status of TMP006_CalculateSensorVoltage.
mcm 3:f632c66b30df 501 *
mcm 3:f632c66b30df 502 *
mcm 3:f632c66b30df 503 * @author Manuel Caballero
mcm 3:f632c66b30df 504 * @date 10/December/2018
mcm 4:56398c14bf1f 505 * @version 11/December/2018 Bug fixed. Negative values are taken into consideration
mcm 4:56398c14bf1f 506 * 10/December/2018 The ORIGIN
mcm 3:f632c66b30df 507 * @pre N/A.
mcm 3:f632c66b30df 508 * @warning TMP006_GetRawSensorVoltage function must be called first.
mcm 3:f632c66b30df 509 */
mcm 3:f632c66b30df 510 TMP006::TMP006_status_t TMP006::TMP006_CalculateSensorVoltage ( TMP006_data_t* myV_sensor )
mcm 3:f632c66b30df 511 {
mcm 4:56398c14bf1f 512 uint8_t myDataPosNeg = 0U;
mcm 3:f632c66b30df 513 uint16_t aux = 0U;
mcm 3:f632c66b30df 514
mcm 3:f632c66b30df 515 aux = myV_sensor->SensorVoltageResultRegister;
mcm 3:f632c66b30df 516
mcm 3:f632c66b30df 517 /* Check if the sensor voltage value is negative, MSB = 1 */
mcm 3:f632c66b30df 518 if ( ( aux & 0x8000 ) == 0x8000 )
mcm 3:f632c66b30df 519 {
mcm 3:f632c66b30df 520 aux = ~aux;
mcm 3:f632c66b30df 521 aux += 1U;
mcm 4:56398c14bf1f 522
mcm 4:56398c14bf1f 523 myDataPosNeg = 1U;
mcm 3:f632c66b30df 524 }
mcm 3:f632c66b30df 525
mcm 3:f632c66b30df 526
mcm 3:f632c66b30df 527 /* Parse the data */
mcm 4:56398c14bf1f 528 myV_sensor->V_Sensor = (double)( aux * SVOL_1LSB / 1000000000.0 );
mcm 4:56398c14bf1f 529
mcm 4:56398c14bf1f 530 if ( myDataPosNeg == 1U )
mcm 4:56398c14bf1f 531 {
mcm 4:56398c14bf1f 532 myV_sensor->V_Sensor *= -1.0;
mcm 4:56398c14bf1f 533 }
mcm 3:f632c66b30df 534
mcm 3:f632c66b30df 535
mcm 3:f632c66b30df 536 return TMP006_SUCCESS;
mcm 3:f632c66b30df 537 }
mcm 3:f632c66b30df 538
mcm 3:f632c66b30df 539
mcm 3:f632c66b30df 540
mcm 3:f632c66b30df 541 /**
mcm 1:e8e0ef45b115 542 * @brief TMP006_CalculateTemperature ( TMP006_data_t* )
mcm 1:e8e0ef45b115 543 *
mcm 1:e8e0ef45b115 544 * @details It calculates the real temperature ( T_DIE ) value.
mcm 1:e8e0ef45b115 545 *
mcm 1:e8e0ef45b115 546 * @param[in] myRawTemperature: Raw temperature value.
mcm 1:e8e0ef45b115 547 *
mcm 1:e8e0ef45b115 548 * @param[out] myTemperature: Real Temperature value.
mcm 1:e8e0ef45b115 549 *
mcm 1:e8e0ef45b115 550 *
mcm 1:e8e0ef45b115 551 * @return Status of TMP006_CalculateTemperature.
mcm 1:e8e0ef45b115 552 *
mcm 1:e8e0ef45b115 553 *
mcm 1:e8e0ef45b115 554 * @author Manuel Caballero
mcm 1:e8e0ef45b115 555 * @date 10/December/2018
mcm 4:56398c14bf1f 556 * @version 11/December/2018 Bug fixed. Negative values are taken into consideration
mcm 4:56398c14bf1f 557 * 10/December/2018 The ORIGIN
mcm 1:e8e0ef45b115 558 * @pre N/A.
mcm 1:e8e0ef45b115 559 * @warning TMP006_GetRawTemperature function must be called first.
mcm 1:e8e0ef45b115 560 */
mcm 1:e8e0ef45b115 561 TMP006::TMP006_status_t TMP006::TMP006_CalculateTemperature ( TMP006_data_t* myTemperature )
mcm 1:e8e0ef45b115 562 {
mcm 4:56398c14bf1f 563 uint8_t myDataPosNeg = 0U;
mcm 1:e8e0ef45b115 564 uint16_t aux = 0U;
mcm 1:e8e0ef45b115 565
mcm 1:e8e0ef45b115 566 aux = myTemperature->TemperatureRegister;
mcm 1:e8e0ef45b115 567
mcm 1:e8e0ef45b115 568 /* Check if the temperature value is negative, MSB = 1 */
mcm 1:e8e0ef45b115 569 if ( ( aux & 0x2000 ) == 0x2000 )
mcm 1:e8e0ef45b115 570 {
mcm 1:e8e0ef45b115 571 aux = ~aux;
mcm 1:e8e0ef45b115 572 aux += 1U;
mcm 4:56398c14bf1f 573
mcm 4:56398c14bf1f 574 myDataPosNeg = 1U;
mcm 1:e8e0ef45b115 575 }
mcm 1:e8e0ef45b115 576
mcm 1:e8e0ef45b115 577
mcm 1:e8e0ef45b115 578 /* Parse the data */
mcm 1:e8e0ef45b115 579 myTemperature->TemperatureC = (float)( aux * TEMP_1LSB ); // Celsius degrees
mcm 4:56398c14bf1f 580
mcm 4:56398c14bf1f 581 if ( myDataPosNeg == 1U )
mcm 4:56398c14bf1f 582 {
mcm 4:56398c14bf1f 583 myTemperature->TemperatureC *= -1.0;
mcm 4:56398c14bf1f 584 }
mcm 4:56398c14bf1f 585
mcm 1:e8e0ef45b115 586 myTemperature->TemperatureK = (float)( myTemperature->TemperatureC + 273.15 ); // Kelvins degrees
mcm 1:e8e0ef45b115 587
mcm 1:e8e0ef45b115 588
mcm 1:e8e0ef45b115 589
mcm 1:e8e0ef45b115 590 return TMP006_SUCCESS;
mcm 1:e8e0ef45b115 591 }
mcm 1:e8e0ef45b115 592
mcm 1:e8e0ef45b115 593
mcm 1:e8e0ef45b115 594
mcm 1:e8e0ef45b115 595 /**
mcm 1:e8e0ef45b115 596 * @brief TMP006_CalculateObjectTemperature ( TMP006_data_t* )
mcm 1:e8e0ef45b115 597 *
mcm 1:e8e0ef45b115 598 * @details It calculates the real temperature ( T_DIE ) value.
mcm 1:e8e0ef45b115 599 *
mcm 1:e8e0ef45b115 600 * @param[in] myRawTemperature: Raw temperature value.
mcm 1:e8e0ef45b115 601 *
mcm 1:e8e0ef45b115 602 * @param[out] myObjTemperature: Real Object Temperature value.
mcm 1:e8e0ef45b115 603 *
mcm 1:e8e0ef45b115 604 *
mcm 1:e8e0ef45b115 605 * @return Status of TMP006_CalculateObjectTemperature.
mcm 1:e8e0ef45b115 606 *
mcm 1:e8e0ef45b115 607 *
mcm 1:e8e0ef45b115 608 * @author Manuel Caballero
mcm 1:e8e0ef45b115 609 * @date 10/December/2018
mcm 4:56398c14bf1f 610 * @version 11/December/2018 Precision was increased from float to double
mcm 4:56398c14bf1f 611 * 10/December/2018 The ORIGIN
mcm 1:e8e0ef45b115 612 * @pre N/A.
mcm 1:e8e0ef45b115 613 * @warning TMP006_CalculateTemperature and TMP006_GetRawSensorVoltage functions must be called first.
mcm 1:e8e0ef45b115 614 */
mcm 1:e8e0ef45b115 615 TMP006::TMP006_status_t TMP006::TMP006_CalculateObjectTemperature ( TMP006_data_t* myObjTemperature )
mcm 1:e8e0ef45b115 616 {
mcm 4:56398c14bf1f 617 double s = 0.0;
mcm 4:56398c14bf1f 618 double v_os = 0.0;
mcm 4:56398c14bf1f 619 double f_v_obj = 0.0;
mcm 1:e8e0ef45b115 620
mcm 1:e8e0ef45b115 621 /* Claculate the sensitivity of the thermopile sensor */
mcm 4:56398c14bf1f 622 s = myObjTemperature->s0 * ( 1.0 + A1 * ( myObjTemperature->TemperatureK - T_REF ) + A2 * pow( ( myObjTemperature->TemperatureK - T_REF ), (double)2U ) );
mcm 1:e8e0ef45b115 623
mcm 1:e8e0ef45b115 624 /* Calculate the offset voltage */
mcm 4:56398c14bf1f 625 v_os = B0 + B1 * (double)( myObjTemperature->TemperatureK - T_REF ) + B2 * pow( ( myObjTemperature->TemperatureK - T_REF ), (double)2U );
mcm 1:e8e0ef45b115 626
mcm 1:e8e0ef45b115 627 /* Model the Seebeck coefficients of the thermopile */
mcm 4:56398c14bf1f 628 f_v_obj = ( myObjTemperature->V_Sensor - v_os ) + C2 * pow( ( myObjTemperature->V_Sensor - v_os ), (double)2U );
mcm 1:e8e0ef45b115 629
mcm 1:e8e0ef45b115 630 /* Relates the radiant transfer of IR energy between the target object and the TMP006 and the conducted heat in the thermopile in the TMP006 */
mcm 4:56398c14bf1f 631 myObjTemperature->ObjectTemperatureK = sqrt( sqrt( pow( (double)myObjTemperature->TemperatureK, (double)4U ) + (double)( f_v_obj / s ) ) );
mcm 1:e8e0ef45b115 632 myObjTemperature->ObjectTemperatureC = ( myObjTemperature->ObjectTemperatureK - 273.15 );
mcm 1:e8e0ef45b115 633
mcm 1:e8e0ef45b115 634
mcm 1:e8e0ef45b115 635
mcm 1:e8e0ef45b115 636 return TMP006_SUCCESS;
mcm 1:e8e0ef45b115 637 }