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.
Diff: TMP006.cpp
- Revision:
- 1:e8e0ef45b115
- Child:
- 2:97a7f871b612
diff -r 9d62c3a02ba5 -r e8e0ef45b115 TMP006.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TMP006.cpp Mon Dec 10 14:49:48 2018 +0000 @@ -0,0 +1,575 @@ +/** + * @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 7/December/2018 + * @version 7/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 7/December/2018 + * @version 7/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 7/December/2018 + * @version 7/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 7/December/2018 + * @version 7/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 7/December/2018 + * @version 7/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 7/December/2018 + * @version 7/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 7/December/2018 + * @version 7/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; +} \ No newline at end of file