diff --git a/drivers/include/tmp006.h b/drivers/include/tmp006.h index 341d7b350c..56c3df3d01 100644 --- a/drivers/include/tmp006.h +++ b/drivers/include/tmp006.h @@ -1,209 +1,209 @@ -/* - * Copyright (C) 2014 PHYTEC Messtechnik GmbH - * - * This file is subject to the terms and conditions of the GNU Lesser - * General Public License v2.1. See the file LICENSE in the top level - * directory for more details. - */ - -/** - * @defgroup drivers_tmp006 TMP006 Infrared Thermopile Sensor - * @ingroup drivers - * @brief Driver for the Texas Instruments TMP006 sensor. - * The sensor measures the temperature of an object - * without the need of direct contact with the object. - * After initialization and set active the sensor - * will make measurements at periodic times. - * The conversion duration depends on oversample ratio.
- * The oversample ratio can be determined - * by sensor initialization.
- * The target object temperature can be calculated as follows:

- * Temperature of sensor's die (2 times right shifting and devide-by 32): - * \f{eqnarray*}{ - * T_{\mathrm{DIE}} &=& \frac{T_{\mathrm{RAW}}}{128} - * \f} - * Difference Temperature in Kelvin: - * \f{eqnarray*}{ - * T_{\mathrm{DIFF}} &=& T_{\mathrm{DIE}} - T_{\mathrm{REF}} - * \f} - * Sensitivity of the thermopile sensor, - * with \f$S_{\mathrm{0}}\f$ as calibration factor: - * \f{eqnarray*}{ - * S &=& S_{\mathrm{0}} \cdot ( 1 + a_1 \cdot T_{\mathrm{DIFF}} - * + a_2 \cdot T_{\mathrm{DIFF}}^2 ) \\ - * \f} - * Sensor's voltage (the LSB size is \f$ 156.25\,\mathrm{nV} \f$): - * \f{eqnarray*}{ - * V_{\mathrm{OBJ}} &=& V_{\mathrm{RAW}} \cdot 156.25\,\mathrm{nV} - * \f} - * Offset voltage: - * \f{eqnarray*}{ - * V_{OS} &=& b_0 + b_1 \cdot T_{\mathrm{DIFF}} - * + b_2 \cdot T_{\mathrm{DIFF}}^2 \\ - * \f} - * Seebeck coefficients of the thermopile: - * \f{eqnarray*}{ - * f(V_{\mathrm{OBJ}}) &=& (V_{\mathrm{OBJ}} - V_{O\mathrm{S}}) - * + c_2 \cdot (V_{\mathrm{OBJ}} - V_{\mathrm{OS}})^2 \\ - * \f} - * Temperature of the target object: - * \f{eqnarray*}{ - * T_{\mathrm{OBJ}} &=& \sqrt[4]{T_{\mathrm{DIE}}^4 - * + \frac{f(V_{\mathrm{OBJ}})}{S}} \\ - * \f} - * Constants:
- * \f{eqnarray*}{ - * a_{\mathrm{1}} &=& 1.75 \cdot 10^{-3} \\ - * a_{\mathrm{2}} &=& -1.678 \cdot 10^{-5} \\ - * T_{\mathrm{REF}} &=& 298.15\,\mathrm{K} \\ - * b_{\mathrm{0}} &=& -2.94 \cdot 10^{-5} \\ - * b_{\mathrm{1}} &=& -5.7 \cdot 10^{-7} \\ - * b_{\mathrm{2}} &=& 4.63 \cdot 10^{-9} \\ - * c_{\mathrm{2}} &=& 13.4 - * \f} - * - * The calculation and constants are wrapped from TI TMP006 User's Guide SBOU107. - * - * @{ - * - * @file - * @brief Interface definition for the TMP006 sensor driver. - * - * @author Johann Fischer - */ - -#ifndef TMP006_H -#define TMP006_H - -#include -#include -#include "periph/i2c.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#ifndef TMP006_I2C_ADDRESS -#define TMP006_I2C_ADDRESS 0x41 /**< TMP006 Sensor Default Address */ -#endif - -#ifndef TMP006_CONVERSION_TIME -#define TMP006_CONVERSION_TIME 1E6 /**< Default Conversion Time in us */ -#endif - -#define TMP006_CONFIG_CR_AS1 0x00 /**< Conversion Time 0.25 s, AVG Samples: 1 */ -#define TMP006_CONFIG_CR_AS2 0x01 /**< Conversion Time 0.5 s, AVG Samples: 2 */ -#define TMP006_CONFIG_CR_AS4 0x02 /**< Conversion Time 1 s, AVG Samples: 4 */ -#define TMP006_CONFIG_CR_AS8 0x03 /**< Conversion Time 2 s, AVG Samples: 8 */ -#define TMP006_CONFIG_CR_AS16 0x04 /**< Conversion Time 4 s, AVG Samples: 16 */ -#define TMP006_CONFIG_CR_DEF TMP006_CONFIG_CR_AS4 /**< Default for Testing */ - -#ifndef TMP006_CCONST_S0 -#define TMP006_CCONST_S0 6.4E-14 /**< Calibration Factor */ -#endif - -#define TMP006_CCONST_A1 1.75E-3 /**< Constant \f$a_{\mathrm{1}}\f$ */ -#define TMP006_CCONST_A2 -1.678E-5 /**< Constant \f$a_{\mathrm{2}}\f$ */ -#define TMP006_CCONST_TREF 298.15 /**< Constant \f$T_{\mathrm{REF}\f$ */ -#define TMP006_CCONST_B0 -2.94E-5 /**< Constant \f$b_{\mathrm{0}}\f$ */ -#define TMP006_CCONST_B1 -5.7E-7 /**< Constant \f$b_{\mathrm{1}}\f$ */ -#define TMP006_CCONST_B2 4.63E-9 /**< Constant \f$b_{\mathrm{2}}\f$ */ -#define TMP006_CCONST_C2 13.4 /**< Constant \f$c_{\mathrm{2}}\f$ */ -#define TMP006_CCONST_LSB_SIZE 156.25E-9 /**< Sensor Voltage Register LSB Size */ - -/** - * @brief Device descriptor for TMP006 sensors. - */ -typedef struct { - i2c_t i2c; /**< I2C device, the sensor is connected to */ - uint8_t addr; /**< the sensor's slave address on the I2C bus */ - bool initialized; /**< sensor status, true if sensor is initialized */ -} tmp006_t; - -/** - * @brief TMP006 sensor test. - * This function looks for Device ID of the TMP006 sensor. - * - * @param[in] dev device descriptor of sensor - * - * @return 0 on success - * @return -1 on error - */ -int tmp006_test(tmp006_t *dev); - -/** - * @brief Initialize the TMP006 sensor driver. - * - * @param[out] dev device descriptor of sensor to initialize - * @param[in] i2c I2C bus the sensor is connected to - * @param[in] address sensor's I2C slave address - * @param[in] conv_rate number of averaged samples - * - * @return 0 on success - * @return -1 if conv_rate is wrong - * @return -2 if initialization of I2C bus failed - * @return -3 if sensor test failed - * @return -4 if sensor configuration failed - */ -int tmp006_init(tmp006_t *dev, i2c_t i2c, uint8_t address, uint8_t conv_rate); - -/** - * @brief Reset the TMP006 sensor. After that, the sensor should be reinitialized. - * - * @param[out] dev device descriptor of sensor - * - * @return 0 on success - * @return -1 on error - */ -int tmp006_reset(tmp006_t *dev); - -/** - * @brief Set active mode, this enables periodic measurements. - * - * @param[in] dev device descriptor of sensor - * - * @return 0 on success - * @return -1 on error - */ -int tmp006_set_active(tmp006_t *dev); - -/** - * @brief Set standby mode. - * - * @param[in] dev device descriptor of sensor - * - * @return 0 on success - * @return -1 on error - */ -int tmp006_set_standby(tmp006_t *dev); - -/** - * @brief Read sensor's data. - * - * @param[in] dev device descriptor of sensor - * @param[out] rawv object voltage value - * @param[out] rawt raw die temperature - * @param[out] drdy data ready, 0 if a conversion is in progress - * - * @return 0 on success - * @return -1 on error - */ -int tmp006_read(tmp006_t *dev, int16_t *rawv, int16_t *rawt, uint8_t *drdy); - -/** - * @brief Convert raw sensor values to temperature. - * - * @param[in] rawv object voltage value - * @param[in] rawt raw die temperature value - * @param[out] tamb converted ambient temperature - * @param[out] tobj converted object temperature - */ -void tmp006_convert(int16_t rawv, int16_t rawt, float *tamb, float *tobj); - -#ifdef __cplusplus -} -#endif - -#endif -/** @} */ +/* + * Copyright (C) 2014 PHYTEC Messtechnik GmbH + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @defgroup drivers_tmp006 TMP006 Infrared Thermopile Sensor + * @ingroup drivers + * @brief Driver for the Texas Instruments TMP006 sensor. + * The sensor measures the temperature of an object + * without the need of direct contact with the object. + * After initialization and set active the sensor + * will make measurements at periodic times. + * The conversion duration depends on oversample ratio.
+ * The oversample ratio can be determined + * by sensor initialization.
+ * The target object temperature can be calculated as follows:

