Driver for TI TMP007 thermopile. Reads object temperature, internal temperature, and sensor voltage.

Dependencies:   UglyBottlev1

Committer:
tomo21
Date:
Wed Oct 29 18:41:04 2014 +0000
Revision:
1:b11c53492ce5
Parent:
0:86a2044abd50
TMP007 Driver;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tomo21 0:86a2044abd50 1 #include "mbed.h"
tomo21 0:86a2044abd50 2
tomo21 0:86a2044abd50 3 #define TMP007_Voltage 0x00
tomo21 0:86a2044abd50 4 #define TMP007_LocalTemp 0x01
tomo21 0:86a2044abd50 5 #define TMP007_Conf 0x02
tomo21 0:86a2044abd50 6 #define TMP007_ObjTemp 0x03
tomo21 0:86a2044abd50 7
tomo21 0:86a2044abd50 8 #define TMP007_ADDR 0x80
tomo21 0:86a2044abd50 9
tomo21 0:86a2044abd50 10 I2C i2c(PA_10, PA_9);
tomo21 0:86a2044abd50 11
tomo21 0:86a2044abd50 12 //DigitalOut myled(LED1);
tomo21 0:86a2044abd50 13
tomo21 0:86a2044abd50 14 Serial pc(PA_2, PA_3);
tomo21 0:86a2044abd50 15
tomo21 0:86a2044abd50 16 int16_t temp_c, temp_c_2s, voltage_tot, voltage_h, voltage_2s, voltage_tot_a;
tomo21 0:86a2044abd50 17 float celsius, farenheit, voltage;
tomo21 0:86a2044abd50 18 char temp_write[3];
tomo21 0:86a2044abd50 19 char temp_read[2];
tomo21 0:86a2044abd50 20 uint8_t temp_h, temp_l, temp_h_and, voltage_l, voltage_h_and;
tomo21 0:86a2044abd50 21 int sign;
tomo21 0:86a2044abd50 22
tomo21 0:86a2044abd50 23 //char TMP007_ObjTemp = 0x03;
tomo21 0:86a2044abd50 24
tomo21 0:86a2044abd50 25
tomo21 0:86a2044abd50 26 int main()
tomo21 0:86a2044abd50 27 {
tomo21 0:86a2044abd50 28
tomo21 0:86a2044abd50 29
tomo21 0:86a2044abd50 30
tomo21 0:86a2044abd50 31 /* Configure the Temp Sensor:
tomo21 0:86a2044abd50 32
tomo21 0:86a2044abd50 33 */
tomo21 0:86a2044abd50 34 temp_write[0] = TMP007_Conf;
tomo21 0:86a2044abd50 35 temp_write[2] = 0x40; //Mode On, Alert, TC, 16 samples
tomo21 1:b11c53492ce5 36 temp_write[1] = 0x19; //check order of these (endianness)
tomo21 0:86a2044abd50 37 i2c.write(TMP007_ADDR, temp_write, 3, 0);
tomo21 0:86a2044abd50 38
tomo21 0:86a2044abd50 39 while (1) {
tomo21 0:86a2044abd50 40 // Read Temp Sensor
tomo21 0:86a2044abd50 41
tomo21 0:86a2044abd50 42 //Tell the temp sensor to take a one shot temperature measurement
tomo21 0:86a2044abd50 43 //temp_write[0] = LM75B_Conf;
tomo21 0:86a2044abd50 44 //temp_write[1] = 0x50; //One shot, low power mode
tomo21 0:86a2044abd50 45 //i2c.write(LM75B_ADDR, temp_write, 2, 0);
tomo21 0:86a2044abd50 46
tomo21 0:86a2044abd50 47 //Read Temperature Register
tomo21 0:86a2044abd50 48 temp_write[0] = TMP007_ObjTemp;
tomo21 0:86a2044abd50 49 i2c.write(TMP007_ADDR, temp_write, 1, false); // no stop (unsure)
tomo21 0:86a2044abd50 50 i2c.read(TMP007_ADDR, temp_read, 2, 0);
tomo21 0:86a2044abd50 51
tomo21 0:86a2044abd50 52 temp_h = temp_read[0];
tomo21 0:86a2044abd50 53 temp_l = temp_read[1];
tomo21 0:86a2044abd50 54
tomo21 0:86a2044abd50 55 pc.printf("Object Temperature\n");
tomo21 0:86a2044abd50 56 pc.printf("high bit = %x\n", temp_h);
tomo21 0:86a2044abd50 57 pc.printf("low bit = %x\n", temp_l);
tomo21 0:86a2044abd50 58
tomo21 0:86a2044abd50 59 temp_c = ((temp_h) << 8) | temp_l;
tomo21 0:86a2044abd50 60
tomo21 0:86a2044abd50 61 //int tempval = (int)((int)data_read[0] << 8) | data_read[1];
tomo21 0:86a2044abd50 62 pc.printf("combined bit = %x\n", temp_c);
tomo21 0:86a2044abd50 63 temp_h_and = temp_h & 0x80;
tomo21 0:86a2044abd50 64 //check for negative number
tomo21 0:86a2044abd50 65 if (temp_h_and == 0x80)
tomo21 0:86a2044abd50 66 {
tomo21 0:86a2044abd50 67
tomo21 0:86a2044abd50 68 //flip bits and add 1
tomo21 0:86a2044abd50 69 temp_c_2s = temp_c ^ 0x7FFF + 0x04;
tomo21 0:86a2044abd50 70 //temp_c_shift = ((temp_c_2s)>>2);
tomo21 0:86a2044abd50 71 celsius = ((float)temp_c_2s * -0.25f) *.03125f;
tomo21 0:86a2044abd50 72 pc.printf("negative\n");
tomo21 0:86a2044abd50 73 pc.printf("anded high bit = %x\n", temp_h_and);
tomo21 0:86a2044abd50 74 }
tomo21 0:86a2044abd50 75 else
tomo21 0:86a2044abd50 76 {
tomo21 0:86a2044abd50 77 //temp_c_shift = ((temp_c)>>2);
tomo21 0:86a2044abd50 78 //pc.printf("shifted bits: %x\n", temp_c_shift);
tomo21 0:86a2044abd50 79 celsius = ((float)temp_c * 0.25f) *.03125f;
tomo21 0:86a2044abd50 80 pc.printf("positive\n");
tomo21 0:86a2044abd50 81 }
tomo21 0:86a2044abd50 82 pc.printf("Capsule Temperature is: %f C\n", celsius);
tomo21 0:86a2044abd50 83 farenheit = 1.8*celsius + 32;
tomo21 0:86a2044abd50 84 pc.printf("Capsule Temperature is: %f F\n\n", farenheit);
tomo21 0:86a2044abd50 85
tomo21 0:86a2044abd50 86 //Read Internal Temperature Register
tomo21 0:86a2044abd50 87 temp_write[0] = TMP007_LocalTemp;
tomo21 0:86a2044abd50 88 i2c.write(TMP007_ADDR, temp_write, 1, false); // no stop (unsure)
tomo21 0:86a2044abd50 89 i2c.read(TMP007_ADDR, temp_read, 2, 0);
tomo21 0:86a2044abd50 90
tomo21 0:86a2044abd50 91 temp_h = temp_read[0];
tomo21 0:86a2044abd50 92 temp_l = temp_read[1];
tomo21 0:86a2044abd50 93
tomo21 0:86a2044abd50 94 pc.printf("Internal Temperature\n");
tomo21 0:86a2044abd50 95 pc.printf("high bit = %x\n", temp_h);
tomo21 0:86a2044abd50 96 pc.printf("low bit = %x\n", temp_l);
tomo21 0:86a2044abd50 97
tomo21 0:86a2044abd50 98 temp_c = ((temp_h) << 8) | temp_l;
tomo21 0:86a2044abd50 99
tomo21 0:86a2044abd50 100 //int tempval = (int)((int)data_read[0] << 8) | data_read[1];
tomo21 0:86a2044abd50 101 pc.printf("combined bit = %x\n", temp_c);
tomo21 0:86a2044abd50 102 temp_h_and = temp_h & 0x80;
tomo21 0:86a2044abd50 103 //check for negative number
tomo21 0:86a2044abd50 104 if (temp_h_and == 0x80)
tomo21 0:86a2044abd50 105 {
tomo21 0:86a2044abd50 106
tomo21 0:86a2044abd50 107 //flip bits and add 1
tomo21 0:86a2044abd50 108 temp_c_2s = temp_c ^ 0x7FFF + 0x04;
tomo21 0:86a2044abd50 109 //temp_c_shift = ((temp_c_2s)>>2);
tomo21 0:86a2044abd50 110 //scale
tomo21 0:86a2044abd50 111 celsius = ((float)temp_c_2s * -0.25f) *.03125f;
tomo21 0:86a2044abd50 112 pc.printf("negative\n");
tomo21 0:86a2044abd50 113 //pc.printf("anded high bit = %x\n", temp_h_and);
tomo21 0:86a2044abd50 114 }
tomo21 0:86a2044abd50 115 else
tomo21 0:86a2044abd50 116 {
tomo21 0:86a2044abd50 117 //temp_c_shift = ((temp_c)>>2);
tomo21 0:86a2044abd50 118 //pc.printf("shifted bits: %x\n", temp_c_shift);
tomo21 0:86a2044abd50 119 //scale
tomo21 0:86a2044abd50 120 celsius = ((float)temp_c * 0.25f) *.03125f;
tomo21 0:86a2044abd50 121 pc.printf("positive\n");
tomo21 0:86a2044abd50 122 }
tomo21 0:86a2044abd50 123 pc.printf("Internal Temperature is: %f C\n", celsius);
tomo21 0:86a2044abd50 124 farenheit = 1.8*celsius + 32;
tomo21 0:86a2044abd50 125 pc.printf("Internal Temperature is: %f F\n\n", farenheit);
tomo21 0:86a2044abd50 126
tomo21 0:86a2044abd50 127 //Read Voltage Register
tomo21 0:86a2044abd50 128 temp_write[0] = TMP007_Voltage;
tomo21 0:86a2044abd50 129 i2c.write(TMP007_ADDR, temp_write, 1, false); // no stop (unsure)
tomo21 0:86a2044abd50 130 i2c.read(TMP007_ADDR, temp_read, 2, 0);
tomo21 0:86a2044abd50 131
tomo21 0:86a2044abd50 132 voltage_h = temp_read[0];
tomo21 0:86a2044abd50 133 voltage_l = temp_read[1];
tomo21 0:86a2044abd50 134
tomo21 0:86a2044abd50 135 pc.printf("Sensor Voltage\n");
tomo21 0:86a2044abd50 136 pc.printf("high bit = %x\n", voltage_h);
tomo21 0:86a2044abd50 137 pc.printf("low bit = %x\n", voltage_l);
tomo21 0:86a2044abd50 138
tomo21 0:86a2044abd50 139 voltage_tot = ((voltage_h) << 8) | voltage_l;
tomo21 0:86a2044abd50 140 voltage_tot_a = voltage_tot & 0x0000FFFF;
tomo21 0:86a2044abd50 141
tomo21 0:86a2044abd50 142 //int tempval = (int)((int)data_read[0] << 8) | data_read[1];
tomo21 0:86a2044abd50 143 pc.printf("combined bit = %x\n", voltage_tot_a);
tomo21 0:86a2044abd50 144 voltage_h_and = voltage_h & 0x80;
tomo21 0:86a2044abd50 145 //check for negative number
tomo21 0:86a2044abd50 146 if (voltage_h_and == 0x80)
tomo21 0:86a2044abd50 147 {
tomo21 0:86a2044abd50 148
tomo21 0:86a2044abd50 149 //flip bits and add 1
tomo21 0:86a2044abd50 150 //voltage_2s = voltage_tot ^ 0x7FFF + 0x01;
tomo21 0:86a2044abd50 151 voltage_2s = ~voltage_tot_a + 0x01;
tomo21 0:86a2044abd50 152 pc.printf("2's compliment conversion: %x\n", voltage_2s);
tomo21 0:86a2044abd50 153 //temp_c_shift = ((temp_c_2s)>>2);
tomo21 0:86a2044abd50 154 voltage = ((float)voltage_2s * -1.0f) *.00015625f;
tomo21 0:86a2044abd50 155 pc.printf("negative\n");
tomo21 0:86a2044abd50 156 //pc.printf("anded high bit = %x\n", temp_h_and);
tomo21 0:86a2044abd50 157 }
tomo21 0:86a2044abd50 158 else
tomo21 0:86a2044abd50 159 {
tomo21 0:86a2044abd50 160 //temp_c_shift = ((temp_c)>>2);
tomo21 0:86a2044abd50 161 //pc.printf("shifted bits: %x\n", temp_c_shift);
tomo21 0:86a2044abd50 162 voltage = ((float)voltage_tot_a * 1.0f) *.00015625f;
tomo21 0:86a2044abd50 163 pc.printf("positive\n");
tomo21 0:86a2044abd50 164 }
tomo21 0:86a2044abd50 165 pc.printf("Sensor Voltage is: %f mV\n\n\n", voltage);
tomo21 0:86a2044abd50 166
tomo21 0:86a2044abd50 167
tomo21 0:86a2044abd50 168
tomo21 0:86a2044abd50 169
tomo21 0:86a2044abd50 170 wait(4);
tomo21 0:86a2044abd50 171 }
tomo21 0:86a2044abd50 172 }