Manuel Caballero / TMP006
Revision:
1:e8e0ef45b115
Child:
2:97a7f871b612
--- /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