来自加速度计的数据

时间:2014-02-26 04:49:16

标签: c accelerometer

我正在使用BMA 220及其8位传感器。在数据表中,给出了输入数据是2的补码形式。所以我在我的应用程序中做的是我检查了符号位。如果它是1那么它是负数据,我需要进行转换为--->数据^ FF + 1。 同样在数据表中给出了2g模式下传感器的灵敏度为16LSB / mg 所以当我在做数据^ ff + 1之后得到数据时,我应该将它乘以1/16?

我将符号位检查为

          if ((data & 0x80)? 1:0)

和decomplementation

            data^0xff+1

1 个答案:

答案 0 :(得分:1)

我要注意的第一件事是if语句中的逻辑是多余的。

if ((data & 0x80)? 1:0)

等同于没有三元运算符的相同语句。

if (data & 0x80)

此外,我建议在代码中避免使用“幻数”0x80,而是使用命名常量,例如像这样的宏:

#define SIGN_BIT (0x80)
/* some code */
if (data & SIGN_BIT)

而且,为了便于阅读和避免优先陷阱,我建议在你的二元补语中使用括号

(data^0xff) + 1

如果data的类型大于8位,也许你应检查溢出。

((data ^ 0xff) + 1) & 0xff

现在,关于你的实际问题,我认为这取决于你想要对数据做什么。如果您需要用于计算其他物理数据的实际值,那么我建议按照数据表的建议对值进行标准化,但是我想我会乘以(1.0/16)或除以(16.0),因为这将隐式地转换您的值为浮点类型,并且如果使用纯整数除法,则避免丢失不可避免的信息。

但是,如果您需要将加速度计数据纯粹用于与其他加速度计数据进行比较,例如,如果要为应该平衡的事物开发PID控制器,则无需对值进行标准化。

这一切都取决于你的申请。

更新:有关加速度计的更多信息,请访问:http://bildr.org/2011/04/sensing-orientation-with-the-adxl335-arduino/

相关问题