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