我从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位空间。