2014-05-11 24 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; 

這些可能都是同樣有效。如果有差異,最後一個可能是最好的,因爲乘法運算髮生在編譯器中。我把它留給你自己測試。

相關問題