簡(jiǎn)易頻率特性測(cè)試儀的設(shè)計(jì)_第1頁(yè)
簡(jiǎn)易頻率特性測(cè)試儀的設(shè)計(jì)_第2頁(yè)
簡(jiǎn)易頻率特性測(cè)試儀的設(shè)計(jì)_第3頁(yè)
簡(jiǎn)易頻率特性測(cè)試儀的設(shè)計(jì)_第4頁(yè)
簡(jiǎn)易頻率特性測(cè)試儀的設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、簡(jiǎn)易頻率特性測(cè)試儀的設(shè)計(jì)加在前面:術(shù)業(yè)有專攻。一般寫一些東西我也不會(huì)在空間瞎發(fā),弄的別人以為自己瞎顯擺。不過(guò)我覺(jué)得我們電子設(shè)計(jì)的過(guò)程確實(shí)值得其他小組學(xué)習(xí)一下,比如說(shuō)老葛焊板子那種芯片的布局,還有我們用4個(gè)按鍵解決所有數(shù)字的設(shè)置的思想。我希望大家看到文章的時(shí)候不是覺(jué)得怎么吊炸天,其實(shí)我們這種水平比我們吊炸天的多了去。我們之所以有敢厚著臉皮把這么次的設(shè)計(jì)思想分享出來(lái),主要希望能把其中的某一些發(fā)光點(diǎn)分享給大家,同時(shí)希望他人給我們的更寶貴的意見(jiàn)和建議。 -end- 電子設(shè)計(jì)三中,儀器儀表組的第一個(gè)題目,是簡(jiǎn)易頻率特性測(cè)試儀的設(shè)計(jì)。這個(gè)題目取自2013年的E題:簡(jiǎn)易頻率特性測(cè)試儀(E 題)。為了紀(jì)念近一

2、個(gè)月的工作,特撰以此文紀(jì)念我們第七小組歷經(jīng)了的艱辛歲月。在此,感謝組長(zhǎng)葛家瑾大神、還有范一華同學(xué)的辛勤付出,還有李煜及其他一些學(xué)長(zhǎng)的幫助。特發(fā)上圖,以作紀(jì)念。在本次完成題目的過(guò)程中,葛大神早早完成了公式推導(dǎo)、電路理論和原理的分析,并組織我們?cè)诠ぷ魃戏止ぃm然他好像對(duì)“被我和范一華排擠去焊電路板”很不滿意私下抱怨并耿耿于懷,哈哈)。下面我簡(jiǎn)單的回顧一下我們的這次設(shè)計(jì):其中,有關(guān)硬件電路的部分是葛大神負(fù)責(zé)的,我只是略懂了原理,故僅僅略述。我主要承擔(dān)的是AD采樣部分的程序,還有就是通過(guò)操作液晶屏和按鍵實(shí)現(xiàn)的程序的總體邏輯控制程序。范一華同學(xué)主要完成的是AD9854部分的程序,正弦波輸出及其幅度補(bǔ)償,

3、還有掃頻部分的程序。下面,我從入手這道題目的開(kāi)始狀態(tài),來(lái)一步步回顧一下。下面,先把題目貼出來(lái):/*=開(kāi)始貼題目=*/【本科組】一、任務(wù)根據(jù)零中頻正交解調(diào)原理,設(shè)計(jì)并制作一個(gè)雙端口網(wǎng)絡(luò)頻率特性測(cè)試儀,包括幅頻特性和相頻特性,其示意圖如圖 1 所示。二、要求1基本要求制作一個(gè)正交掃頻信號(hào)源。(1)頻率范圍為 1MHz40MHz,頻率穩(wěn)定度10-4;頻率可設(shè)置,最小設(shè)置單位 100kHz。(2)正交信號(hào)相位差誤差的絕對(duì)值5º,幅度平衡誤差的絕對(duì)值5%。(3)信號(hào)電壓的峰峰值1V,幅度平坦度5%。(4)可掃頻輸出,掃頻范圍及頻率步進(jìn)值可設(shè)置,最小步進(jìn) 100kHz;要求連續(xù)掃頻輸出,一次掃頻

