C 来自加速计的数据

C 来自加速计的数据,c,accelerometer,C,Accelerometer,我使用的是BMA220及其8位传感器。在数据表中,输入数据为2的补码形式。所以我在我的应用程序中检查了符号位。如果它是1,那么它是一个负数据,我需要转换为-->data^ff+1。 数据表中还规定,2g模式下传感器的灵敏度为16LSB/mg 所以当我在做了数据^ff+1之后得到数据时,我应该把它乘以1/16吗 我检查了一下这个标志 if ((data & 0x80)? 1:0) 和反实现 data^0xff+1 我要注意的第一件事是,if语

我使用的是BMA220及其8位传感器。在数据表中,输入数据为2的补码形式。所以我在我的应用程序中检查了符号位。如果它是1,那么它是一个负数据,我需要转换为-->data^ff+1。 数据表中还规定,2g模式下传感器的灵敏度为16LSB/mg 所以当我在做了数据^ff+1之后得到数据时,我应该把它乘以1/16吗

我检查了一下这个标志

          if ((data & 0x80)? 1:0)
和反实现

            data^0xff+1

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

if ((data & 0x80)? 1:0)
等价于没有三元运算符的同一语句

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

#define SIGN_BIT (0x80)
/* some code */
if (data & SIGN_BIT)
而且,为了可读性和避免优先级陷阱,我建议在你们两人的补语中使用括号

(data^0xff) + 1
如果
数据
的类型大于8位,也许您应该检查溢出

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

但是,如果您需要加速计数据纯粹是为了与其他加速计数据进行比较,例如,如果您要为某个应该平衡的对象开发PID控制器,则无需对值进行规范化

这完全取决于你的申请


更新:有关加速计的更多信息可在此处找到:

如果给我16LSB/mg,何时倍增。。那么无论我得到什么样的数据,应该1)使它成为一个正常的有符号值(当252变成-4),2)然后乘以1/16或16。,结果会是mg吗?