Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
TMP006.cpp
- Committer:
- mcm
- Date:
- 2018-12-10
- Revision:
- 2:97a7f871b612
- Parent:
- 1:e8e0ef45b115
- Child:
- 3:f632c66b30df
File content as of revision 2:97a7f871b612:
/**
* @brief TMP006.c
* @details Infrared Thermopile Sensor in Chip-Scale Package.
* Functions file.
*
*
* @return N/A
*
* @author Manuel Caballero
* @date 10/December/2018
* @version 10/December/2018 The ORIGIN
* @pre N/A
* @warning N/A
* @pre This code belongs to Nimbus Centre ( http://www.nimbus.cit.ie ). All rights reserved.
*/
#include "TMP006.h"
TMP006::TMP006 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
: _i2c ( sda, scl )
, _TMP006_Addr ( addr )
{
_i2c.frequency( freq );
}
TMP006::~TMP006()
{
}
/**
* @brief TMP006_GetManufacturerID ( TMP006_data_t* )
*
* @details It gets the manufacturer ID.
*
* @param[in] N/A
*
* @param[out] myManufacturerID: Manufacturer ID.
*
*
* @return Status of TMP006_GetManufacturerID.
*
*
* @author Manuel Caballero
* @date 10/December/2018
* @version 10/December/2018 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
TMP006::TMP006_status_t TMP006::TMP006_GetManufacturerID ( TMP006_data_t* myManufacturerID )
{
char cmd[] = { 0U, 0U };
uint32_t aux;
/* Read the register */
cmd[0] = TMP006_MANUFACTURER_ID;
aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
/* Parse data */
myManufacturerID->ManufacturerID = ( cmd[0] << 8U );
myManufacturerID->ManufacturerID |= cmd[1];
if ( aux == I2C_SUCCESS )
{
return TMP006_SUCCESS;
}
else
{
return TMP006_FAILURE;
}
}
/**
* @brief TMP006_GetDeviceID ( TMP006_data_t* )
*
* @details It gets the device ID.
*
* @param[in] N/A.
*
* @param[out] myDeviceID: Device ID.
*
*
* @return Status of TMP006_GetDeviceID.
*
*
* @author Manuel Caballero
* @date 10/December/2018
* @version 10/December/2018 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
TMP006::TMP006_status_t TMP006::TMP006_GetDeviceID ( TMP006_data_t* myDeviceID )
{
char cmd[] = { 0U, 0U };
uint32_t aux;
/* Read the register */
cmd[0] = TMP006_DEVICE_ID;
aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
/* Parse data */
myDeviceID->DeviceID = ( cmd[0] << 8U );
myDeviceID->DeviceID |= cmd[1];
if ( aux == I2C_SUCCESS )
{
return TMP006_SUCCESS;
}
else
{
return TMP006_FAILURE;
}
}
/**
* @brief TMP006_ReadConfigurationRegister ( TMP006_data_t* )
*
* @details It reads the configuration register.
*
* @param[in] N/A
*
* @param[out] myConfReg: Configuration register value.
*
*
* @return Status of TMP006_ReadConfigurationRegister.
*
*
* @author Manuel Caballero
* @date 10/December/2018
* @version 10/December/2018 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
TMP006::TMP006_status_t TMP006::TMP006_ReadConfigurationRegister ( TMP006_data_t* myConfReg )
{
char cmd[] = { 0U, 0U };
uint32_t aux;
/* Read the register */
cmd[0] = TMP006_CONFIGURATION;
aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
/* Parse data */
myConfReg->ConfigurationRegister = ( cmd[0] << 8U );
myConfReg->ConfigurationRegister |= cmd[1];
if ( aux == I2C_SUCCESS )
{
return TMP006_SUCCESS;
}
else
{
return TMP006_FAILURE;
}
}
/**
* @brief TMP006_SoftwareReset ( void )
*
* @details It performs a software reset.
*
* @param[in] N/A.
*
* @param[out] N/A.
*
*
* @return Status of TMP006_SoftwareReset.
*
*
* @author Manuel Caballero
* @date 10/December/2018
* @version 10/December/2018 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
TMP006::TMP006_status_t TMP006::TMP006_SoftwareReset ( void )
{
char cmd[] = { 0U, 0U, 0U };
uint32_t aux;
/* Read the register */
cmd[0] = TMP006_CONFIGURATION;
aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _TMP006_Addr, &cmd[0], 2U );
/* Mask the option and update the register */
cmd[2] = cmd[1];
cmd[1] = ( ( cmd[0] & ~RST_BIT_MASK ) | RST_SOFTWARE_RESET );
cmd[0] = TMP006_CONFIGURATION;
aux = _i2c.write ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS )
{
return TMP006_SUCCESS;
}
else
{
return TMP006_FAILURE;
}
}
/**
* @brief TMP006_SetModeOperation ( TMP006_mod_t )
*
* @details It sets mode of operation.
*
* @param[in] myModeOpreation: Mode of operation ( low power mode ).
*
* @param[out] N/A.
*
*
* @return Status of TMP006_SetModeOperation.
*
*
* @author Manuel Caballero
* @date 10/December/2018
* @version 10/December/2018 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
TMP006::TMP006_status_t TMP006::TMP006_SetModeOperation ( TMP006_mod_t myModeOpreation )
{
char cmd[] = { 0U, 0U, 0U };
uint32_t aux;
/* Read the register */
cmd[0] = TMP006_CONFIGURATION;
aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _TMP006_Addr, &cmd[0], 2U );
/* Mask the option and update the register */
cmd[2] = cmd[1];
cmd[1] = ( ( cmd[0] & ~MOD_MASK ) | myModeOpreation );
cmd[0] = TMP006_CONFIGURATION;
aux = _i2c.write ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS )
{
return TMP006_SUCCESS;
}
else
{
return TMP006_FAILURE;
}
}
/**
* @brief TMP006_SetConversionRate ( TMP006_cr_t )
*
* @details It sets conversion rate.
*
* @param[in] myConversionRate: Conversion rate.
*
* @param[out] N/A.
*
*
* @return Status of TMP006_SetConversionRate.
*
*
* @author Manuel Caballero
* @date 10/December/2018
* @version 10/December/2018 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
TMP006::TMP006_status_t TMP006::TMP006_SetConversionRate ( TMP006_cr_t myConversionRate )
{
char cmd[] = { 0U, 0U, 0U };
uint32_t aux;
/* Read the register */
cmd[0] = TMP006_CONFIGURATION;
aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _TMP006_Addr, &cmd[0], 2U );
/* Mask the option and update the register */
cmd[2] = cmd[1];
cmd[1] = ( ( cmd[0] & ~CR_MASK ) | myConversionRate );
cmd[0] = TMP006_CONFIGURATION;
aux = _i2c.write ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS )
{
return TMP006_SUCCESS;
}
else
{
return TMP006_FAILURE;
}
}
/**
* @brief TMP006_SetnDRDY_EnableBit ( TMP006_en_t )
*
* @details It sets conversion rate.
*
* @param[in] myEnableBit: Enable bit pin behaviour.
*
* @param[out] N/A.
*
*
* @return Status of TMP006_SetnDRDY_EnableBit.
*
*
* @author Manuel Caballero
* @date 10/December/2018
* @version 10/December/2018 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
TMP006::TMP006_status_t TMP006::TMP006_SetnDRDY_EnableBit ( TMP006_en_t myEnableBit )
{
char cmd[] = { 0U, 0U, 0U };
uint32_t aux;
/* Read the register */
cmd[0] = TMP006_CONFIGURATION;
aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _TMP006_Addr, &cmd[0], 2U );
/* Mask the option and update the register */
cmd[2] = cmd[1];
cmd[1] = ( ( cmd[0] & ~EN_MASK ) | myEnableBit );
cmd[0] = TMP006_CONFIGURATION;
aux = _i2c.write ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
if ( aux == I2C_SUCCESS )
{
return TMP006_SUCCESS;
}
else
{
return TMP006_FAILURE;
}
}
/**
* @brief TMP006_GetRawTemperature ( TMP006_data_t* )
*
* @details It reads raw temperature ( T_DIE ) value.
*
* @param[in] N/A
*
* @param[out] myRawTemperature: Raw temperature value.
*
*
* @return Status of TMP006_GetRawTemperature.
*
*
* @author Manuel Caballero
* @date 10/December/2018
* @version 10/December/2018 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
TMP006::TMP006_status_t TMP006::TMP006_GetRawTemperature ( TMP006_data_t* myRawTemperature )
{
char cmd[] = { 0U, 0U };
uint32_t aux;
/* Read the register */
cmd[0] = TMP006_LOCAL_TEMPERATURE;
aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
/* Parse the data */
myRawTemperature->TemperatureRegister = cmd[0];
myRawTemperature->TemperatureRegister <<= 8U;
myRawTemperature->TemperatureRegister |= cmd[1];
/* Temperature register is configured as a 14-bit value */
myRawTemperature->TemperatureRegister >>= 2U;
if ( aux == I2C_SUCCESS )
{
return TMP006_SUCCESS;
}
else
{
return TMP006_FAILURE;
}
}
/**
* @brief TMP006_GetRawSensorVoltage ( TMP006_data_t* )
*
* @details It reads raw sensor voltage result ( V_SENSOR ) register.
*
* @param[in] N/A.
*
* @param[out] myRawVoltage: Raw sensor voltage value.
*
*
* @return Status of TMP006_GetRawSensorVoltage.
*
*
* @author Manuel Caballero
* @date 10/December/2018
* @version 10/December/2018 The ORIGIN
* @pre N/A.
* @warning N/A.
*/
TMP006::TMP006_status_t TMP006::TMP006_GetRawSensorVoltage ( TMP006_data_t* myRawVoltage )
{
char cmd[] = { 0U, 0U };
uint32_t aux;
/* Read the register */
cmd[0] = TMP006_SENSOR_VOLTAGE;
aux = _i2c.write ( _TMP006_Addr, &cmd[0], 1U, true );
aux = _i2c.read ( _TMP006_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
/* Parse the data */
myRawVoltage->SensorVoltageResultRegister = cmd[0];
myRawVoltage->SensorVoltageResultRegister <<= 8U;
myRawVoltage->SensorVoltageResultRegister |= cmd[1];
if ( aux == I2C_SUCCESS )
{
return TMP006_SUCCESS;
}
else
{
return TMP006_FAILURE;
}
}
/**
* @brief TMP006_CalculateTemperature ( TMP006_data_t* )
*
* @details It calculates the real temperature ( T_DIE ) value.
*
* @param[in] myRawTemperature: Raw temperature value.
*
* @param[out] myTemperature: Real Temperature value.
*
*
* @return Status of TMP006_CalculateTemperature.
*
*
* @author Manuel Caballero
* @date 10/December/2018
* @version 10/December/2018 The ORIGIN
* @pre N/A.
* @warning TMP006_GetRawTemperature function must be called first.
*/
TMP006::TMP006_status_t TMP006::TMP006_CalculateTemperature ( TMP006_data_t* myTemperature )
{
uint16_t aux = 0U;
aux = myTemperature->TemperatureRegister;
/* Check if the temperature value is negative, MSB = 1 */
if ( ( aux & 0x2000 ) == 0x2000 )
{
aux = ~aux;
aux += 1U;
}
/* Parse the data */
myTemperature->TemperatureC = (float)( aux * TEMP_1LSB ); // Celsius degrees
myTemperature->TemperatureK = (float)( myTemperature->TemperatureC + 273.15 ); // Kelvins degrees
return TMP006_SUCCESS;
}
/**
* @brief TMP006_CalculateObjectTemperature ( TMP006_data_t* )
*
* @details It calculates the real temperature ( T_DIE ) value.
*
* @param[in] myRawTemperature: Raw temperature value.
*
* @param[out] myObjTemperature: Real Object Temperature value.
*
*
* @return Status of TMP006_CalculateObjectTemperature.
*
*
* @author Manuel Caballero
* @date 10/December/2018
* @version 10/December/2018 The ORIGIN
* @pre N/A.
* @warning TMP006_CalculateTemperature and TMP006_GetRawSensorVoltage functions must be called first.
*/
TMP006::TMP006_status_t TMP006::TMP006_CalculateObjectTemperature ( TMP006_data_t* myObjTemperature )
{
float s = 0.0;
float v_os = 0.0;
float f_v_obj = 0.0;
/* Claculate the sensitivity of the thermopile sensor */
s = myObjTemperature->s0 * ( 1 + A1 * ( myObjTemperature->TemperatureK - T_REF ) + A2 * pow( (double)( myObjTemperature->TemperatureK - T_REF ), (double)2U ) );
/* Calculate the offset voltage */
v_os = B0 + B1 * ( myObjTemperature->TemperatureK - T_REF ) + B2 * pow( (double)( myObjTemperature->TemperatureK - T_REF ), (double)2U );
/* Model the Seebeck coefficients of the thermopile */
f_v_obj = ( myObjTemperature->SensorVoltageResultRegister - v_os ) + C2 * pow( (double)( myObjTemperature->SensorVoltageResultRegister - v_os ), (double)2U );
/* Relates the radiant transfer of IR energy between the target object and the TMP006 and the conducted heat in the thermopile in the TMP006 */
myObjTemperature->ObjectTemperatureK = sqrt( sqrt( pow( (double)myObjTemperature->TemperatureK, (double)4U ) + ( f_v_obj / s ) ) );
myObjTemperature->ObjectTemperatureC = ( myObjTemperature->ObjectTemperatureK - 273.15 );
return TMP006_SUCCESS;
}