4、時(shí)間2s。2發(fā)揮部分(1)使用基本要求中完成的正交掃頻信號(hào)源,制作頻率特性測(cè)試儀。a. 輸入阻抗為 50,輸出阻抗為 50;b. 可進(jìn)行點(diǎn)頻測(cè)量;幅頻測(cè)量誤差的絕對(duì)值0.5dB,相頻測(cè)量誤差的絕對(duì)值5º;數(shù)據(jù)顯示的分辨率:電壓增益 0.1dB,相移 0.1º。(2)制作一個(gè) RLC 串聯(lián)諧振電路作為被測(cè)網(wǎng)絡(luò),如圖 2 所示,其中 Ri和Ro分別為頻率特性測(cè)試儀的輸入阻抗和輸出阻抗;制作的頻率特性測(cè)試儀可對(duì)其進(jìn)行線性掃頻測(cè)量。a. 要求被測(cè)網(wǎng)絡(luò)通帶中心頻率為 20MHz,誤差的絕對(duì)值5%;有載品質(zhì)因數(shù)為 4,誤差的絕對(duì)值5%;有載最大電壓增益 -1dB;b. 掃頻測(cè)量制作的被

5、測(cè)網(wǎng)絡(luò),顯示其中心頻率和-3dB 帶寬,頻率數(shù)據(jù)顯示的分辨率為 100kHz;c. 掃頻測(cè)量并顯示幅頻特性曲線和相頻特性曲線,要求具有電壓增益、相移和頻率坐標(biāo)刻度。(3) 其他。/*=貼題目結(jié)束=*/AD9854實(shí)驗(yàn)板的程序,我們直接有學(xué)長(zhǎng)找來(lái)的代碼,我們需要做的工作只是移植。然而,源程序?qū)?yīng)的IO口用到的均為位操作,而我們使用的F020單片機(jī)不能直接對(duì)P6、P7口直接進(jìn)行位操作,所以需要將位操作均用“|=bitx”或者“&=!bitx”的方式來(lái)置位或者復(fù)位。這一段程序由范一華同學(xué)完成移植,在此不貼出了。硬件部分最值得一說(shuō)的是AD835解調(diào)板,該板子由葛大神焊成。他共焊接了兩次,第一次

6、半途而廢,因?yàn)榇_實(shí)太渣渣了。第二次,板子正面元器件布局很好,但是最終測(cè)試的時(shí)候,發(fā)現(xiàn)還是效果不行,原因可能是高頻信號(hào)的其板子背面走線,尤其是AD9854的雙正弦波輸入附近位置的不佳處,受到的影響較大(具體我不清楚為什么)。你們會(huì)發(fā)現(xiàn),途中下面的兩塊轉(zhuǎn)接板上你看不到芯片,這并不是沒(méi)有焊芯片,而是焊接時(shí)候就把板子反面了一下。這樣的話,芯片引腳的布局就和電路的原理圖上一樣啦,在走線的時(shí)候?qū)⒎奖阍S多,這個(gè)小技巧大家可以學(xué)習(xí)一下。老哥說(shuō)了下次還是他要來(lái)焊了啦,要給他一個(gè)挽回的機(jī)會(huì)哈哈?,F(xiàn)在貼出AD835解調(diào)板原理圖:解調(diào)板左邊的四個(gè)接口,分別對(duì)應(yīng)如下:Q-AD9854cos路,I-AD9854sin路,

7、IN-RLC被測(cè)網(wǎng)絡(luò)輸入端,OUT-LC被測(cè)網(wǎng)絡(luò)輸出端。右側(cè)分別為Ain0和Ain1路的采樣,輸給F020單片機(jī)的ADC0.輸入解調(diào)板的兩路正交的sin信號(hào)I和Q,期中I路經(jīng)過(guò)RLC網(wǎng)絡(luò)后分別與I路和Q路相乘。通過(guò)AD835完成乘法,其輸出:分別給偏置電壓0.125mV和0.25mV。通過(guò)TL431給出穩(wěn)定的偏置。分別通過(guò)低通濾波器,得到直流分量。這里低通的指標(biāo)是按照截止頻率100KHz做得,其實(shí)具體是多少,只要足夠小就行。為了讓F020能夠采樣到合適范圍的電壓值,通過(guò)低通濾波器后,再將信號(hào)放大10倍。實(shí)際上,我們會(huì)發(fā)現(xiàn),因?yàn)镕020板子上參考電壓已經(jīng)與內(nèi)部相連,我們無(wú)法改變,最大電壓只能采樣

