我正在尝试从LM92读取温度数据。一切都很好,直到温度低于0,然后我得到不好的结果。我知道问题在于将带有符号位的12位整数转换为Linux int值,但是我无法找到有关这样做的信息。我有一些适用于Arduino和Microchip的示例,但不适用于Linux GCC。
以下示例适用于Linux以外的任何其他内容:
// LM92 Read
int i2c_lm92Read() {
unsigned int data;
data = (unsigned int) i2c_read(0x4B);
data <<= 8;
data |= (unsigned int) i2c_read(0x4B);
data /= 8;
return (int) (data * 0.0625);
}
当我用冷冻喷雾击中LM92时我得到的结果:
LM92: 18C
LM92: 16C
LM92: 16C
LM92: 507C
LM92: 477C
LM92: 475C
答案 0 :(得分:2)
尝试
data = (unsigned int) i2c_read(0x4B);
data <<= 8;
data |= (unsigned int) i2c_read(0x4B);
data >>= 3;
if (data >= 4096)
data -= 8192;
return ( (double) data) * 0.0625;
常数8192是2 ^ 13。在使用的12 / 13bit表示中, -1等于8191等。
请参阅http://www.kerrywong.com/2014/01/19/lm92-library-for-arduino/以获取参考 实施