将温度数据从传感器转换为摄氏度

时间:2017-03-25 15:12:41

标签: arduino sensor stm32 temperature

我有一个名为LSM303DLHC的传感器,它有2个临时寄存器,但我无法弄清楚如何将其转换为摄氏度。 2 Reg是:

    TEMP_OUT_H_M register  // high reg
     

TEMP11 | TEMP10 | TEMP9 | TEMP8 | TEMP7 | TEMP6 | TEMP5 | TEMP4

     TEMP_OUT_L_M register  //low reg
     

TEMP3 | TEMP2 | TEMP1 | TEMP0 | 0 | 0 | 0 | 0

在数据表中说:“TEMP [11:0]温度数据(8 LSB / deg - 12位分辨率)” 我目前的代码是

uint8_t hig_reg = read(TEMP_OUT_H_M)  // value = 0x03
uint8_t low_reg = read(TEMP_OUT_L_M)  // value = 0x40
int16_t temp = ((uint16_t)hig_reg  << 8) | (uint16_t)low_reg;  // temp = 0x0340 = 832

float mTemp = temp/256;  // = 3.25 
mTemp = mTemp +20  ;      // =23.25 (°C)  i add 20 more

但我不明白20°C偏移的来源是什么?数据表从未提及它。

3 个答案:

答案 0 :(得分:2)

感谢您的回答。转出温度传感器确定比较温度来计算变化。它不用于绝对温度。他们应该在数据表中添加该信息。我为此浪费了2天的生命。

答案 1 :(得分:1)

我的尝试... 首先,我注意到您正在使用整个 8 位 TEMP_OUT_L_M 寄存器,正如您所描述的那样只是它的前 4 位。 然后尝试先制作12位寄存器。我使用 python ans SMBus 库,

temph = i2cbus.read_byte_data(i2caddress, TEMP_OUT_H_M) << 4 
templ = i2cbus.read_byte_data(i2caddress, TEMP_OUT_L_M) >> 4
tempread = temph + templ   # it is all ready converted to Decimal

然后您可以继续进行转换:参见第 11 页标题 2.2“温度传感器特性:8 LSB/ºC、12 位分辨率和 2.5 Vdd。”

那么很明显:

ºC = (read_value * VDD * 10^(log 2 (LSB/ºC)) / ((resolution - 1) * (10*(ºC/LSB))

在 LSM303 中,然后遵循 python 代码:

# temperature = (tempread * 2.5 * 1000)/(2^12-1) * (10/8))  better to write:
temperature = (tempread *2500)/(4095 * 1.25)

在您的情况下:您已阅读:0x0340,12 位 0x34 十进制:54

temperature = (54 * 2500) / (4095 * 1.25) = 23.443223

我也注意到:

  • 要读取的最大安全寄存器为 85ºC = 0x55,因此我们最好使用 TEMP_OUT_H_M 的 4 位 LSB 和 TEMP_OUT_L_M 的 4 位 MSB 来制作寄存器。
  • 在进一步测试中,LSM303 可以在接近 125 ºC 的温度下抵抗一段时间,而不会造成永久性损坏,但使用此温度将磁力计和加速度计置于睡眠模式是一个很好的做法。当温度达到 80 度时。

答案 2 :(得分:0)

我的观点是,TEMP是10位,一个是符号(最大值可以读取:0x3FF),所以:

  

0x03FF - 0x0340 = 0x0BF

     

0x0BF / 8 = 0x17(十进制23.875)。

如上所述,不要忘记计算中的两个补码。