8、到2.48V,幸好最大電壓只能是2.5V,我們?cè)谶@種情況下可以視為2.5V來(lái)算。但是我們?cè)O(shè)想,如果將電壓放大的倍數(shù)略設(shè)置小一些,如8倍,將解決該問(wèn)題。最后,就是在程序中,根據(jù)公式算出實(shí)際的被測(cè)網(wǎng)絡(luò)的K(幅度衰減)和Fi(相位)值啦。經(jīng)過(guò)濾波器之后,兩路直流分量為:,由此推出:,由此再推出K,再代回某個(gè)式子推出Fi,這里就略了。這里建議用sin函數(shù)推導(dǎo)(代回Q路公式),我們可以發(fā)現(xiàn)asin函數(shù)的值域-90度,+90度對(duì)應(yīng)的值正好為-1,+1,這樣我們方便在程序中計(jì)算。Atan函數(shù)畢竟精確度沒(méi)有asin好,這個(gè)自己畫函數(shù)圖像便知。硬件電路就說(shuō)這么多了,下面我來(lái)show一下我們的代碼。這里補(bǔ)充一些大

9、家在畫幅頻、相頻曲線的時(shí)候可能會(huì)遇到的問(wèn)題:如果你們圖像畫的不標(biāo)準(zhǔn),可能有這些原因:1、公式形式問(wèn)題。最開(kāi)始我們公式中用的是mV做電壓的單位,發(fā)現(xiàn)計(jì)算出來(lái)的數(shù)值打在屏上是錯(cuò)的。后來(lái)發(fā)現(xiàn)是因?yàn)閙V本來(lái)就是103,再需要平方等等,可能已經(jīng)造成了數(shù)據(jù)類型的溢出。后來(lái)我們改在計(jì)算之前轉(zhuǎn)換成V作為電壓的單位,結(jié)果就對(duì)了。其實(shí)我們不難想到,當(dāng)我們做小數(shù)乘法的時(shí)候,就算數(shù)據(jù)類型有溢出,也是向后溢出的,缺失的是我們不太關(guān)心的極小的部分。 2、可能是你們的硬件電路有問(wèn)題。我們的硬件電路跑在我們自己的軟件上,畫出來(lái)的相頻曲線明顯不對(duì),根本都看不出來(lái)是什么。但是換成吳天涯組他焊的板子,結(jié)果圖像就特別好,是一個(gè)從90

10、度逐漸減小的趨勢(shì)。相頻我們的還行。但是由此還是可見(jiàn),就算程序?qū)懙臎](méi)有問(wèn)題,如果AD835解調(diào)板焊接不行,還是會(huì)影響你的軟件顯示,造成懷疑自己程序錯(cuò)誤的假象。3、可能是你們的公式推導(dǎo)問(wèn)題: 我們最早把峰峰值和電壓幅度值弄混淆的寫在一起計(jì)算,這樣你會(huì)發(fā)現(xiàn)得出的結(jié)果比理論上差個(gè)2倍或者多個(gè)2倍。這個(gè)問(wèn)題細(xì)心看一下就解決了。-關(guān)于ADC采樣值轉(zhuǎn)化為實(shí)際電壓值的一些問(wèn)題: ADC0H+ADC0L中如果數(shù)據(jù)為4095,表示的電壓:超過(guò)了2.48或者引腳懸空的時(shí)候都是4095。問(wèn):如果adc采樣后,寄存器里面的值為temp,那么電壓就是vin=temp/4095*2.48,對(duì)嗎? 答:如果你這樣處理,是不好

11、的。我們知道,AD采樣在低于180mV電壓和高于2.4V電壓的時(shí)候是不夠準(zhǔn)確的,2.48只是一個(gè)手冊(cè)里面給的參考電壓。我們組的做法是,用電源輸入一個(gè)1v的電壓,記錄現(xiàn)在的ADC采樣數(shù)值。再輸入一個(gè)2V電壓,記錄現(xiàn)在采樣數(shù)值。然后,就可以畫出一條線性的曲線,以后任意采樣到的ADC值,都可以轉(zhuǎn)化成實(shí)際的電壓。=Main.c函數(shù)#include "lcdsys.h"#include "key.h" #include "lcd.h" #include "Device.h"int main()Device_Init();Ke

