2014-05-11 17 views
0

我从I2C总线获得16位有符号整数,并将它们存储在本地int16变量中。该传感器是一个MEMS陀螺仪,它经常会出现高或低的数据值,这似乎是许多MEMS陀螺仪的一个普遍问题。在atmel AVR 8bit gcc上获得两个16位有符号整数的绝对值差异的有效方法?

因此正常读数为-2到+2,并且时不时(取决于我的轮询速率),我得到非常大的值(如-30000或25000)。

我没有找到一种方法来解决这个问题,我想用软件解决这个问题。 我寻找一个有效的方式做这样的事情,而不去32位:

伪代码:

#define SPIKE 0x3000; // a change of SPIKE or larger is ignored 
int16_t currentvalue=-2330; // the current value (last sensor result) 
int16_t newvalue=-31000; // the new value from sensor, a spike 


difference = abs(abs(newvalue) - abs(lastvalue)); // would need some branches more 

if (difference < SPIKE) currentvalue = newvalue; // if SPIKE the new value is just not taken 

我无法找到一个很好的和有效的方式,以保持在16位的空间,并获得新老之间的绝对区别,如果没有树木的分支。
我相信有一个很好的有效方法来做到这一点,我只是没有经验足够的处理签名值。

我甚至不需要真正计算绝对差值,只要绝对差值大于SPIKE就足够了。

我想避免32位空间。

回答

1

您的算术似乎有缺陷。正如所写,你可以允许从10000跳到-10000。相反,你只想使用abs()一次。

difference = abs(newvalue - lastvalue); 

你也可以完全避免使用abs()。

difference = newvalue - lastvalue; 
if (difference < 0) difference *= -1; 

if (difference < SPIKE) currentvalue = newvalue; 

difference = newvalue - lastvalue; 

if (difference > -1*(SPIKE) && difference < SPIKE) currentvalue = newvalue; 

这些可能都是同样有效。如果有差异,最后一个可能是最好的,因为乘法运算发生在编译器中。我把它留给你自己测试。

相关问题