采樣信號(hào)濾波
什么是濾波
濾波(Wave filtering)是將信號(hào)中特定波段頻率濾除的操作,是抑制和防止干擾的一項(xiàng)重要措施。
它可以從含有干擾的接收信號(hào)中提取有用信號(hào),很大程度上保證了采集到的信號(hào)的真實(shí)性和穩(wěn)定性。
正因如此,濾波算法也成了在智能車控制中不可或缺的一種控制算法。
常見(jiàn)的軟件濾波辦法
軟件濾波在嵌入式的數(shù)據(jù)采集和處理中有著很重要的作用。
對(duì)于電磁車來(lái)說(shuō),我們需要對(duì)采集到的賽道電磁信號(hào)進(jìn)行濾波處理,這里我們介紹幾種常見(jiàn)的軟件濾波處理辦法。
限幅法
一般來(lái)說(shuō),每個(gè)電感在賽道上采集到的值都有一個(gè)固定的范圍。
由于電感排布方案的不同(水平電感、豎直電感或斜電感等)或不同賽道電磁信號(hào)的差別,這個(gè)范圍也會(huì)隨之變化。
這時(shí)我們可以在程序的初始化中加入一個(gè)掃描賽道的程序,在初始化程序運(yùn)行時(shí)令車左右掃描。
將每個(gè)電感的最大值和最小值分別記錄入兩個(gè)一維數(shù)組中,讓其作為每個(gè)電感采集信號(hào)值的上下限(這樣也是為了提高賽車對(duì)于不同賽道的適應(yīng)性)。
在后續(xù)賽車行駛過(guò)程中,便可以過(guò)濾在這個(gè)范圍之外的電感值,從而排除偶然誤差,達(dá)到軟件濾波的效果。
具體代碼如下(此處只寫(xiě)一個(gè)其中電感的處理):
// 掃描賽道 //
void saomiao()
{
uint32 i;
uint16 max1=0,min1=4095;
for(i=0;i< 1000;i++)
{
LeftADC[0]=ADC_Ave(ADC0,ADC1_SE8,ADC_12bit,10);
if(LeftADC[0] >max1)
max1=LeftADC[0];
if(LeftADC[0]< min1)
min1=LeftADC[0];
}
}
// 限幅法濾波 //
void AD_value()
{
LeftADC[0]=ADC_Ave(ADC0,ADC1_SE8,ADC_12bit,10);
if(LeftADC[0] >max1)
LeftADC[0]=max1;
if(LeftADC[0]< min1)
LeftADC[0]=min1;
}
算術(shù)平均值濾波
算術(shù)平均值濾波,指的是將每個(gè)電感采集到的一組值用冒泡排序按從大到小或者從小到大的順序排布,再丟棄最大值與最小值。
取剩下數(shù)據(jù)的算術(shù)平均數(shù),作為反饋給單片機(jī)的實(shí)時(shí)數(shù)據(jù)。這也是最常見(jiàn)的軟件濾波算法之一。
具體代碼如下:
void Ad_Value()
{
uint16 LeftADC[7];
int i,j,t;
for(i=0;i< 7;i++)
{
LeftADC[i]= ADC_Ave(ADC0,ADC1_SE8 ,ADC_12bit,10);
}
for(i=0;i< 6;i++)
{
for(j=0;j< 6-i;j++)
{
if(LeftADC[j] >LeftADC[j+1])
{
t=LeftADC[j+1];
LeftADC[j+1]=LeftADC[j];
LeftADC[j]=t;
}
}
}
LeftAverage[0]=(uint16)((LeftADC[1]+LeftADC[2]+LeftADC[3]+LeftADC[4]+LeftADC[5])/5.0);
}
-
嵌入式
+關(guān)注
關(guān)注
5085文章
19138瀏覽量
305726 -
濾波
+關(guān)注
關(guān)注
10文章
667瀏覽量
56668 -
控制算法
+關(guān)注
關(guān)注
4文章
166瀏覽量
21735
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論