12、yPort_Init();newLCDInit();/Welcome Pics.Clear();DrawcharS("Our AD9854 sys",1,0);DrawcharS("- to Be No.1",2,4);while(0=KeyScan();/Go into Our System.initlcdsys();while(1)sysfuntion(KeyScan();上面是我們的main函數(shù),我們主要就是進(jìn)來(lái)初始化所有需要用到的外圍電路,然后就進(jìn)了一個(gè)sysfuntion(KeyScan();函數(shù),這就是我們的LCDsys。當(dāng)然了,我們的LCD

13、sys.c有600+行,所以接下來(lái)關(guān)于這段程序的解讀,我會(huì)直接在代碼里面寫。我個(gè)人認(rèn)為我一個(gè)比較好的編程習(xí)慣就是注釋寫得非常詳細(xì),當(dāng)然,和別的大牛比起來(lái)就很渣渣啦,不過(guò)通過(guò)注釋讓隔了一段時(shí)間后自己還看得懂自己的程序是非常必要的。然后,我寫此文時(shí)對(duì)程序的解讀,我就用【】擴(kuò)起來(lái)表示。Lcdsys.c函數(shù)#include "lcdsys.h"#include "DataType.h"#include "math.h"#include "string.h"#include "lcd.h" #includ

14、e "key.h" #include "ADDA.h"#include "AD9854.h" #include "c8051F020.h" /c8051f020單片機(jī)頭文件【上方都是頭文件就沒(méi)什么說(shuō)的啦,當(dāng)然,如果你經(jīng)常在把別人的程序挪給自己用的時(shí)候出錯(cuò),那么你就需要專門百度一下.c程序的頭文件.h需要怎么寫了。】 #define Vppadjust 0.819#define VppFangDaBeiShu 10.0#define VppPianZhiValue 1250.0#define GNDBuChang 1

15、3.0 【如果你有把不需要改變的值定義成變量的壞習(xí)慣,建議你定義他們?yōu)槌A?。這樣你不會(huì)在程序中不小心的改變他們,更不會(huì)讓Keil不智能的編譯器不知為什么的就讓你的程序跑飛。F020單片機(jī)的存儲(chǔ)單元在你寫了一大串自己都不太記得什么用的變量和大量的借鑒了別人的代碼后都不知道別人有什么變量的情況下存儲(chǔ)空間的資源將會(huì)是十分極其以及相當(dāng)?shù)木o張的,所以你需要有這個(gè)習(xí)慣】unsigned int f;/幅度(整型)給AD9854的時(shí)候*1000.0unsigned int a;/幅度(整型)給AD9854的時(shí)候*Vppadjust(即0.819) unsigned int xdata tmp5;/記錄采集出

16、來(lái)的ADC0的12位數(shù)據(jù)bit JiaoZhunBit; float xdata ad0bc5;/補(bǔ)償值數(shù)據(jù) float xdata ad1bc5;/補(bǔ)償值數(shù)據(jù)float xdata MaxValue;/最大相位或K取值 int xdata MaxPoint;/最大相位或K的頻率點(diǎn)、/float xdata MinValue;/最小相位或K取值/int xdata MinPoint;/最小相位或K的頻率點(diǎn)、float xdata Value120;int xdata ThreeDb2;【給自己定義的變量注釋清楚到底是用作什么用的】/*=對(duì)應(yīng)關(guān)系= 0- 5000k( 5M) 1-10000k(

17、10M) 2-20000k(20M) 3-30000k(30M) 4-40000k(40M)=對(duì)應(yīng)關(guān)系=*/unsigned int adtmp,adtmp0,adtmp1;/記錄采集出來(lái)的ADC0的12位數(shù)據(jù)long double ad0,ad1,sinFi,Du,K;/將12位數(shù)據(jù)轉(zhuǎn)化為實(shí)際電壓值,保存為浮點(diǎn)數(shù)據(jù)/cosFi已經(jīng)不用了unsigned char wei,count,incount;/LCDsys用的:數(shù)據(jù)標(biāo)志位、全局計(jì)數(shù)位、內(nèi)嵌套計(jì)數(shù)位unsigned char cmd;/畫圖時(shí)候:1-頻率特性繪圖,2-幅度特性曲線,3-校準(zhǔn),4-退出/掃頻時(shí)候:1-步進(jìn),2-起始頻率,3

18、-截止頻率bit AorF;/用于標(biāo)志:設(shè)置頻率或者幅度、的標(biāo)志位。unsigned int mo=1;/掃頻使用 scan using.unsigned long Freq1=1000000.0;/掃頻使用 scan using.unsigned int scanstep=1;/掃頻使用 scan using. 掃頻步進(jìn)void initlcdsys()/LCDsys初始化函數(shù)ADCcount=0;f=100;/ kHza=2000;/ mVwei=0;AorF=0;Clear();fun_ok();JiaoZhunBit=0;MaxValue=0;MaxPoint=0;/MinValue=

19、0;/MinPoint=0; for(count=0;count<120;count+)Valuecount=0;ThreeDb0=0;ThreeDb1=0;【其實(shí)最好是寫一個(gè)初始化函數(shù),給自己定義了的變量賦一個(gè)初值】【下面是一個(gè)尋找5個(gè)數(shù)字的中值得函數(shù),用到了冒泡排序,還記得不?】unsigned int mid5(unsigned int num1,unsigned int num2,unsigned int num3,unsigned int num4,unsigned int num5)unsigned int a6,i,start;a1=num1;a2=num2;a3=num3

20、;a4=num4;a5=num5;for(start=5;start>1;start-)for(i=1;i<start;i+)if(ai>ai+1)a0=ai;ai=ai+1;ai+1=a0;return a3;【下面是一個(gè)將一位的整型轉(zhuǎn)化成字符串的函數(shù)】/將 1 位的 int 型數(shù)據(jù)轉(zhuǎn)換,返回字符的子函數(shù)char int2char(int input)return 0x30+input;【在液晶屏上畫無(wú)符號(hào)整型的函數(shù)】void drawint(unsigned int num,unsigned char row,unsigned char col)Drawchar(int2

21、char(num/1)%10),row,col+4);Drawchar(int2char(num/10)%10),row,col+3);Drawchar(int2char(num/100)%10),row,col+2);Drawchar(int2char(num/1000)%10),row,col+1);Drawchar(int2char(num/10000)%10),row,col+0);【在液晶屏上畫有符號(hào)整型的函數(shù)】void drawsignedint(int input,unsigned char row,unsigned char col)int num; if(input<0

22、)Drawchar('-',row,col+0);num=-input;elseDrawchar('+',row,col+0);num=input;Drawchar(int2char(num/1)%10),row,col+4);Drawchar(int2char(num/10)%10),row,col+3);Drawchar(int2char(num/100)%10),row,col+2);Drawchar(int2char(num/1000)%10),row,col+1);【在液晶屏上畫有符號(hào)浮點(diǎn)數(shù)的函數(shù)】void drawsignedfloat2_2(flo

23、at input,unsigned char row,unsigned char col) float num; if(input<0)Drawchar('-',row,col+0);num=-input;elseDrawchar('+',row,col+0);num=input;Drawchar(int2char(int)(num/10.0)%10),row,col+1);Drawchar(int2char(int)(num/1.0)%10),row,col+2);Drawchar('.',row,col+3);Drawchar(int2

24、char(int)(num*10.0)%10),row,col+4);Drawchar(int2char(int)(num*100.0)%10),row,col+5);【這個(gè)函數(shù)是我們打主屏(F和A設(shè)置時(shí)候的函數(shù)),貼出圖片來(lái)看看】void fun_ok()if(AorF)DrawcharS("Change A.",0,0); drawint(a,1,0);DrawcharS("mV",1,5);DrawcharS("when F=",3,0); drawint(f,3,7);DrawcharS("kHz",3,1

25、2); elseDrawcharS("Change F.",0,0); drawint(f,1,0); DrawcharS("kHz",1,5); DrawcharS("when A=",3,0); drawint(a,3,7);DrawcharS("mV",3,12);DrawcharS("=",2,wei);【這是畫掃頻菜單時(shí)候的函數(shù)???。找不到照片??赡軟](méi)拍吧?!縱oid fun_scanmsg()Clear();DrawcharS("Scaning.",0,0);Dr

