均值濾波也稱為線性濾波,其采用的主要方法為鄰域平均法。線性濾波的基本原理是用均值代替原圖像中的各個像素值,即對待處理的當前像素點(x,y),選擇一個模板,該模板由其近鄰的若干像素組成,求模板中所有像素的均值,再把該均值賦予當前像素點(x,y),作為處理后圖像在該點上的灰度g(x,y),即g(x,y)=∑f(x,y)/m,m為該模板中包含當前像素在內的像素總個數(shù)。
這本是數(shù)字圖像處理的一種方法,但也可以用在我們數(shù)字電壓電流表的ADC采樣數(shù)據(jù)上。我們選取二十次的ADC采樣值存儲在數(shù)組 Volt_Buffer 中,然后去除掉數(shù)組中的最大值和最小值后再取平均,得到的值作為結果顯示在數(shù)碼管上,這樣可以較大程度獲得準確的、不易波動的數(shù)據(jù)。
程序在實驗五的基礎上略作修改即可,首先是增加和修改變量:
#define ADC_SAMPLE_SIZE (20) //規(guī)定采樣20個數(shù)據(jù)用來濾波 uint16_t Volt_Buffer[ADC_SAMPLE_SIZE]; //存儲ADC轉換值 uint32_t Led_Dis_Time; //計數(shù),300ms改變一次數(shù)碼管顯示值
接下來是均值濾波的主體函數(shù):
uint32_t Mean_Value_Filter(uint16_t *value, uint32_t size) //均值濾波 { uint32_t sum = 0; //ADC采樣數(shù)據(jù)和 uint16_t max = 0; uint16_t min = 0xffff; //min初值取最大是為了將第一個數(shù)據(jù)記錄 int i; for(i = 0; i < size; i++) { sum += value[i]; if(value[i] > max) { max = value[i]; } if(value[i] < min) { min = value[i]; } } sum -= max + min; //去除最大最小值 sum = sum / (size - 2); return sum; }
對之前的電壓計算函數(shù) Volt_Cal() 修改如下:
void Volt_Cal(void) { Cal_Buffer = Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE); Cal_Buffer = (Cal_Buffer * ADC_REF_VALUE >> 12) * (R2 + R1)/R1; // 四舍五入 if(Cal_Buffer % 10 >= 5) { Cal_Buffer = Cal_Buffer / 10 + 1; } else { Cal_Buffer = Cal_Buffer / 10; } }
在主函數(shù)的 while 循環(huán)里每隔300ms刷新一次:
while(1) { if(GetTick() >= (Led_Dis_Time + 300)) { Led_Dis_Time = GetTick(); Volt_Cal(); Display(Cal_Buffer); } }
在之前未加濾波函數(shù)時,數(shù)碼管上顯示的電壓數(shù)據(jù)是不穩(wěn)定、跳變的,而加了濾波函數(shù)之后,數(shù)碼管顯示的電壓數(shù)據(jù)可以穩(wěn)定下來,并且有一定的抗干擾能力。至于電壓準確性的問題,在后續(xù)章節(jié)的數(shù)據(jù)標定和校準中說明。
審核編輯:劉清
-
數(shù)碼管
+關注
關注
32文章
1874瀏覽量
90941 -
均值濾波
+關注
關注
0文章
10瀏覽量
7097 -
ADC采樣
+關注
關注
0文章
134瀏覽量
12831 -
電壓電流表
+關注
關注
0文章
24瀏覽量
2073
原文標題:CW32數(shù)字電壓電流表軟件教程-實驗七:基本數(shù)據(jù)處理算法(均值濾波)
文章出處:【微信號:武漢芯源半導體,微信公眾號:武漢芯源半導體】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論