摘要
在當代電子設備中運用中,經常要測量一個波形的頻率,然后對其進行分析研究。為了測量頻率,就要用到頻率計。在傳統的電子測量儀器中,示波器在進行頻率測量時測量精度較低,誤差較大。頻譜儀可以準確的測量頻率并顯示被測信號的頻譜,但測量速度較慢,無法實時快速的跟蹤捕捉到被測信號頻率的變化。正是由于頻率計能夠快速準確的捕捉到被測信號頻率的變化,因此,頻率計擁有非常廣泛的應用范圍。 數字頻率計的設計包括時基電路、整形電路、控制電路和計數顯示電路四部分組成。 由時基電路產生一標準時間信號控制閥門,調節時基電路中的電阻可產生需要的標準時間信號。信號輸入整形電路中,經過整形,輸出一方波,通過閥門后,計時器對其計數。當計數完畢,時基電路輸出一個上升沿,使鎖存器打開,計數器計數結果輸入譯碼器,從而讓顯示器顯示,達到測量頻率的目的。
目錄
設計原理及方案選擇
1.1、設計原理
1.2、方案選擇
程序設計及原理圖
2.1、原理圖設計
2.2、程序設計
3、仿真結果
4、實物調試
4.1、調試結果
4.2、調試中遇到的問題
5、設計小結
1.1、設計原理 頻率就是周期性信號在單位時間(1s)內變化的次數。若在一定時間間隔T內測得這個周期性信號的重復變化次數為N,則其頻率可表示為f=N/T。其中f為被測信號的頻率,N為計數器所累計的脈沖個數,T為N個脈沖所產生的時間。計數器所記錄的結果就是被測信號的頻率計數法又稱測頻法,是將被測信號通過一個定時閘門加到計數器進行計數的方法,如果閘門打開的時間為T,計數器得到的計數值為N1,則被測頻率為f=N1/T。改變時間T,則可改變測量頻率范圍。設在T期間,計數器的精確計數值應為N,根據計數器的計數特性可知,N1的絕對誤差是N1=N+1,N1的相對誤差為ΔN1=(N1-N)/N=1/N。由N1的相對誤差可知,N的數值愈大,相對誤差愈小,成反比關系。因此,在f以確定的條件下,為減少N的相對誤差,可通過增大T的方法來降低測量誤差。當T為某確定值時(通常取1s),則有f1=N1,而f=N,故有f1的相對誤差:Δf1=(f1-f)/f=1/f 從上式可知f1的相對誤差f成反比關系,即信號頻率越高,誤差越小;而信號頻率越低,則測量誤差越大。因此測頻法適合用于對高頻信號的測量,頻率越高,測量精度也越高。 1.2、方案選擇 計時法又稱為測周期法,測周期法使用被測信號來控制閘門的開閉,而將標準時基脈沖通過閘門加到計數器,閘門在外信號的一個周期內打開,這樣計數器得到的計數值就是標準時基脈沖外信號的周期值,然后求周期值的倒數,就得到所測頻率值。但由于用計時法所獲得的信號周期數據,還需要求倒數運算才能得到信號頻率,而求倒數運算用中小規模數字集成電路較難實現,因此,計時法不適合本實驗要求。 計數法則適合于對較高頻信號的測量。測頻法的測量誤差與信號頻率成反比,信號頻率越低,測量誤差就越大,信號頻率越高,其誤差就越小。但用測頻法所獲得的測量數據,在閘門時間為一秒時,不需要進行任何換算,計數器所計數據就是信號頻率。根據本設計要求的性能與技術指標,首先需要確定能滿足這些指標的頻率測量方法。因此,本實驗所用的頻率測量方法是測頻法。 

圖1.1原理框圖及其波形圖
2.1原理圖設計 
圖2.1 proteus電路圖 2.2 程序設計 
圖2.2 程序流程圖 3、仿真結果 利用proteus和Keil軟件,將程序編譯正確后,并且生成HEX文件,然后用protest仿真。修改發射頻率,觀察結果。 



圖3.1仿真結果 4、實物調試 4.1調試結果 當信號發射器輸入的頻率為2kHz方波時,LCD顯示屏顯示也為2k,發射頻率為3kHz時,顯示屏顯示3k,由此可得,實物實現了功能,并且達到了相應的精度。