26、awcharS(">",cmd+1,0);DrawcharS("scanStep=",1,1);drawint(100*scanstep,1,10);DrawcharS("k",1,15);DrawcharS("Start=",2,1);drawint(adtmp0*100,2,7);DrawcharS("kHz",2,12);DrawcharS("Stop=",3,1);drawint(adtmp1*100,3,6);DrawcharS("kHz"

27、,3,11);【下面是兩路ADC的補(bǔ)償函數(shù),根據(jù)不同的頻率,將電壓分別在接直通網(wǎng)絡(luò)自動(dòng)校準(zhǔn)的時(shí)候,分別校準(zhǔn)位1250mV和2500mV】 /*=對(duì)應(yīng)關(guān)系= 0- 5000k( 5M) 1-10000k(10M) 2-20000k(20M) 3-30000k(30M) 4-40000k(40M)=對(duì)應(yīng)關(guān)系=*/long double ad0BuChang(long double inputVpp,unsigned int inputf)/(相/頻)度數(shù)補(bǔ)償函數(shù)long double BuChangVpp,k;BuChangVpp=inputVpp;if(1)/修改判斷的值,以決定是否進(jìn)行校正。

28、if( 1<inputf&&inputf<=10000)k=(ad0bc1-ad0bc0)/(10000.0- 5000.0);BuChangVpp=inputVpp+(k*inputf+(ad0bc0-5000.0*k);else if(10000<inputf&&inputf<=20000)k=(ad0bc2-ad0bc1)/(20000.0-10000.0);BuChangVpp=inputVpp+(k*inputf+(ad0bc1-10000.0*k);else if(20000<inputf&&inputf

29、<=30000)k=(ad0bc3-ad0bc2)/(30000.0-20000.0);BuChangVpp=inputVpp+(k*inputf+(ad0bc2-20000.0*k);else if(30000<inputf&&inputf<=50000)k=(ad0bc4-ad0bc3)/(40000.0-30000.0);BuChangVpp=inputVpp+(k*inputf+(ad0bc3-30000.0*k);return BuChangVpp;long double ad1BuChang(long double inputVpp,unsigne

30、d int inputf)/(相/頻)度數(shù)補(bǔ)償函數(shù)long double BuChangVpp,k;BuChangVpp=inputVpp;if(1)/修改判斷的值,以決定是否進(jìn)行校正。 if( 1<inputf&&inputf<=10000)k=(ad1bc1-ad1bc0)/(10000.0- 5000.0);BuChangVpp=inputVpp+(k*inputf+(ad1bc0-5000.0*k);else if(10000<inputf&&inputf<=20000)k=(ad1bc2-ad1bc1)/(20000.0-100

31、00.0);BuChangVpp=inputVpp+(k*inputf+(ad1bc1-10000.0*k);else if(20000<inputf&&inputf<=30000)k=(ad1bc3-ad1bc2)/(30000.0-20000.0);BuChangVpp=inputVpp+(k*inputf+(ad1bc2-20000.0*k);else if(30000<inputf&&inputf<=50000)k=(ad1bc4-ad1bc3)/(40000.0-30000.0);BuChangVpp=inputVpp+(k*i

32、nputf+(ad1bc3-30000.0*k);return BuChangVpp;【這就是個(gè)延時(shí)函數(shù),沒(méi)什么好看的了。】void delaywateAD9854(unsigned int delaynum,unsigned int delaycount)/自定義雙層嵌套延時(shí)。while(delaycount-)while(delaynum-);【其實(shí),這個(gè)主入口就是在不斷的檢測(cè)按鍵嘛,然后響應(yīng)不同的case執(zhí)行。】/Main re-act */這時(shí)系統(tǒng)的主函數(shù),進(jìn)入的接口:void sysfuntion(unsigned char key)if (0!=key) switch(key)【按

33、鍵1,2控制的是頻率和幅度的加或減】case 1: Clear();if(AorF)switch(wei)case 4:if(a/1000)%10<4)a+=1;break;case 3:if(a/1000)%10<4)a+=10;break;case 2:if(a/1000)%10<4)a+=100;break;case 1:if(a/1000)%10<4)a+=1000;break;/case 0:if(a/10000)%10<4)a+=10000;break;default:break;fun_ok(); elseswitch(wei)case 4:if(f

34、/10000)%10<5)f+=1;break;case 3:if(f/10000)%10<5)f+=10;break;case 2:if(f/10000)%10<5)f+=100;break;case 1:if(f/10000)%10<5)f+=1000;break;case 0:if(f/10000)%10<5)f+=10000;break;default:break; fun_ok(); break;case 2: Clear();if(AorF)switch(wei)case 4:if(a>1)a-=1;break;case 3:if(a>10

35、)a-=10;break;case 2:if(a>100)a-=100;break;case 1:if(a>1000)a-=1000;break;/case 0:if(a>1)a-=10000;break;default:break; fun_ok(); elseswitch(wei)case 4:if(f>1)f-=1;break;case 3:if(f>10)f-=10;break;case 2:if(f>100)f-=100;break;case 1:if(f>1000)f-=1000;break;case 0:if(f>10000)f-=

