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

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



圖3.1仿真結(jié)果 4、實物調(diào)試 4.1調(diào)試結(jié)果 當(dāng)信號發(fā)射器輸入的頻率為2kHz方波時,LCD顯示屏顯示也為2k,發(fā)射頻率為3kHz時,顯示屏顯示3k,由此可得,實物實現(xiàn)了功能,并且達到了相應(yīng)的精度。


4.1實物調(diào)試 4.2調(diào)試中遇到的問題 由于我們需要將編譯好的程序燒錄進入我們的板子,所以當(dāng)時不是很清楚燒錄程序的用法,所以開始出現(xiàn)LCD沒有任何顯示,我們一直以為是板子和顯示屏的問題,所以浪費了很多時間。后來在了解清楚程序的使用方法后,我們成功的燒錄進去了程序,然后連接好我們之前焊接好的局部程序電路板,實行調(diào)試,取得了最后的成功。
5、設(shè)計總結(jié) 本次設(shè)計讓我體會到設(shè)計程序,連接原理圖,調(diào)試的苦與甜,設(shè)計是我們必須得技能,而這次實習(xí)恰恰給了我們一個很好的實際操作的機會,從圖書館找資料設(shè)計程序、連接原理圖,在這個過程中我學(xué)到了很多新的知識,并且對keil和proteus的應(yīng)用更加的嫻熟,感受到了這些軟件的強大功能,當(dāng)調(diào)試成功的時候感覺很神奇,很不可思議,同時更加深了我對這些知識的印象。 在設(shè)計過程中,因為我們設(shè)置定時器為計數(shù)模式。所以最高計數(shù)頻率為時鐘頻率(44.2368MHz)的1/4(11.0592MHz),但是我們又100分頻了的,所以最終只能測得110kHz。由于顯示器的問題,前面固定字符已經(jīng)占了很多位,所以只能到9999Hz。 在設(shè)計過程中,不能急躁,設(shè)計和調(diào)試要一步一步來,這次在設(shè)計過程中,由于剛開始對LPC2138的管腳功能不熟,設(shè)計過程中老是混淆,經(jīng)過查資料認真學(xué)習(xí)才辨別清楚,特別是程序修改的時候,一定不能馬虎,一個字母不對都編譯失敗,在最后的調(diào)試過程中,因為仿真結(jié)果已經(jīng)準(zhǔn)確無誤,所以調(diào)試不出結(jié)果讓人特別心急,還耽擱了了時間,建議能多一些好的開發(fā)板,若不是因為開發(fā)板和顯示器有問題,也許我們的進度能更快一些。
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; // 設(shè)置定時器0分頻為100分頻,得110592Hz
- T0MCR = 0x03; // 匹配通道0匹配中斷并復(fù)位T0TC
- T0MR0 = 150350; // 比較值(1S定時值)
- T0TCR = 0x03; // 啟動并復(fù)位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
- }
-
- }
復(fù)制代碼
完整的Word格式文檔51黑下載地址:
簡易數(shù)字頻率計的設(shè)計.docx
(498.7 KB, 下載次數(shù): 55)
2018-10-31 15:43 上傳
點擊文件名下載附件
|