4.1實物調試 4.2調試中遇到的問題 由于我們需要將編譯好的程序燒錄進入我們的板子,所以當時不是很清楚燒錄程序的用法,所以開始出現LCD沒有任何顯示,我們一直以為是板子和顯示屏的問題,所以浪費了很多時間。后來在了解清楚程序的使用方法后,我們成功的燒錄進去了程序,然后連接好我們之前焊接好的局部程序電路板,實行調試,取得了最后的成功。
5、設計總結 本次設計讓我體會到設計程序,連接原理圖,調試的苦與甜,設計是我們必須得技能,而這次實習恰恰給了我們一個很好的實際操作的機會,從圖書館找資料設計程序、連接原理圖,在這個過程中我學到了很多新的知識,并且對keil和proteus的應用更加的嫻熟,感受到了這些軟件的強大功能,當調試成功的時候感覺很神奇,很不可思議,同時更加深了我對這些知識的印象。 在設計過程中,因為我們設置定時器為計數模式。所以最高計數頻率為時鐘頻率(44.2368MHz)的1/4(11.0592MHz),但是我們又100分頻了的,所以最終只能測得110kHz。由于顯示器的問題,前面固定字符已經占了很多位,所以只能到9999Hz。 在設計過程中,不能急躁,設計和調試要一步一步來,這次在設計過程中,由于剛開始對LPC2138的管腳功能不熟,設計過程中老是混淆,經過查資料認真學習才辨別清楚,特別是程序修改的時候,一定不能馬虎,一個字母不對都編譯失敗,在最后的調試過程中,因為仿真結果已經準確無誤,所以調試不出結果讓人特別心急,還耽擱了了時間,建議能多一些好的開發板,若不是因為開發板和顯示器有問題,也許我們的進度能更快一些。
LPC2138源程序:
- #include"LPC213x.h"
- #define uint unsigned int
- #define uchar unsigned char
- int g_sample_cnt;
- #define RS 1<<5
- #define RW 1<<6
- #define EN 1<<7
- #define KEY_MC (1<<31)
- #define KEY_RST (1<<30)
- #define KEY_NIGHT (1<<29)
- uchar num,i;
- uchar table1[]={"frequency: hz "};
- uchar table2[]={" "};
- uint HZ[]={ 0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x00, 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00,
- 0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00};
- void DelayNs(uint NS)
- { uint i;
- for(;NS>0;NS--)
- for(i=0;i<500;i++);
- }
- void writecom(uint com)
- {
- IO0CLR=RS;
- IO0PIN=(IO0PIN&0X00FF)+(com<<8);
- DelayNs(1);
- IO0SET=EN;
- IO0CLR=EN;
- }
- void writedata( uint data)
- {
- IO0SET=RS;
- IO0PIN=(IO0PIN&0X00FF)+(data<<8); //P0=data;
- DelayNs(1);
- IO0SET=EN;
- IO0CLR=EN;
- }
- void init()
- {
- PINSEL0=0X00000000;
- IO0DIR =0XFFFF;
- IO0CLR=RW;
- IO0CLR=EN;
- writecom(0x38);
- writecom(0x0c);
- writecom(0x06);
- writecom(0x01);
- }
- int mile=0,premile=0;
- int night=0;
- int lowmode=0;
- int price=0;
- int lowmodefirsttime=0;
- int price_low=0;
- static int lowmodetime=0;
- void __irq IRQ_Timr0(void)
- {
-
- table1[10]=g_sample_cnt/1000%10+'0'; table1[11]=g_sample_cnt/100%10+'0';
- table1[12]=g_sample_cnt/10%10+'0';
- table1[13]=g_sample_cnt%10+'0';
- writecom(0x80);
- for(num=0;num<21;num++)
- {
- writedata(table1[num]);
- DelayNs(1);
- }
- writecom(0x80+0x40);
- for(num=0;num<21;num++)
- {
- writedata(table2[num]);
- }
- g_sample_cnt=0;
- T0IR = 0x01;
- VICVectAddr = 0x00;
- }
-
- /**********************************************************
- void Timer0Init(void)
- {
- //Fcclk = Fosc*4 = 11.0592MHz*4 = 44.2368MHz
- //Fpclk = Fcclk/4 = 44.2368MHz/4 = 11.0592MHz
- T0PR = 99; // 設置定時器0分頻為100分頻,得110592Hz
- T0MCR = 0x03; // 匹配通道0匹配中斷并復位T0TC
- T0MR0 = 150350; // 比較值(1S定時值)
- T0TCR = 0x03; // 啟動并復位T0TC
- T0TCR = 0x01;
- VICIntSelect = 0x00;
- VICVectCntl0 = 0x20|4;
- VICVectAddr0 = (unsigned long)IRQ_Timr0;
- VICIntEnable = 1<<4;
- }
- void main()
- {
- init();
- writecom(0x80);
- DelayNs(100);
- Timer0Init();
- for(num=0;num<19;num++)
- {
- writedata(table1[num]);
- DelayNs(1);
- }
- //writecom(0x40);
- // for(num=0;num<24;num++)
- // {
- // writedata(HZ[num]);
- // }
- writecom(0x80+0x40);
- for(num=0;num<19;num++)
- {
- writedata(table2[num]);
- }
-
- PINSEL1 &=0x00ffffff;
- //IODIR =0xe83fffff;
- IO1DIR |=0xff000000;
- //writedata(0x00);
- //writedata('4');
- //writedata(0x01);
- //writedata('2');
- //writedata('6');
- //writedata(0x02);
- IO1DIR&=~KEY_MC;
- IO1DIR&=~KEY_RST;
- IO1DIR&=~KEY_NIGHT;
- mile=325400;
- lowmodetime=lowmodefirsttime=price=premile=mile=0;
- while(1)
- {
- #if 1
- if((IO1PIN&KEY_MC)==0)
- {
- g_sample_cnt+=1;
- //DelayNs(1);
- while((IO1PIN&KEY_MC)==0);
- }
- #endif
- }
-
- }
復制代碼
完整的Word格式文檔51黑下載地址:
簡易數字頻率計的設計.docx
(498.7 KB, 下載次數: 55)
2018-10-31 15:43 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|