基于單片機的數(shù)字濾波器設計.doc_第1頁
基于單片機的數(shù)字濾波器設計.doc_第2頁
基于單片機的數(shù)字濾波器設計.doc_第3頁
基于單片機的數(shù)字濾波器設計.doc_第4頁
基于單片機的數(shù)字濾波器設計.doc_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

基于單片機的數(shù)字濾波器設計 數(shù)據(jù)采集,又稱數(shù)據(jù)獲取,是利用一種裝置,從系統(tǒng)外部采集數(shù)據(jù)并輸入到系統(tǒng)內(nèi)部的一個接口。數(shù)據(jù)采集技術廣泛引用在各個領域。比如攝像頭,麥克風,都是數(shù)據(jù)采集工具。被采集數(shù)據(jù)是已被轉(zhuǎn)換為電訊號的各種物理量,如溫度、水位、風速、壓力等,可以是模擬量,也可以是數(shù)字量。在互聯(lián)網(wǎng)行業(yè)快速發(fā)展的今天,數(shù)據(jù)采集已經(jīng)被廣泛應用于互聯(lián)網(wǎng)及分布式領域,數(shù)據(jù)采集領域已經(jīng)發(fā)生了重要的變化。 而在數(shù)據(jù)采集中存在著各種噪聲。濾除噪聲的方法有很多種,既有數(shù)字濾波器,也有模擬濾波器。這里我們采用了基于單片機和C語言來設計并開發(fā)數(shù)字濾波系統(tǒng)。 我們針對于單片機數(shù)據(jù)采集系統(tǒng)中經(jīng)常出現(xiàn)的隨機干擾,通過手動輸入來模擬數(shù)據(jù)采集過程,驗證了幾種使用較為普遍的克服隨機干擾的單片機數(shù)字濾波算法,并給出了相應的C程序,尤其對中位值濾波和中位值平均濾波算法程序進行了改進。同時也對這幾種濾波算法進行了比較,并指出了每一種算法的具體適用范圍和注意事項。另外我們使用了 proteus進行仿真驗證這幾種濾波方法。另外我們還使用了AD和DA來采集及輸出數(shù)據(jù)。 關鍵詞:單片機、proteus、C語言、數(shù)字濾波。1 數(shù)字濾波設計原理 這里有很多種數(shù)字濾波方法,我們見選用其中幾種來進行設計,如中值濾波、算術平均濾波、加權平均濾波等等。所以下面我將詳細介紹它們。1.1 中值濾波中位值濾波是先對某一參數(shù)連續(xù)采樣N次(一般N取奇數(shù)),然后把N次采樣值按從小到大排列,取中間值為本次采樣值。該濾波方法實際上是一種排序方法,我在此采用的是冒泡法排序。由于在冒泡法排序中,每出現(xiàn)一次前者數(shù)據(jù)大于后者數(shù)據(jù),就要進行二者數(shù)據(jù)的交換。該算法的樣例子程序如下:#define N 11 /N值可根據(jù)實際情況調(diào)整char filter()char value_buf;char count,i,j,k,temp;for(count=0;countN;count+) /獲取數(shù)據(jù)value_bufcount=get_data();delay();for(i=0;iN-1;i+) /選擇排序 k=i;for(j=i+1;jN;j+) if(value_bufjvalue_bufk) k=j; temp=value_bufk; value_bufk=value_bufi; value_bufi=temp; return value_buf(N-1)/2;中位值濾波能有效地克服偶然因素引起的波動或采樣器不穩(wěn)定引起的誤碼等脈沖干擾。對溫度、液位等緩慢變化的被測參數(shù)采用此算法能收到良好的濾波效果,但對于流量、壓力等快速變化的數(shù)據(jù),不宜采用中位值濾波。1.2 算術平均濾波算術平均濾波法適用于對一般的具有隨機干擾的信號進行濾波。這種信號的特點是信號本身在某一數(shù)值范圍附近上下波動,如測量流量、液位時經(jīng)常遇到這種情況。算術平均濾波法是要按輸入的N 個采樣數(shù)據(jù),尋找這樣一個Y,使得Y 與各個采樣值之間的偏差的平方和最小。具體實現(xiàn)此算法的子程序如下:#define N 12char filter()int count;int sum=0;for(count=0;countN;count+) sum+=get_ad(); delay(); return (char)(sum/N);算術平均濾波適用于對一般具有隨機干擾的信號進行濾波。這種信號的特點是有一個平均值,信號在某一數(shù)值范圍附近做上下波動,在這種情況下僅取一個采樣值做依據(jù)顯然是不準確的。算術平均濾波對信號的平滑程序完全取決于N,當N較大時,平滑度高,但靈敏度低;當N較小時,平滑度低,但靈敏度高,應視具體情況選取N,以便既少占用計算時間,又達到最好的效果。1.3 加權平均濾波在算術平均濾波和移動平均濾波中,N次采樣值在輸出結果中的權重是均等的,取1/N。用這樣的濾波算法,對于時變信號會引入滯后,N值越大,滯后越嚴重。為了增加新采樣數(shù)據(jù)在移動平均中的權重,以提高系統(tǒng)對當前采樣值中所受干擾的靈敏度,可采用加權平均濾波,它是移動平均濾波算法的改進。加權平均濾波是對連續(xù)N次采樣值分別乘上不同的加權系統(tǒng)之后再求累加和,加權系統(tǒng)一般先小后大,以突出后面若干采樣的效果,加強系統(tǒng)對參數(shù)變化趨勢的辨識。各個加權系統(tǒng)均為小于1的小數(shù),且滿足總和等于1的約束條件。這樣,加權運算之后的累加和即為有效采樣值。為方便計算,可取各加權系數(shù)均為整數(shù),且總和為256,加權運算后的累加和除以256,即舍去低字節(jié)后便是有效采樣值。具體的樣例子程序如下:/code數(shù)組為加權系統(tǒng)表,存在ROM區(qū)。#define N 12char code jqN=1,2,3,4,5,6,7,8,9,10,11,12;char code sum_jp=1+2+3+4+5+6+7+8+9+10+11+12;char filter_5()char count;char value_bufN;int sum=0;for(count=0;countN;count+)value_bufcount=get_data();delay();for(count=0;countN;count+)sum+=value_bufcount*jqcount;return (char)(sum/sum_jq);1.4 中位值平均濾波它相當于是“中位值濾波法”和“算術平均濾波法”的結合。它連續(xù)采樣N個數(shù)據(jù),然后去掉一個最大值和一個最小值,最后計算N-2個數(shù)據(jù)的算術平均值。一般N值的選?。?-14。具體算法程序如下:#define N 12 char filter() char count,i,j; char value_bufN; int sum=0; for (count=0;countN;count+) value_bufcount = get_ad(); delay(); for (j=0;jN-1;j+) for (i=0;ivalue_bufi+1 ) temp = value_bufi; value_bufi = value_bufi+1; value_bufi+1 = temp; for(count=1;countA)|(data-datanewA)return data;return datanew;該算法主要用于處理變化比較緩慢的數(shù)據(jù),如溫度、物體的位置等。使用時關鍵在于最大偏差值的y的選擇,通常可根據(jù)經(jīng)驗獲得,也可按照輸出參數(shù)可能的最大變化速度Vmax及采樣周期T來決定Y的值,即Y=VmaxT。2 原理圖設計2.1 單片機AT89C51這里我們使用了51系列單片機AT89C51,利用這個單片機進行編程,實現(xiàn)對輸入信號的濾波。我使用了P0口作為接受AD轉(zhuǎn)換的結果的端口,而P1口則輸出數(shù)據(jù)到DA轉(zhuǎn)換器。另外還利用了P2作為控制端口,P2.0-P2.2用來控制AD轉(zhuǎn)換器,而P2.3-P2.6外接四個開關,用來實現(xiàn)濾波方式的選擇。2.2 數(shù)據(jù)采集另外我還使用了AD0808進行數(shù)據(jù)采集。這里AD0808是并聯(lián)AD轉(zhuǎn)換器,AD0808的引腳圖如下圖: 圖1 AD0808的引腳圖IN0-IN8是八個模擬量輸入端口,AD0808可以一次對八個模擬量進行模數(shù)轉(zhuǎn)換,但是在這里我們只使用了其中的一個輸入端IN0,所以ADDDA、ADDB、ADDC都應為0,所以我讓它們都接地。它的八個輸出端接在單片機上,CLOCK接數(shù)據(jù)采樣時鐘,它可以接在單片機上由單片機控制,也可接在另外的數(shù)字時鐘上,這里我選用外接別的時鐘。START為轉(zhuǎn)換啟動信號,在其上跳變時,所有內(nèi)部寄存器清零,在其下調(diào)變時,開始進行AD轉(zhuǎn)換。ALE是地址鎖存信號。這里我讓START和ALE均接在單片機的同一個端口上,即P2.1,讓單片機實現(xiàn)程序控制AD的轉(zhuǎn)換。OE是輸出允許信號,OE=1時,才能允許輸出,這里我讓它也接在單片機的端口P2.1上,也是為了讓單片機實現(xiàn)程序控制AD0808的輸出。EOC是轉(zhuǎn)換結束信號,EOC=1時,表示轉(zhuǎn)換結束。這個信號可以用來提醒單片機AD已經(jīng)轉(zhuǎn)換完畢,程序中即可以用查詢方式,也可以用中斷方式,這里我使用查詢方式,所以把它接在P2.2上。VREF(+)和VREF(-)都是參考電壓信號端口,這里我讓VREF(-)的參考電壓為零,VREF(+)的參考電壓為+3V。2.3 數(shù)模轉(zhuǎn)換輸出這里我用了DA0832來進行數(shù)模轉(zhuǎn)換。DA0832的引腳圖如下圖所示:圖2 DA0832的引腳圖DA0832有三種數(shù)模轉(zhuǎn)換方法,直通方式、單緩沖方式、雙緩沖方式,因為單片機輸出后可以直接進行數(shù)模轉(zhuǎn)換,所以這里我采用了不需要單片機控制的最為簡單的直通方式,但是DA0832若用于直通方式,則在接單片機的輸出端口之間還要接一個緩沖器件,如74LS373。若用于直通方式下,則 、和GND均接地,而VCC和ILE則接正電源。VREF是參考電源。IOUT1、IOUT2是兩個輸出端。DA0832輸出的是電流,要利用運算放大器轉(zhuǎn)換成電壓。數(shù)模轉(zhuǎn)換輸出電路如下圖所示: 圖3 數(shù)模轉(zhuǎn)換輸出電路2.4 總體電路圖總體電路圖如下圖所示: 圖4 總體電路圖3 程序設計3.1 濾波算法設計這個在前面介紹濾波原理時已經(jīng)說過了,在此就不再次重復了。因為設計時采集的時鐘頻率很大,所以在一定范圍內(nèi)采集的數(shù)據(jù)都差不多,因此對一系列的數(shù)據(jù)進行濾波處理時就好像是在對同一個數(shù)據(jù)進行濾波處理但是因為這些算法處理的數(shù)據(jù)時連續(xù)采集了N個的,所以要設立一個變量數(shù)組來存儲這些輸入的數(shù)據(jù),而且要記得及時更新。我利用了隊列的思想,如果輸入一個新的數(shù)據(jù),則丟棄最原始的一個數(shù)據(jù),把新數(shù)據(jù)插入進來,就好像隊列一樣,對頭刪除數(shù)據(jù),對位插入新的數(shù)據(jù)。這個程序如下:void change()int i;for(i=0;iN-1;i+)bufi=bufi+1;bufN-1=a;而獲得這一系列中的某一個數(shù)據(jù)就用了一個函數(shù)就可以了,直接返回隊列中的第n項的數(shù)據(jù)。這個程序如下:uchar get_data(n)change();return bufn;3.2 AD轉(zhuǎn)換器因為START為轉(zhuǎn)換啟動信號,在其上跳變時,所有內(nèi)部寄存器清零,在其下調(diào)變時,開始進行AD轉(zhuǎn)換。所以設計程序時,要先讓START為0,在讓START為1,最后讓START為0。開始采集數(shù)據(jù)后就要讓OE為1,進行數(shù)據(jù)輸入。同時數(shù)據(jù)采集結束時,利用查詢語句,查看EOC是否為1,如果是1,則處于等待狀態(tài),如果變成1,則可以進行數(shù)據(jù)輸入了。AD轉(zhuǎn)換的程序如下:START = 0;START = 1;START = 0;while(EOC=0);OE = 1;a = P0;這里a是一個變量,用來存儲AD輸入的數(shù)據(jù)。3.3 濾波算法的選擇我在電路上采用的是開關控制選擇,所以這里只需要一系列的if選擇語句就可以完成率把算法的選擇。程序如下:if(con=0) if(con1=0)&(con2=0)&(con3=0) res=filter1(); if(con1=0)&(con2=0)&(con3=1) res=filter2(); if(con1=1)&(con2=0)&(con3=0) res=filter5(); if(con1=1)&(con2=0)&(con3=1) res=filter6(); if(con1=1)&(con2=1)&(con3=1) res=filter8(); else res=a;con1、con2、con3三位用來控制濾波算法的選擇,而con用來控制是否要進行濾波。3.4 總體程序總體程序見附錄。 3.5程序流程圖 4 仿真結果和分析輸入波形與未經(jīng)濾波器濾波波形如下:圖5 輸入波形與未經(jīng)濾波器濾波波形以下幾幅圖是經(jīng)濾波后的波形(藍色的波): 圖6 經(jīng)限幅濾波后的波形圖7 經(jīng)中值濾波后的波形圖8 經(jīng)滑動平均濾波后的波形 圖9 經(jīng)中位值平均濾波后的波形 圖10 經(jīng)加權遞推平均濾波后的波形限幅濾波的效果是和A值有關的,一般情況下,A值越小,則代表允許的噪聲要越小,限幅濾波很適用于使幅值突變的噪聲。中值濾波由于要求中值,所用到的排序算法會大大消耗時間,因此延時比較嚴重,但是總的來說選擇排序比冒泡排序的延時情況要好。中位值平均濾波,由于濾波算法中會求平均值在,所以在原波是方波時會出現(xiàn)某一次求平均后編程中間值,另外由于和中值濾波一樣要進行排序,因此也會產(chǎn)生很大的延時。加權遞推平均算法和上面一樣,因為會求平均值,因此也會有時候產(chǎn)生中間值,但是如果把當前值得權值設的很大,而越久遠之前的權值設的越小,則可明顯改善此問題,另外由于加權遞推平均濾波中用到的乘法,因此會有一定的延時。5 心得與體會這次整個課程設計通過了軟件和硬件上的調(diào)試。我想這對于自己以后的學習和工作都會有很大的幫助。在這次設計中遇到了很多實際性的問題,在實際設計中才發(fā)現(xiàn),書本上理論性的東西與在實際運用中的還是有一定的出入的,所以有些問題不但要深入地理解,而且要不斷地更正以前的錯誤思維。一切問題必須要靠自己一點一滴的解決,而在解決的過程當中你會發(fā)現(xiàn)自己在飛速的提升。對于數(shù)字濾波系統(tǒng),其程序不是很難的,主要是解決程序設計中的問題,而程序設計是一個很靈活的東西,它反映了你解決問題的邏輯思維和創(chuàng)新能力,它才是一個設計的靈魂所在。因此在整個設計過程中大部分時間是用在程序上面的。很多子程序是可以借鑒書本上的,但怎樣銜接各個子程序才是關鍵的問題所在,這需要對系統(tǒng)的結構很熟悉。因此可以說系統(tǒng)的設計是軟件和硬件的結合,二者是密不可分的。通過這次課程設計我也發(fā)現(xiàn)了自身存在的不足之處,雖然感覺理論上已經(jīng)掌握,但在運用到實踐的過程中仍有意想不到的困惑,經(jīng)過一番努力才得以解決。這也激發(fā)了我今后努力學習的興趣,我想這將對我以后的學習產(chǎn)生積極的影響。其次,這次課程設計讓我充分認識到要學會借鑒別人的思想的重要性,很多時候你做的東西別人也許已經(jīng)做出來了,我們可以直接拿來用。雖然這不好,又偷懶的嫌疑,但是這卻加快了效率,而且,以后再研究中也要實時關注新的東西,如果你花了很多時間和精力做的東西,已經(jīng)早有人做了,這就很得不償失了。俗話說“三人行必有我?guī)煛甭?,更何況是這么多人的思想,這也是一種學習的方法。另外在課程設計的過程中,當我們碰到不明白的問題時,指導老師總是耐心的講解,給我們的設計以極大的幫助,使我們獲益匪淺。因此非常感謝老師的教導。通過這次設計,我懂得了學習的重要性,了解到理論知識與實踐相結合的重要意義,學會了堅持、耐心和努力,這將為自己今后的學習和工作做出了最好的榜樣。我覺得作為一名軟件工程專業(yè)的學生,這次課程設計是很有意義的。更重要的是如何把自己平時所學的東西應用到實際中。雖然自己對于這門課懂的并不多,很多基礎的東西都還沒有很好的掌握,覺得很難,也沒有很有效的辦法通過自身去理解,但是靠著這一個多禮拜的“學習”,在小組同學的幫助和講解下,漸漸對這門課逐漸產(chǎn)生了些許的興趣,自己開始主動學習并逐步從基礎慢慢開始弄懂它。我認為這個收獲應該說是相當大的。一開始我們從參考書上找來了課題,但是畢竟是參考書,做到后來發(fā)現(xiàn)很多程序都是不完整的,這讓我傷透了腦筋。程序接線什么的都弄好了,調(diào)試也沒有問題,可是就是無法達到預期想要的結果。參考書畢竟只是一個參考,設計這種東西最后還是要靠自己動腦筋。然后我從平時做的實驗老師上課的舉例書本上的知識以及老師的輔導和其他同學的幫助下終于完成了。雖然內(nèi)容并不是很復雜,但是我們覺得設計的過程相當重要,學到了很多,收獲了很多。我覺得課程設計反映的是一個從理論到實際應用的過程,但是更遠一點可以聯(lián)系到以后畢業(yè)之后從學校轉(zhuǎn)到踏上社會的一個過程。小組人員的配合相處,以及自身的動腦和努力,都是以后工作中需要的。所以我認為這次的課程設計意義很深,和其他4位同學的共同學習配合努力的過程也很愉快,另外還要感謝老師的耐心輔導。參考文獻1 李群芳.單片微型計算機與接口技術.電子工業(yè)出版社.20072 彭冬明.單片機實驗教程.北京理工大學出版社.20073 何立民.單片機應用技術選編.北京航空航天大學出版社.20004 余發(fā)山.單片機原理及及應用技術.中國礦業(yè)大學出版社.20035 周航慈.單片機程序設計基礎.北京航空航天大學出版社.2001附錄:總體程序如下:#include #include #define uchar unsigned char#define A 0.005#define N 11sbit con1 = P23;sbit con2 = P24;sbit con3 = P25;sbit con = P26;sbit OE = P20;sbit START = P21;sbit EOC = P22;uchar a;uchar bufN =0; void change()int i;for(i=0;i A ) | ( value - new_value A ) )return value; return new_value; /中值濾波uchar filter2()uchar value_buffN,temp; /定義存儲數(shù)據(jù)的數(shù)組int count,i,j,k;for(count=0;countN;count+) /獲取數(shù)據(jù) value_buffcount=get_data(count); for(j=0;jN-1;j+) /用冒泡法對數(shù)據(jù)進行排序,當然最好用其他排序方法 k=j;for(j=i+1;jN;j+)if(value_buffjvalue_buffk) k=j; temp=value_buffk; value_buffk=value_buffi; value_buffi=temp; return value_buff(N-1)/2; /滑動平均濾波uchar filter5()uchar value_buffN;int i=0;int count;int sum=0;value_buffi+=get_data(count);if(i=N) i=0;for(count=0;countN;count+) sum+=value_buffcount;return (uchar)(sum/N); /中位值平均濾波uchar filter6() uchar count,i,j,temp; uchar value_bufN; int sum=0; for (count=0;countN;count+) value_bufcount = get_data(count); for (j=0;jN-1;j+) for (i=0;ivalue_bufi+1 )

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論