36、10000;break;default:break;fun_ok(); break;【按鍵3,4控制的是下標(biāo)表示位數(shù)的左移或右移】case 3: Clear();if(wei>(0)wei-=1;fun_ok();break;case 4: Clear();if(wei<(4)wei+=1;fun_ok();break;【改變bit:AorF,區(qū)分在顯示和加減的時(shí)候?qū)?yīng)操作是頻率或者幅度。】case 5: Clear();AorF=!AorF;fun_ok();break; case 6: Clear(); /該按鈕完成【正弦波按參數(shù)“頻率”“幅度”輸出】功能【】DrawcharS

37、("Sin:",0,0);DrawcharS("Vpp=",1,2);drawint(a,1,6);DrawcharS("mV",1,11); DrawcharS("Fre=",2,2);drawint(f,2,6);DrawcharS("kHz",2,11); /測(cè)試正弦波,采用120MHZ SYSCLK時(shí),出來(lái)10MHZ波形,波形很好,測(cè)試成功/當(dāng)采用300MHZ SYSCLK時(shí),測(cè)試50MHZ波形時(shí),DDS發(fā)熱厲害,且波形衰減嚴(yán)重,幅度在35mV左右AD9854_Init();/輸出的幅度

38、 a mV = (x/4095)*5000mV 那么設(shè)置的參數(shù) x 應(yīng)當(dāng)為 a*(4095/5000)AD9854_SetSine(unsigned long)(f*1000.0),(int)(a*Vppadjust);while(1)if(6=KeyScan()|5=KeyScan()Clear();fun_ok();break;break; case 7: Clear();/該按鈕完成【點(diǎn)頻輸出,通過(guò)系統(tǒng)后,輸入AD后計(jì)算“相位”和“參數(shù)k”】功能if(0=JiaoZhunBit)DrawcharS("No ReSeted!",1,1);while(1)if(0!=Ke

39、yScan()Clear();fun_ok();break;break; DrawcharS("Waiting.",1,1); DrawcharS("Wave Outputing",2,2); AD9854_Init();AD9854_SetSine(unsigned long)(f*1000.0),(int)(a*Vppadjust);delaywateAD9854(5000,5);/*=延時(shí)=*/Clear();drawint(a,0,0);DrawcharS("mV/",0,5); drawint(f,0,8);Drawchar

40、S("kHz",0,13);/輸出額定幅度和頻率的正弦波 【case7完成的是點(diǎn)頻功能接的是直通網(wǎng)絡(luò)時(shí)候,任意頻率都是接近0度。接的RLC時(shí)候,29.8MHz時(shí)候,度數(shù)為-21.52度。衰減7db。】/*AIN0采集電壓*/ADC0_Init(0,1);ADC0_Enable();count=0;while(count<5)tmpcount=returnADC0value();count+;ADC0_Disable();/while(1)if(5=ADCcount)ADC0_Disable();break;/等待采樣滿足5個(gè)點(diǎn),就【停止AD轉(zhuǎn)換】【跳出采樣】。/從0.

41、2V-2.4V我們測(cè)試的數(shù)據(jù)表明,可以用如下公式將AD轉(zhuǎn)換得到的Value換算成電壓值/公式:y=0.591238914x-3.386186509adtmp=mid5(tmp0,tmp1,tmp2,tmp3,tmp4); ad0=0.0;if(adtmp<240) DrawcharS("TooSmall",1,0); /else if(adtmp>4094)DrawcharS("TooBig",1,0); else /ad0=(0.591238914*adtmp-3.386186509);ad0=GNDBuChang+(0.591238914

42、*adtmp-3.386186509);/這里因?yàn)榻拥仉妷翰唤y(tǒng)一的緣故,補(bǔ)償10mv。 /if(adtmp>4094)ad0=2500; ad0=ad0BuChang(ad0,f);/*電壓*自動(dòng)校準(zhǔn)*/ drawsignedint(int)ad0,1,0); DrawcharS("mV",1,5);ad0=(ad0-VppPianZhiValue)/VppFangDaBeiShu);drawsignedint(int)ad0,2,0);DrawcharS("mV",2,5); /*AIN1采集電壓*/ADC0_Init(1,1);ADC0_Ena