+ * Temperature of sensor's die (2 times right shifting and devide-by 32): + * \f{eqnarray*}{ + * T_{\mathrm{DIE}} &=& \frac{T_{\mathrm{RAW}}}{128} + * \f} + * Difference Temperature in Kelvin: + * \f{eqnarray*}{ + * T_{\mathrm{DIFF}} &=& T_{\mathrm{DIE}} - T_{\mathrm{REF}} + * \f} + * Sensitivity of the thermopile sensor, + * with \f$S_{\mathrm{0}}\f$ as calibration factor: + * \f{eqnarray*}{ + * S &=& S_{\mathrm{0}} \cdot ( 1 + a_1 \cdot T_{\mathrm{DIFF}} + * + a_2 \cdot T_{\mathrm{DIFF}}^2 ) \\ + * \f} + * Sensor's voltage (the LSB size is \f$ 156.25\,\mathrm{nV} \f$): + * \f{eqnarray*}{ + * V_{\mathrm{OBJ}} &=& V_{\mathrm{RAW}} \cdot 156.25\,\mathrm{nV} + * \f} + * Offset voltage: + * \f{eqnarray*}{ + * V_{OS} &=& b_0 + b_1 \cdot T_{\mathrm{DIFF}} + * + b_2 \cdot T_{\mathrm{DIFF}}^2 \\ + * \f} + * Seebeck coefficients of the thermopile: + * \f{eqnarray*}{ + * f(V_{\mathrm{OBJ}}) &=& (V_{\mathrm{OBJ}} - V_{O\mathrm{S}}) + * + c_2 \cdot (V_{\mathrm{OBJ}} - V_{\mathrm{OS}})^2 \\ + * \f} + * Temperature of the target object: + * \f{eqnarray*}{ + * T_{\mathrm{OBJ}} &=& \sqrt[4]{T_{\mathrm{DIE}}^4 + * + \frac{f(V_{\mathrm{OBJ}})}{S}} \\ + * \f} + * Constants:
+ * \f{eqnarray*}{ + * a_{\mathrm{1}} &=& 1.75 \cdot 10^{-3} \\ + * a_{\mathrm{2}} &=& -1.678 \cdot 10^{-5} \\ + * T_{\mathrm{REF}} &=& 298.15\,\mathrm{K} \\ + * b_{\mathrm{0}} &=& -2.94 \cdot 10^{-5} \\ + * b_{\mathrm{1}} &=& -5.7 \cdot 10^{-7} \\ + * b_{\mathrm{2}} &=& 4.63 \cdot 10^{-9} \\ + * c_{\mathrm{2}} &=& 13.4 + * \f} + * + * The calculation and constants are wrapped from TI TMP006 User's Guide SBOU107. + * + * @{ + * + * @file + * @brief Interface definition for the TMP006 sensor driver. + * + * @author Johann Fischer + */ + +#ifndef TMP006_H +#define TMP006_H + +#include +#include +#include "periph/i2c.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifndef TMP006_I2C_ADDRESS +#define TMP006_I2C_ADDRESS 0x41 /**< TMP006 Sensor Default Address */ +#endif + +#ifndef TMP006_CONVERSION_TIME +#define TMP006_CONVERSION_TIME 1E6 /**< Default Conversion Time in us */ +#endif + +#define TMP006_CONFIG_CR_AS1 0x00 /**< Conversion Time 0.25 s, AVG Samples: 1 */ +#define TMP006_CONFIG_CR_AS2 0x01 /**< Conversion Time 0.5 s, AVG Samples: 2 */ +#define TMP006_CONFIG_CR_AS4 0x02 /**< Conversion Time 1 s, AVG Samples: 4 */ +#define TMP006_CONFIG_CR_AS8 0x03 /**< Conversion Time 2 s, AVG Samples: 8 */ +#define TMP006_CONFIG_CR_AS16 0x04 /**< Conversion Time 4 s, AVG Samples: 16 */ +#define TMP006_CONFIG_CR_DEF TMP006_CONFIG_CR_AS4 /**< Default for Testing */ + +#ifndef TMP006_CCONST_S0 +#define TMP006_CCONST_S0 6.4E-14 /**< Calibration Factor */ +#endif + +#define TMP006_CCONST_A1 1.75E-3 /**< Constant \f$a_{\mathrm{1}}\f$ */ +#define TMP006_CCONST_A2 -1.678E-5 /**< Constant \f$a_{\mathrm{2}}\f$ */ +#define TMP006_CCONST_TREF 298.15 /**< Constant \f$T_{\mathrm{REF}\f$ */ +#define TMP006_CCONST_B0 -2.94E-5 /**< Constant \f$b_{\mathrm{0}}\f$ */ +#define TMP006_CCONST_B1 -5.7E-7 /**< Constant \f$b_{\mathrm{1}}\f$ */ +#define TMP006_CCONST_B2 4.63E-9 /**< Constant \f$b_{\mathrm{2}}\f$ */ +#define TMP006_CCONST_C2 13.4 /**< Constant \f$c_{\mathrm{2}}\f$ */ +#define TMP006_CCONST_LSB_SIZE 156.25E-9 /**< Sensor Voltage Register LSB Size */ + +/** + * @brief Device descriptor for TMP006 sensors. + */ +typedef struct { + i2c_t i2c; /**< I2C device, the sensor is connected to */ + uint8_t addr; /**< the sensor's slave address on the I2C bus */ + bool initialized; /**< sensor status, true if sensor is initialized */ +} tmp006_t; + +/** + * @brief TMP006 sensor test. + * This function looks for Device ID of the TMP006 sensor. + * + * @param[in] dev device descriptor of sensor + * + * @return 0 on success + * @return -1 on error + */ +int tmp006_test(tmp006_t *dev); + +/** + * @brief Initialize the TMP006 sensor driver. + * + * @param[out] dev device descriptor of sensor to initialize + * @param[in] i2c I2C bus the sensor is connected to + * @param[in] address sensor's I2C slave address + * @param[in] conv_rate number of averaged samples + * + * @return 0 on success + * @return -1 if conv_rate is wrong + * @return -2 if initialization of I2C bus failed + * @return -3 if sensor test failed + * @return -4 if sensor configuration failed + */ +int tmp006_init(tmp006_t *dev, i2c_t i2c, uint8_t address, uint8_t conv_rate); + +/** + * @brief Reset the TMP006 sensor. After that, the sensor should be reinitialized. + * + * @param[out] dev device descriptor of sensor + * + * @return 0 on success + * @return -1 on error + */ +int tmp006_reset(tmp006_t *dev); + +/** + * @brief Set active mode, this enables periodic measurements. + * + * @param[in] dev device descriptor of sensor + * + * @return 0 on success + * @return -1 on error + */ +int tmp006_set_active(tmp006_t *dev); + +/** + * @brief Set standby mode. + * + * @param[in] dev device descriptor of sensor + * + * @return 0 on success + * @return -1 on error + */ +int tmp006_set_standby(tmp006_t *dev); + +/** + * @brief Read sensor's data. + * + * @param[in] dev device descriptor of sensor + * @param[out] rawv object voltage value + * @param[out] rawt raw die temperature + * @param[out] drdy data ready, 0 if a conversion is in progress + * + * @return 0 on success + * @return -1 on error + */ +int tmp006_read(tmp006_t *dev, int16_t *rawv, int16_t *rawt, uint8_t *drdy); + +/** + * @brief Convert raw sensor values to temperature. + * + * @param[in] rawv object voltage value + * @param[in] rawt raw die temperature value + * @param[out] tamb converted ambient temperature + * @param[out] tobj converted object temperature + */ +void tmp006_convert(int16_t rawv, int16_t rawt, float *tamb, float *tobj); + +#ifdef __cplusplus +} +#endif + +#endif +/** @} */