AD數據採集方案的心得分享

出處:http://www.amobbs.com/thread-5582897-1-1.html

最近處理14位ad採集並顯示的項目,在數據處理過程中的一點感悟給大家分享,給新手一點借鑑吧。
需求很簡答,採集3路ad值並在12864液晶上顯示即可。

1. 剛開始測試的時候,寫完ad的驅動get_ad(ch),就拿來顯示了,ok了。
2. 為了防止數據偶爾的波動,多採集N次,做個平均值吧
//求平均值
u16 get_average(u16* buf, u16 len)
{
u16 i;
u16 sum = 0;
for(i=0; i< len; i++)
{
sum += buf;
}
return (u16)(sum/len);
}這樣處理後,效果好點,但是還是有波動。
3. 在想想辦法把,每次採集20個數據,然後從小到大排序,丟棄最大的和最小的4個數據,然後對中間的12個數據求平均。
//排序
void rank_array(u16 *data, u8 len)
{
u8 i,j;
u16 temp;
for(i=0; i<len-1; i++)
{
for(j=i+1; j<len; j++)
{
if(*(data+i) > *(data+j))
{
temp = *(data+i);
*(data+i) = *(data+i);
*(data+j) = temp;
}
}
}
}
這樣處理完後,自己感覺還可以,裝上機器後調試,發現採集ad值還是有變化,而且變化很靈敏,老闆說這樣變化太快,客戶會覺得我們這個機器不穩定的…
4. 這怎麼搞,沒辦法做一個平滑處理吧,給每路ad分配一個buf[N]空間,保存最近採集的N次數據,每次保存的ad值保存到buf[SP]中,SP在0~N-1之間變化,輸出的有效值為buf中所有數據的平均值。N值取得越大,平滑的效果越明顯,
u16 filter(u16 data)
{
static u16 data_buf[N] = {0}; //保存N次採集的ad值
static u8 data_sp = 0; //需要替換數據的下標
static u8 data_len = 1; //記錄當前數數的長度

u32 sum = 0;//求和
u16 avr;//求平均
u8 i;

data_buf[data_sp] = data;//替換舊的值

for(i=0; i<data_len; i++)
{
sum += data_buf;
}
avr = (u16)(sum/data_len);//遞推平均值

return avr;
}
這樣處理後,效果很明顯了,比較平滑了,可是老闆測試的時候又說啦,這個效果還可以,但是啟動和關閉的時候,變化太慢了,這個效果可以不行啊。。。
4. 做了平滑處理,能不慢嗎?不過老闆的需要總是有道理的,就在想啊,怎麼樣解決這個問題了。。。啊,有了,變化慢的時候平滑處理就行了,單變化快,急促的時候,就讓輸出及時更新就行了!怎麼處理了?
給每個ad設置一個變化差值,ADdet,當變化超過了這個ADdet值的時候,就把buf[N]中的數據給清空了,只保存這次採集到的AD值到buf中,重新開始做平滑處理。
//輸出兩個數據的差值
u16 absolute(u16 a, u16 b)
{
if(a > b) return a-b;
else return b-a;
}
//數據平滑處理
u16 filter(u16 data)
{
static u16 data_buf[N] = {0}; //保存N次採集的ad值
static u8 data_sp = 0; //需要替換數據的下標
static u8 data_len = 1; //記錄當前數數的長度
static u16 old_avr = 0;//保存上次的平均值

u32 sum = 0;//求和
u16 avr;//求平均
u8 i;

if( absolute(old_avr, data) > ADdet)//這個數據是個異常
{
data_len = 1;
data_sp = 0;
}

data_buf[data_sp] = data;//替換舊的值

for(i=0; i<data_len; i++)
{
sum += data_buf;
}
avr = (u16)(sum/data_len);//遞推平均值
old_avr = avr;

return avr;
}
修改後測試效果還是不錯的,終於可以歇歇了。。。。
但是後來又有其他的數據需要處理了,老闆說,這個突變,你還不能馬上更新,數據上 有個情況會導致數據突然變為0,而且是沒規律的,這個突變還不能馬上顯示。。。。

接著改問題吧。。。不過這個問題是工程中的特殊情況,解決方案就不寫出來了。。。
在改方案的過程中參考了網上的一些數據濾波的方法
http://blog.csdn.net/haozi_1989/article/details/6625404

未經允許不得轉載:GoMCU » AD數據採集方案的心得分享