43、ble();count=0;while(count<5)tmpcount=returnADC0value();count+;ADC0_Disable();/while(1)if(5=ADCcount)ADC0_Disable();break;/等待采樣滿足5個(gè)點(diǎn),就【停止AD轉(zhuǎn)換】【跳出采樣】。/從0.2V-2.4V我們測(cè)試的數(shù)據(jù)表明,可以用如下公式將AD轉(zhuǎn)換得到的Value換算成電壓值/公式:y=0.591238914x-3.386186509adtmp=mid5(tmp0,tmp1,tmp2,tmp3,tmp4); ad1=0.0;if(adtmp<240) DrawcharS

44、("TooSmall",1,8); /else if(adtmp>4094)DrawcharS("TooBig",1,8); else /ad1=(0.591238914*adtmp-3.386186509); ad1=GNDBuChang+(0.591238914*adtmp-3.386186509);/這里因?yàn)榻拥仉妷翰唤y(tǒng)一的緣故,補(bǔ)償10mv。 /if(adtmp>4094)ad1=2500; ad1=ad1BuChang(ad1,f);/*電壓*自動(dòng)校準(zhǔn)*/ drawsignedint(int)ad1,1,8); DrawcharS(

45、"mV",1,13);ad1=(ad1-VppPianZhiValue)/VppFangDaBeiShu);drawsignedint(int)ad1,2,8);DrawcharS("mV",2,13); /*end*/if(0.0!=ad0 && 0.0!=ad1) /* 顯示相位 */ /*cosFi=(ad0)/sqrt(ad0)*(ad0)+(ad1)*(ad1);*/sinFi=0.0-(ad1)/sqrt(ad0)*(ad0)+(ad1)*(ad1);/drawfloat2_2(acos(cosFi),3,8); /Drawc

