正題
今天把我平時(shí)經(jīng)常用到的一個(gè)AD均值濾波函數(shù),重新封裝了一下,作為一個(gè)模塊分享出來。
說白了就是通過AD采集得到一組數(shù)據(jù),然后去掉這組數(shù)中的最大值和最小值,剩下的數(shù)據(jù)求和,再求平均,原理就是這么簡單。在單片機(jī)包含數(shù)據(jù)采集需求的開發(fā)項(xiàng)目中,往往最簡單的也是最直接最有效的。
這里需要注意的是:數(shù)據(jù)濾波所采集的數(shù)據(jù)量問題。如果數(shù)據(jù)量過大,則濾波后的數(shù)據(jù)會(huì)產(chǎn)生一定程度的失真,并且實(shí)時(shí)性也會(huì)有所下降。對(duì)于實(shí)時(shí)性要求比較高的應(yīng)用中,應(yīng)根據(jù)實(shí)際調(diào)試效果決定參與濾波的數(shù)據(jù)量。濾波效果達(dá)不到預(yù)期,一方面考慮AD模塊的配置問題,硬件電路設(shè)計(jì)問題,然后還有就是根據(jù)所采集的數(shù)據(jù)特性考慮其他濾波算法。
如下代碼,為該函數(shù):
void dataAveFilterFunction(ST_Ave_Filter *pST_Ave_Filter,uint16_t Channel,uint16_t (*pfun)(uint8_t))
{
pST_Ave_Filter->Samp = pfun(Channel);
pST_Ave_Filter->Count++;
if(pST_Ave_Filter->Count == 1)
{
pST_Ave_Filter->Max = pST_Ave_Filter->Samp;
pST_Ave_Filter->Min = pST_Ave_Filter->Samp;
}
if( pST_Ave_Filter->Samp > pST_Ave_Filter->Max)
{
pST_Ave_Filter->Max = pST_Ave_Filter->Samp;
}
if(pST_Ave_Filter->Samp < pST_Ave_Filter->Min)
{
pST_Ave_Filter->Min = pST_Ave_Filter->Samp;
}
pST_Ave_Filter->Sum = pST_Ave_Filter->Sum + pST_Ave_Filter->Samp;
if(pST_Ave_Filter->Count == (pST_Ave_Filter->Time + 2))
{
pST_Ave_Filter->Ave = (pST_Ave_Filter->Sum -pST_Ave_Filter->Max-pST_Ave_Filter->Min)/( pST_Ave_Filter->Time);
pST_Ave_Filter->Sum = 0;
pST_Ave_Filter->Count = 0;
}
}
該函數(shù)用到的
typedef struct
{
uint8_t Count; //計(jì)數(shù)累加變量
uint8_t Time; //設(shè)定數(shù)據(jù)個(gè)數(shù)
uint16_t Max; //一定數(shù)量的取值中,挑選出的最大值
uint16_t Min; //一定數(shù)量的取值中,挑選出的最小值
uint16_t Sum; //求和
uint16_t Ave; //求平均
uint16_t Samp; //采樣變量
}ST_Ave_Filter;
以上就是今天分享的內(nèi)容,歡迎大家關(guān)注、點(diǎn)贊、在看、轉(zhuǎn)發(fā)、留言。讓我們一起學(xué)習(xí),共同進(jìn)步!