Drivber for Ti's TMP007 Infrared Thermopile Sensor with Integrated Math Engine

Revision:
0:a1ed9ce625d4
Child:
1:93710a3abf0a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/TMP007.cpp	Sun Jun 05 19:38:48 2016 +0000
@@ -0,0 +1,165 @@
+#include <math.h>
+#include "TMP007.h"
+ 
+TMP007::TMP007(PinName sda, PinName scl, int addr) 
+    :_i2cPort(sda, scl), 
+    _addr(addr<<1) 
+{}
+
+//--------------------------------------------------------------------------------
+bool TMP007::writeWord(const uint8_t reg, const uint16_t word)
+{
+    const char cmd[] = { reg,  word & 0xff, (word&0xff00)>>8 };
+    
+    if( 0 == _i2cPort.write(_addr, cmd, 3 ))
+        return true;
+    else
+        return false;    
+}
+
+//--------------------------------------------------------------------------------
+uint16_t TMP007::readWord(const uint8_t reg)
+{
+    uint16_t res = 0;
+    char data[]  = {0, 0};
+    const char cmd = reg;
+    
+    _i2cPort.write(_addr, &cmd, 1);
+    _i2cPort.read(_addr, data, 2);  
+    res = data[1]<<8 & data[0];
+    
+    return res;
+}
+
+//--------------------------------------------------------------------------------
+void TMP007::writeConfig(const uint16_t value)
+{
+    writeWord(TMP007_CONFIG, value);   
+}
+
+//--------------------------------------------------------------------------------
+ uint16_t TMP007::readConfig()
+{   
+     uint16_t res = readWord(TMP007_CONFIG);
+    return res;   
+}
+
+//--------------------------------------------------------------------------------
+uint16_t TMP007::readStatus()
+{
+    return readWord(TMP007_STATUS);
+}
+
+//-------------------------------------------------------------------------------- 
+/** TMP007 Config method.
+ *  Used for configuring the sensor with desired samples.
+ */
+void TMP007::setSamples(uint16_t samples)
+{
+    char    data[2];
+ 
+    data[0]   = TMP007_CONFIG;
+    data[1]   = samples | TMP007_CFG_MODEON | TMP007_CFG_ALRTEN;
+ 
+    _i2cPort.write( _addr, data, 1 ); 
+}
+ 
+//--------------------------------------------------------------------------------
+/** TMP007 Read Raw Temperature method.
+ *  Used for getting the raw data off the chip.
+ */
+uint16_t TMP007::readRawLocalTemperature()
+{
+  int16_t raw = 0;
+  char reg = TMP007_LOCAL_TEMP;
+  char data[2];
+  
+  _i2cPort.write(_addr, &reg, 1);
+  _i2cPort.read(_addr,  data, 2);
+   
+  raw = (data[0] << 8) | data[1] ;
+ 
+  raw >>= 2;
+  return raw;
+}
+ 
+//--------------------------------------------------------------------------------
+/** TMP007 Read Raw Voltage method.
+ *  Used for reading the raw voltage from the thermopile.
+ */
+uint16_t TMP007::readRawSensorVoltage() 
+{  
+  char reg=TMP007_SENSOR_VOLT;
+  char data[2];
+  
+  _i2cPort.write(_addr, &reg, 1);
+  _i2cPort.read(_addr, data, 2);
+   
+  int16_t raw = (data[0] << 8) | data[1] ;
+  
+  return raw;
+}
+ 
+//--------------------------------------------------------------------------------
+/** TMP007 Read Object Temperature(C) method.
+ *  Used for calculating the object temperature in celcius.
+ */
+double TMP007::readObjTempC() 
+{
+  double Tdie = readRawLocalTemperature();
+  double Vobj = readRawSensorVoltage();
+  Vobj *= 156.25;     // 156.25 nV per LSB
+  Vobj /= 1000000000; // nV -> V
+  Tdie *= 0.03125;    // convert to celsius
+  Tdie += 273.15;     // convert to kelvin
+ 
+  // Equations for calculating temperature found in section 7.3.4 in the user guide
+  double tdie_tref = Tdie - TMP007_TREF;
+  double S = (1 + TMP007_A1*tdie_tref + 
+      TMP007_A2*tdie_tref*tdie_tref);
+  S *= TMP007_S0;
+  S /= 10000000;
+  S /= 10000000;
+ 
+  double Vos = TMP007_B0 + TMP007_B1*tdie_tref + TMP007_B2*tdie_tref*tdie_tref;
+ 
+  double fVobj = (Vobj - Vos) + TMP007_C2*(Vobj-Vos)*(Vobj-Vos);
+ 
+  double Tobj = sqrt(sqrt(Tdie * Tdie * Tdie * Tdie + fVobj/S));
+ 
+  Tobj -= 273.15; // Kelvin -> *C
+  return Tobj;
+}
+
+//--------------------------------------------------------------------------------
+/** TMP007 Read Object Temperature(F) method.
+ *  Used for calculating the object temperature in fahrenheit.
+ */
+double TMP007::readObjTempF() 
+{
+  double Tobj = readObjTempC();
+  Tobj = Tobj * 9.0/5.0 + 32.0; // convert to fahrenheit
+  return Tobj;
+}
+
+//--------------------------------------------------------------------------------
+/** TMP007 Read Die Temperature(C) method.
+ *  Used for calculating the die temperature in celcius.
+ */
+double TMP007::readDieTempC() 
+{
+  double Tdie = readRawLocalTemperature();
+  Tdie *= 0.03125; // convert to celsius
+  return Tdie;
+}
+
+//--------------------------------------------------------------------------------
+/** TMP007 Read Die Temperature(F) method.
+ *  Used for calculating the die temperature in fahrenheit.
+ */
+double TMP007::readDieTempF() 
+{
+  double Tdie = readDieTempC();
+  Tdie = Tdie * 9.0/5.0 + 32.0; // convert to fahrenheit
+  return Tdie;
+}
\ No newline at end of file