我有一个名为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偏移的来源是什么?数据表从未提及它。
答案 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
我也注意到:
答案 2 :(得分:0)
我的观点是,TEMP是10位,一个是符号(最大值可以读取:0x3FF),所以:
0x03FF - 0x0340 = 0x0BF
0x0BF / 8 = 0x17(十进制23.875)。
如上所述,不要忘记计算中的两个补码。