【问题标题】:How can I convert temperature data from an LM92 in Linux如何在 Linux 中转换来自 LM92 的温度数据
【发布时间】:2016-01-18 17:32:33
【问题描述】:

我正在尝试从 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

【问题讨论】:

  • 我在收集缓冲区数据的方式上发现了一个问题。我现在可以使用此代码。仍然不确定 Linux 如何设置符号位,所以我只是从原始数据中获取它,然后将结果乘以 1 或 -1。如果 (buf[0] & 0b00010000) 符号 = -1; buf[0] &= 0b1111;数据 = buf[0];数据 >= 3;数据 *= 0.0625;返回(int)数据*符号;

标签: c linux integer signed


【解决方案1】:

试试

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/13 位表示中, -1 等于 8191 等等。

参考http://www.kerrywong.com/2014/01/19/lm92-library-for-arduino/ 实施。

【讨论】:

  • 不确定你在这里做什么,但它对我不起作用。 LM92: 22C LM92: 22C LM92: 0C LM92: 505C LM92: 507C LM92: 493C LM92: 489C LM92: 491C
  • 对不起,表达式需要测试 4096。
  • "(505 / 0.0625 - 8192) * 0.0625" 是 -7 摄氏度,这对您的测试来说似乎是合理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多