46、harS("Hu",3,13);/*Du=180*(acos(cosFi)/3.1415926;*/Du=180*(asin(sinFi)/3.1415926;/Du=DuBuChang(Du,f);/*drawfloat2_2(Du,3,8);*/*DrawcharS("Du",3,13); */drawsignedfloat2_2(Du,3,8);DrawcharS("Du",3,14);/* 顯示參數(shù) k */*K=(32.0*ad0*0.001/cosFi)/(a*0.001*a*0.001);*/K=0.0-(32.0*ad

47、1*0.001/sinFi)/(a*0.001*a*0.001);K=10.0*log10(K);/drawint(int)K,3,0); drawsignedfloat2_2(K,3,0);DrawcharS("dB",3,6);elseDrawcharS("Input Error!",3,0); /* 按鍵退出 */while(1)if(7=KeyScan()|5=KeyScan()Clear();fun_ok();break;break; case 8: AD9854_Init();【上圖:】redodrawpic:Clear();/該按鈕完成【畫

48、頻率特性圖】功能DrawcharS("PicingOktoExit",0,0);DrawcharS("Up/6Fi(Du)",1,0);DrawcharS("Down/7K(dB)",2,0);DrawcharS("RightReSet",3,0);cmd='4'【總共6個(gè)選項(xiàng),1,6鍵分別畫40K-400M和6M-30M的相頻曲線,2,7鍵分別畫40K-400M和6M-30M的幅頻曲線,右鍵運(yùn)行自動(dòng)校準(zhǔn)程序,5(ok)鍵退出】while(1)/畫圖菜單選擇if(5=KeyScan()cmd=

49、9;5'Clear();fun_ok();break;else if(4=KeyScan()cmd='4'Clear();break;else if(1=KeyScan()Clear();DrawcharS("Du",2,14); for(count=0;count<100;count+)DrawPoint(5+count,32);if(0=(count+1)%5)DrawPoint(5+count,31);DrawPoint(5+count,33);cmd='1'break; else if(2=KeyScan()Clear(

50、);DrawcharS("dB",2,14); for(count=0;count<100;count+)DrawPoint(5+count,58);if(0=(count+1)%5)DrawPoint(5+count,57);DrawPoint(5+count,59);cmd='2'break;else if(6=KeyScan()Clear(); DrawcharS("Du",2,14); for(count=0;count<120;count+)DrawPoint(5+count,32);if(0=(count+1)%5

51、)DrawPoint(5+count,31);DrawPoint(5+count,33);cmd='6'break;else if(7=KeyScan()Clear();DrawcharS("dB",2,14); for(count=0;count<120;count+)DrawPoint(5+count,58);if(0=(count+1)%5)DrawPoint(5+count,57);DrawPoint(5+count,59);cmd='7'break;elsecmd='5'/結(jié)束畫圖菜單選擇/*/switch (cmd)/exit bitcase '1': case '2':【】/*如果沒(méi)有自動(dòng)校準(zhǔn),則功能不可使用*/if(0=JiaoZhunBit) Clear();DrawcharS("No ReSeted!",1,1);while(1)if(0!=KeyScan()Clear();fun_ok();break;break; /*結(jié)束判斷*/ if('

溫馨提示

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

評(píng)論

0/150

提交評(píng)論