第7章-數(shù)字頻率合成器的設(shè)計課件_第1頁
第7章-數(shù)字頻率合成器的設(shè)計課件_第2頁
第7章-數(shù)字頻率合成器的設(shè)計課件_第3頁
第7章-數(shù)字頻率合成器的設(shè)計課件_第4頁
第7章-數(shù)字頻率合成器的設(shè)計課件_第5頁
已閱讀5頁,還剩195頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章數(shù)字頻率合成器的設(shè)計

7.1設(shè)計任務(wù)

7.2設(shè)計方案論證

7.3系統(tǒng)硬件設(shè)計

7.4系統(tǒng)軟件設(shè)計

7.5系統(tǒng)設(shè)計總結(jié)第7章數(shù)字頻率合成器的設(shè)計 7.1設(shè)計任務(wù)1

7.1設(shè)計任務(wù) 設(shè)計一個數(shù)字頻率合成器,該數(shù)字頻率合成器的輸出信號波形為正弦波,輸出信號的頻率為f0=0~1MHz,頻率最小步進間隔為0.08Hz,輸出電壓峰—峰值為Up-p=0.3~5V,供電電源為+5V。7.1設(shè)計任務(wù) 設(shè)計一個數(shù)字頻率合成器,該數(shù)字頻率合27.2設(shè)計方案論證 7.2.1MCU和鎖相環(huán)路相結(jié)合的實現(xiàn)方案 MCU和鎖相環(huán)路相結(jié)合的實現(xiàn)方案如圖7.1所示。圖中,在基本鎖相環(huán)路的反饋支路中接入了具有高分頻比的可變分頻器,用MCU控制分頻器的分頻比就可得到若干個標(biāo)準頻率輸出。為了得到所需的頻率間隔,往往在電路中還加入一個前置分頻器。

7.2設(shè)計方案論證 7.2.1MCU和鎖相環(huán)路相結(jié)合3圖7.1MCU和鎖相環(huán)路相結(jié)合的實現(xiàn)方案電路框圖圖7.1MCU和鎖相環(huán)路相結(jié)合的實現(xiàn)方案電路框圖4 1.前置分頻器分頻比的確定 由得,故 Δf=f0(N+1)-f0(N)= 式中Δf為頻率間隔。 由得,若f0的范圍為f0min~f0max,則N對應(yīng)有Nmin~Nmax。 7.2.2MCU和DDS芯片相結(jié)合的實現(xiàn)方案 DDS的基本原理是利用采樣定理,通過查表法產(chǎn)生波形。DDS的結(jié)構(gòu)有很多種,其基本的電路原理可用圖7.2表示。 1.前置分頻器分頻比的確定5圖7.2DDS的原理框圖圖7.2DDS的原理框圖6 相位累加器由N位加法器與N位累加寄存器級聯(lián)構(gòu)成。每來一個時鐘脈沖fs,加法器將頻率控制字k與累加寄存器輸出的累加相位數(shù)據(jù)相加,把相加后的結(jié)果送至累加寄存器的數(shù)據(jù)輸入端。累加寄存器將加法器在上一個時鐘脈沖作用后所產(chǎn)生的新相位數(shù)據(jù)反饋到加法器的輸入端,以使加法器在下一個時鐘脈沖的作用下繼續(xù)與頻率控制字相加。這樣,相位累加器在時鐘作用下,不斷對頻率控制字進行線性相位累加。由此可以看出,相位累加器在每一個時鐘脈沖輸入時,把頻率控制字累加一次,相位累加器輸出的數(shù)據(jù)就是合成信號的相位,相位累加器的溢出頻率就是DDS輸出的信號頻率。

相位累加器由N位加法器與N位累加寄存器級聯(lián)構(gòu)成。每來一個7 用相位累加器輸出的數(shù)據(jù)作為波形存儲器(ROM)的相位取樣地址,這樣就可把存儲在波形存儲器內(nèi)的波形抽樣值(二進制編碼)經(jīng)查表查出,完成相位到幅值的轉(zhuǎn)換。波形存儲器的輸出送到D/A轉(zhuǎn)換器,D/A轉(zhuǎn)換器將數(shù)字量形式的波形幅值轉(zhuǎn)換成所要求合成頻率的模擬信號。低通濾波器用于濾除不需要的取樣分量,以便輸出頻譜純凈的正弦波信號。 利用MCU和DDS芯片相結(jié)合的實現(xiàn)方案如圖7.3所示。 用相位累加器輸出的數(shù)據(jù)作為波形存儲器(ROM)的相位取樣8圖7.3MCU和DDS芯片相結(jié)合的電路框圖圖7.3MCU和DDS芯片相結(jié)合的電路框圖97.3系統(tǒng)硬件設(shè)計

7.3.1單片機與AD9835接口電路設(shè)計 1.AD9835原理及結(jié)構(gòu) 1)DDS工作原理7.3系統(tǒng)硬件設(shè)計 7.3.1單片機與AD9835接口10

AD9835中使用的DDS技術(shù)從連續(xù)信號的相位φ出發(fā),將一個余弦信號取樣、量化、編碼,形成一個余弦函數(shù)表存儲在ROM中。合成時改變相位增量,由于相位增量不同,一個周期內(nèi)的取樣點數(shù)也不同,這樣產(chǎn)生的正弦信號頻率也就不同,從而達到頻率合成的效果。 在這里,余弦波信號本身是非線性的,而其相位是線性的(如圖7.4所示)。 AD9835中使用的DDS技術(shù)從連續(xù)信號的相位φ出發(fā)11圖7.4余弦波信號及其相位圖7.4余弦波信號及其相位12 因此,每隔一段時間Δt(時鐘周期),有對應(yīng)的相位變化ΔP,即 ΔP=ωΔt=2πfΔt(7.1) 從式(7.1)可得合成信號的頻率f為 (7.2)

式中,fmt為固定時鐘頻率,fmt=1/Δt。因此,通過改變相位值ΔP,就可以改變合成信號的頻率f。 因此,每隔一段時間Δt(時鐘周期),有對應(yīng)的相位變化Δ13 DDS芯片AD9835的原理框圖如圖7.5所示。其中,相位累加器為32位,取其高12位作為讀取余弦波形存儲器的地址。當(dāng)時鐘使相位累加器的輸出也即余弦ROM尋址地址每遞增頻率設(shè)定為K時,對應(yīng)的波形相位變化為(7.3) DDS芯片AD9835的原理框圖如圖7.5所示。其14圖7.5AD9835的原理框圖圖7.5AD9835的原理框圖15 因此,改變相位累加器設(shè)定值K,就可以改變相位值ΔΡ,從而改變合成信號頻率f。 經(jīng)簡化,合成信號頻率可由下式?jīng)Q定: 式中,fmt=50MHz,由高穩(wěn)定度晶體振蕩器獲得,K值在1<K<232之間,最低頻率fmin=fmt/232,為0.0116Hz,這就是頻率合成器的頻率分辨率。根據(jù)Nyquist采樣定律可知,重建信號頻率最高可達fmt/2,但通常取最高頻率fmax=fmt/3。

(7.4)

因此,改變相位累加器設(shè)定值K,就可以改變相位值ΔΡ,16

2)AD9835芯片內(nèi)部結(jié)構(gòu) AD9835內(nèi)部結(jié)構(gòu)框圖如圖7.6所示,它有一個32位相位累加器,兩個32位頻率寄存器F0和F1(用于設(shè)定K值),四個12位相位寄存器P0、P1、P2、P3。程控切換F0、F1時,可實現(xiàn)相位PSK調(diào)制。余弦函數(shù)表存儲在ROM中。 32位相位累加器的輸出值截取高12位后與12位相位寄存器Pi值相加,構(gòu)成12位的相位地址,去尋址余弦ROM表,尋址得到的幅度值經(jīng)10位的高速D/A轉(zhuǎn)換后成為合成余弦信號。輸出信號總諧波分量的畸變量與時鐘頻率和輸出信號頻率之比m=fmt/f有關(guān),m值愈大,諧波畸變愈小;m值最小時,諧波畸變最大。為消除m值較小時的諧波畸變,輸出端采用LC高階低通濾波器濾除高次諧波。在設(shè)計中采用5階Butterworth低通濾波器,可以將50MHz以上的高次諧波功率降低60dB,可完全滿足高精度信號源的要求。

2)AD9835芯片內(nèi)部結(jié)構(gòu)17圖7.6AD9835內(nèi)部結(jié)構(gòu)框圖圖7.6AD9835內(nèi)部結(jié)構(gòu)框圖18 3)引腳說明 AD9835引腳功能說明如表7.1所示。

3)引腳說明19表7.1AD9835引腳功能說明

表7.1AD9835引腳功能說明20 4)命令及控制寄存器說明 AD9835的命令及控制寄存器說明見表7.2~表7.8。 4)命令及控制寄存器說明21表7.2控制寄存器

表7.2控制寄存器22表7.3控制寄存器地址

表7.3控制寄存器地址23表7.4命令

表7.4命令24表7.5控制AD9835表7.5控制AD983525表7.6寫數(shù)據(jù)到寄存器

表7.6寫數(shù)據(jù)到寄存器26表7.7設(shè)置SYNC、SELSRC表7.7設(shè)置SYNC、SELSRC27表7.8開關(guān)、復(fù)位、清零

表7.8開關(guān)、復(fù)位、清零28 引腳PSELSCT、PSEL0、PSEL1是外加調(diào)制信號,可用于對DDS進行直接位控調(diào)制,實現(xiàn)數(shù)字二值調(diào)頻(FSK)和數(shù)字四值調(diào)相(PSK)。引腳FSYNC、SCLK、SDATA用來對DDS進行程控工作模式設(shè)定。數(shù)據(jù)傳輸方式為同步串行方式。AD9835可以設(shè)定為SLEEP、RESET工作方式。在SLEEP工作方式下,功耗為1.75mW。

引腳PSELSCT、PSEL0、PSEL1是外加調(diào)29 2.AD9835的典型應(yīng)用電路 如圖7.7所示,REFIN與REFOUT相連接,則參考電壓為1.21V。在引腳REFIN接一個10nF電容到地。時鐘電路由U2構(gòu)成,U2為50MHz晶體振蕩信號源。SCLK、SDATA、FSYNC與單片機的P1.0、P1.1、P1.2引腳相連,為AD9835提供命令和頻率寄存器中的數(shù)據(jù),以便實現(xiàn)信號頻率的設(shè)置和初相位的設(shè)置。信號輸出端IOUT接5階ButterworthLC低通濾波器,通帶截止頻率為12MHz,阻帶截止頻率為25MHz,阻帶衰減大于60dB。

2.AD9835的典型應(yīng)用電路30圖7.7AD9835應(yīng)用電路圖圖7.7AD9835應(yīng)用電路圖31 7.3.2單片機及按鍵電路設(shè)計 1.AT89C2051的主要性能及引腳功能說明 AT89C2051的引腳如圖7.8所示。AT89C2051的性能如下: (1)和MCS-51產(chǎn)品兼容。 (2)2K字節(jié)可重編程閃速存儲器。 (3)1000寫/擦除周期。 (4)2.7~6V的操作范圍。 (5)全靜態(tài)操作:0~24MHz。 (6)兩級加密程序存儲器。

7.3.2單片機及按鍵電路設(shè)計32圖7.8AT89C2051的引腳圖圖7.8AT89C2051的引腳圖33 (7)128×8位內(nèi)部RAM。 (8)兩個16位定時器/計數(shù)器。 (9)六個中斷源。 (10)編程串行UART通道。 (11)直接LED驅(qū)動輸出,I/O引腳緩沖器可吸收20mA電流。 (12)一個片內(nèi)模擬比較器。 (13)低功耗空載和掉電方式。 (14)15根可編程I/O引線。 (7)128×8位內(nèi)部RAM。34 2.單片機按鍵電路設(shè)計 如圖7.9所示,單片機采用Atmel公司的89C2051。在XTAL.1和XTAL.2之間并聯(lián)12MHz晶振,XTAL.1和XTAL.2分別與地之間接27pF電容,為單片機提供12MHz時鐘。單片機的機器周期為1μs。 2.單片機按鍵電路設(shè)計35圖7.9單片機及按鍵電路圖圖7.9單片機及按鍵電路圖36 復(fù)位電路采用X5045芯片。當(dāng)程序“跑飛”時,看門狗芯片X5045將單片機復(fù)位,從而保證系統(tǒng)能夠正常運行。 4個按鍵中,S1為上鍵,S2為下鍵,S3為左鍵,S4為右鍵。系統(tǒng)通過4個按鍵對信號輸出頻率進行設(shè)定。上鍵S1增大頻率步進間隔,下鍵S2減小頻率步進間隔,左鍵S3按照所設(shè)定的頻率步進間隔減小信號的輸出頻率,右鍵S4按照所設(shè)定的頻率步進間隔增大信號的輸出頻率。平時引腳在上拉電阻作用下保持高電平,當(dāng)按鍵按下時,把引腳拉為低電平,通過程序來判斷按鍵并實現(xiàn)相應(yīng)的功能。頻率間隔與對應(yīng)值如表7.9所示。

復(fù)位電路采用X5045芯片。當(dāng)程序“跑飛”時,看門狗芯片37表7.9頻率間隔與對應(yīng)值表

表7.9頻率間隔與對應(yīng)值表38 7.3.3顯示電路設(shè)計 1.PS7219基本原理 PS7219是一個高性能、低價格的多位LED顯示驅(qū)動器。PS7219是武漢力源公司的產(chǎn)品,它在性能上完全兼容國外的產(chǎn)品MAX7219,并且還增添了位閃等功能。其接口采用流行的同步串行外設(shè)接口(SPI),可與任何一種單片機方便地接口,并可同時驅(qū)動八位共陰極LED數(shù)碼管或64只獨立LED發(fā)光二極管。PS7219A型內(nèi)置一個可靠的μP監(jiān)控電路,可為外部提供一個脈寬大于140ms、觸發(fā)門限典型值為4.63V的高電平復(fù)位信號。 7.3.3顯示電路設(shè)計39圖7.10PS7219引腳圖圖7.10PS7219引腳圖40 PS7219內(nèi)部具有15×8bitRAM功能控制寄存器,可方便尋址,對每位數(shù)字可單獨控制,刷新不需重寫整個顯示器。顯示亮度可數(shù)字控制,每位都具有閃爍使能控制位,引腳CON置高電平,可禁止所有顯示,達到降低功耗的效果,但同時并不影響對控制寄存器的修改。PS7219還有一個掉電模式、一個允許用戶選擇從1位數(shù)顯示到8位數(shù)顯示的掃描界限寄存器和一個強迫所有LED接通的測試模式。N個PS7219級聯(lián),可實現(xiàn)N×8位LED數(shù)碼管的顯示。 PS7219的應(yīng)用很廣泛,例如條形圖顯示、7段顯示、工業(yè)控制、儀表控制面板、LED模型顯示等。 PS7219是共陰極LED顯示驅(qū)動器,采用24腳DIP和SO兩種封裝,其引腳排列如圖7.10所示。 PS7219內(nèi)部具有15×8bitRAM功能控制寄存41 2.顯示部分電路設(shè)計 如圖7.11所示,PS7219與AT89C2051的連接為:RST、LOAD、DIN、CLK分別與單片機的RESET、P3.3、P3.4、P3.5相連,通過串行連接方式,單片機把命令和要顯示的數(shù)據(jù)傳送給PS7219。八位數(shù)碼管用來顯示信號發(fā)生器的輸出頻率,其中六位為整數(shù)部分,兩位為小數(shù)部分。即頻率最小顯示分辨率為0.01Hz,最大輸出頻率為999999.99Hz。

2.顯示部分電路設(shè)計42圖7.11顯示電路原理圖圖7.11顯示電路原理圖43 7.3.4系統(tǒng)總體電路圖 系統(tǒng)總體電路圖如圖7.12所示。圖中,運放AD817構(gòu)成輸出信號幅度調(diào)節(jié)電路。

7.3.4系統(tǒng)總體電路圖44圖7.12系統(tǒng)整體電路圖圖7.12系統(tǒng)整體電路圖457.4系統(tǒng)軟件設(shè)計 7.4.1概述 整個軟件采用模塊化程序設(shè)計,用C語言編程,便于移植,可讀性強,主要分為顯示模塊disp.c、dds模塊ad9835.c、看門狗模塊x5045.c及主模塊mainpr.c。改變頻率時,僅需要改變FREGO寄存器的值,就可以改變輸出頻率,輸出頻率(7.5)

7.4系統(tǒng)軟件設(shè)計 7.4.1概述(7.5)46 因此寄存器值為 通過按鍵S1、S2、S3、S4可改變輸出信號頻率,結(jié)合軟件設(shè)計完成按鍵的功能。 7.4.2程序主模塊 程序主模塊負責(zé)鍵掃描及其他模塊的調(diào)用,其框圖如圖7.13所示。程序主模塊(mainpr.c)的源代碼如下。(7.6) 因此寄存器值為(7.6)47圖7.13程序主模塊框圖圖7.13程序主模塊框圖48 #include<89c2051.h> #includeintrins.h> #defineucharunsignedchar #defineuintunsignedint #defineushortunsignedshort #defineulongunsignedlong #include<89c2051.h>49

uchardatams_10; uchardatams_20; uchardatams_100; uchardatamdelay; ucharkeyolddata; ulongdatafrqvalue; uchardatafrqstepvalue; /*設(shè)置數(shù)碼管顯示"0","1","2","3","4","5","6","7","8" "9","-"(中),"-"(上),"_"(下)對應(yīng)數(shù)據(jù)*/ ucharcodeled_buf[14]={0X7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x01,

uchardatams_10;50

0x40,0x08,0x00}; voidstart_prg(); voidinterrupt_set(void); voiddelay(uintx); voidKey_Handle(); uintbinarytobcd(uintx); uintbcdtobinary(uintx); externinitad9835(); externopen_watchdog(); externwatch_dog(); externdisp_data(void); /*=========================== 0x40,0x08,0x00};51 TIMER0interrupt;20ms ============================*/ voidtimer0()interrupt1using1 {TH0=256-(20000/256);TL0=256-(20000%256);ms_10++;ms_20++; if(ms_10++>=10){ms_10=0;ms_100++} } /*===========================*/ TIMER0interrupt;20ms52 main() { start:ms_10=0;ms_20=0;ms_100=0;frqvalue=0x897;frqstepvalue=1;keyolddata=0xf0; main()53 sclk=0;dio=1;rst=0;start_prg();interrupt_set();delay(100);open_watchdog();delay(100);watch_dog();/*=========================*/ sclk=0;54

for(;;){if(ms_20>=2){Key_Handle();ms_20=0;}if(ms_100>=1)/*100ms*/{ms_100=0;watch_dog();}}} for(;;)55 /*===============================*/ voiddelay(uintx) {uchari; while(x-->0){for(i=0;i<125;i++){;}} } /*===========================56 voidstart_prg(){Init_Led();initad9835();} /*================================*/ voidstart_prg()57 voidinterrupt_set() { TMOD=0x21;SCON=0x50; TH0=256-(10000/256); TL0=256-(10000%256); TR0=1; ET0=1; EA=1; } voidinterrupt_set()58 voidKey_Handle() { uchardatakeydata; keydata=P1&0xf0; if((keydata==0xf0)&&(keyolddata==0xf0))return; elseif((keydata==0xf0)&&(keyolddata!=0xf0))/*有鍵按下*/

voidKey_Handle()59 { switch(keyolddata) { case0x70:upaddfrq();break; {60 case0xb0:downsubfrq();break;case0xd0:upstep();break;case0xe0:downstep();break;default:keyolddata=0xf0;}} case0xb0:61elsekeyolddata=keydata;} } voidupaddfrq() {uchardisp_buf[8];switch(frqstepvalue){case0:if(frqvalue<0xffffffff-0xdc)elsekeyolddata=keydata;62 {frqvalue=frqvalue+0xdc;disp_buf[0]=0;disp_buf[1]=0;disp_buf[2]=0;disp_buf[3]=0;disp_buf[4]=0;disp_buf[5]=0;disp_buf[6]=0;disp_buf[7]=0;/*顯示緩沖區(qū)放待顯示數(shù)據(jù)*/disp_data();} {63case1:if(frqvalue<0x897){frqvalue=frqvalue-0x897;disp_buf[0]=0;disp_buf[1]=0;disp_buf[2]=0;disp_buf[3]=0;disp_buf[4]=0;disp_buf[5]=0;disp_buf[6]=0;disp_buf[7]=0;disp_data();}}}case1:64

p() { if(frqstepvalue<7) {frqstepvalue++;disp_data(); } } downstep() { if(frqstepvalue<0) {frqstepvalue--;disp_data(); } } p()65 7.4.3顯示模塊 顯示模塊完成對PS7912的控制。顯示模塊(disp.c)的源代碼如下。

#include<89c2051.h> #includeintrins.h> sbitdin=P3^4; sbitclk=P3^5; sbitcs=P3^3; externuchardisp_buf[8]; externucharcodeled_buf[13]; /*=================================*/ 7.4.3顯示模塊66 /*FUNCTIONdefine*/ /*=================================*/ voidInit_Led(void); voidTest_led(void); voidWriteLed(ucharcombyte,uchardata0); voidWriteLe(ucharcombyte,uchardata0); voidWriteLed0(uchardata1); voidWriteLedx0(uchardata1); voiddisp_data(void); ucharbcd_byte(ucharx); ucharbyte_bcd(ucharx); /*FUNCTIONdefine*/67/*初始化數(shù)碼管顯示===================*/voidInit_Led(void){ucharcombyte,data0;combyte=0xff;data0=0x00;WriteLe(combyte,data0); /*控制顯示測試為正常方式*/combyte=0xfc;data0=0x01;WriteLe(combyte,data0); /*控制關(guān)閉模式為正常方式*//*初始化數(shù)碼管顯示===================68 combyte=0xfb;data0=0x07;WriteLe(combyte,data0); /*控制為8位數(shù)碼管顯示*/combyte=0xfa;data0=0x00;WriteLe(combyte,data0); /*控制顯示強度為1/32*/combyte=0xf9;data0=0x00;WriteLe(combyte,data0); /*控制顯示為非編碼方式*/} combyte=0xfb;data0=0x07;69

/*=================================*/ voidTest_Led(void) { uchari,combyte,data0; combyte=0xf1;data0=1; for(i=1;i<=8;i++) { WriteLed(combyte,led_buf[data0]); combyte++;data0++; } } /*=================================*/ /*==========================70voidWriteLed(ucharcombyte,uchardata0){WriteLed0(combyte);WriteLedx0(data0);cs=1;}voidWriteLe(ucharcombyte,uchardata0){WriteLed0(combyte);WriteLed0(data0);cs=1;}voidWriteLed(ucharcombyte,uc71 /*=================================*/ voidWriteLedx0(uchardata1) {cs=0;ACC=data1;din=a3;clk=1;_nop_();clk=0;din=a4;clk=1;_nop_();clk=0;din=a7;clk=1;_nop_();clk=0;din=a2;clk=1;_nop_();clk=0;din=a1;clk=1;_nop_();clk=0;din=a0;clk=1;_nop_();clk=0;din=a5;clk=1;_nop_();clk=0;din=a6;clk=1;_nop_();clk=0;} /*==========================72

/*=================================*/ voidWriteLed0(uchardata1) {cs=0;ACC=data1;din=a7;clk=1;_nop_();clk=0;din=a6;clk=1;_nop_();clk=0;din=a5;clk=1;_nop_();clk=0;din=a4;clk=1;_nop_();clk=0;din=a3;clk=1;_nop_();clk=0;din=a2;clk=1;_nop_();clk=0;din=a1;clk=1;_nop_();clk=0;din=a0;clk=1;_nop_();clk=0; } /*==========================73/********************************/voiddisp_data(void){uchari,combyte;combyte=0xf1;for(i=0;i<=7;i++){WriteLed(combyte,disp_buf[i]);combyte++;}}/*****************************74 ucharbcd_byte(ucharx){uchary,z;z=x;y=(x>>4)&0x0f;y=y*10;x=z&0x0f;y=y+x;return(y);} ucharbcd_byte(ucharx)75 ucharbyte_bcd(ucharx){uchary,z;z=x;y=x/10;y=y<<4;x=(z%10)&0x0f;y=y|x;return(y);} ucharbyte_bcd(ucharx)76 7.4.4看門狗模塊 看門狗模塊完成對x5045的控制??撮T狗模塊(x5045.c)的源代碼如下。

#include<89c2051.h> #includeintrins.h> #defineucharunsignedchar #defineuintunsignedint #defineushortunsignedshort 7.4.4看門狗模塊77 sbitSO=P3^0;/*usedforserialoutput*/ sbitSI=P3^2;/*usedforserialinput*/sbitSCK=P3^1;/*usedforserialclock*/sbitCS=P1^3;/*usedforserialchoice*/ #defineWREN_INST0x06/*Writeenablelatchinstruction(WREN)*/ #defineWRDI_INST0x04/*Writedisablelatchinstruction(WRDI)*/ sbitSO=P3^0;/*usedfors78 #defineWRSR_INST0x01/*Writestatusregisterinstruction(WRSR)*/ #defineRDSR_INST0x05/*Readstatusregisterinstruction(RDSR)*/ #defineWRITE_INST0x02/*Writememoryinstruction(WRITE)*/ #defineREAD_INST0x03/*Readmemoryinstruction(READ)*/

#defineWRSR_INST0x0179

#defineSTATUS_REG0x00/*statusregister*/ #defineMAX_POLL0x99 /*Maximumnumberofpolls*/ /*================================sendingabytetoEEPROM =================================*/ voidoutbyt(ucharaadata) { ucharx; for(x=0;x<8;x++) {SCK=0; if((aadata&0x80)==0)SI=0; #defineSTATUS_REG0x0080

elseSI=1;_nop_();SCK=1;aadata=aadata<<1;}SI=0; } /*================================ ;*Name:WREN_CMD ;*Description:Setwriteenablelatch ;*Function:Thisroutinesendsthecommandtoenablewritesto ;*theEEPROMmemoryarrayorstatusregister elseSI=1;81 =================================*/ voidwren_cmd(void) {SCK=0;/*BringSCKlow*/CS=0;/*Bring/CSlow*/outbyt(WREN_INST);SCK=0;/*BringSCKlow*/CS=1;/*Bring/CShigh*/ } /*================================= ============================82 ;*Name:RDSR_CMD ;*Description:ReadStatusRegister ;*Function:Thisroutinesendsthecommandtoreadthestatusregister ;*Calls:outbyt,inbyt ==================================*/ ucharrdsr_cmd() ;*Name:RDSR_CMD83{ucharx; SCK=0;CS=0; outbyt(RDSR_INST); x=inbyt(); SCK=0;CS=1; return(x);}{ucharx;84 /*================================ ;*Name:WIP_POLL ;*Description:Write-In-ProgressPolling ;*Function:Thisroutinepollsforcompletionofanonvolatilewrite ;*cyclebyexaminingtheWIPbitofthestatusregister =================================*/ /*==========================85 voidwip_poll() {ucharx; for(x=0;x<MAX_POLL;x++) {uchary=rdsr_cmd();if((y&0x01)==0x00)gotoa11;} a11:_nop_(); } voidwip_poll()86/*===============================;*Name:WRSR_CMD;*Description:WriteStatusRegister;*Function:ThisroutinesendsthecommandtowritetheWD0,WD1,BP0;*andBP0EEPROMbitsinthestatusregister================================*/voidwrsr_cmd(ucharreg_status)/*============================87 {wren_cmd();SCK=0;CS=0;outbyt(WRSR_INST);outbyt(reg_status);SCK=0;CS=1;wip_poll();/*Pollforcompletionofwritecycle*/ } {88

voidwatch_dog(void) /*settingthewatchdogtime*/ {CS=1;CS=0;CS=0;CS=1; } voidopen_watchdog() { ucharc; c=rdsr_cmd(); c=c&0xc3;wrsr_cmd(c); } voidwatch_dog(void)89 7.4.5dds模塊 dds模塊完成對ad9835的控制。dds模塊(ad9835.c)的源代碼如下。

#include<89c2051.h> #includeintrins.h> #defineucharunsignedchar #defineuintunsignedint #defineFMIN10 #defineFMIN20 7.4.5dds模塊90 #defineFMIN30 #defineFMIN40xdc /*頻率間隔0.01*/ #defineFA10 #defineFA20 #defineFA38 #defineFA40x97 /*頻率間隔0.1*/ #defineFB10 #defineFB20 #defineFMIN3091

#defineFB30x55 #defineFB40xf6/*頻率間隔1*/ #defineFC10 #defineFC23 #defineFC30x5a #defineFC40xfe/*頻率間隔10*/ #defineFD10 #defineFD20x21 #defineFD30x8d #defineFD40xff/*頻率間隔100*/ #defineFB30x5592#defineFE10#defineFE20x4f#defineFE30x8b#defineFE40x59/*頻率間隔1000*/#defineFF10x01#defineFF20x1b#defineFF30x71#defineFF40x76/*頻率間隔10000*/#defineFE1093 #defineFG10x0a #defineFG20x12 #defineFG30x6e #defineFG40x98/*頻率間隔100000*/ sbitSCLK=P1^0; sbitSDATA=P1^1; sbitFSYNC=P1^2; /*=============================== #defineFG194

sendingacommandtoad9835 ================================*/ voidouttoad9835(ucharcommand,uchardata) { ucharx; for(x=0;x<8;x++) {FSYNC=0; SCLK=0; if((command&0x80)==0)SDATA=0; elseSDATA=1; SCLK=1; command=command<<1; } sendingacommandtoad983595 for(x=0;x<8;x++){SCLK=0;if((data&0x80)==0)SDATA=0;elseSDATA=1;SCLK=1;data=data<<1;}FSYNC=1; } for(x=0;x<8;x++)96

voidwritefrq0(uchardatabuf[4]) {ucharcombyte;uchardatabyte;uchari;combyte=0x30;for(i=0;i<4;i++){databyte=databuf[i];outtoad9835(combyte,databyte);combyte++;}} voidwritefrq0(uchardatabuf[97voidinitad9835();{uchardatacombyte;uchardatadatabyte;uchardatadatabuf[4];combyte=0xd8;databyte=0;outtoad9835(combyte,databyte);/*resetad9835*/combyte=0xb0;databyte=0;voidinitad9835();98

outtoad9835(combyte,databyte);/*setSYNC=1,SELSRC=1*/combyte=0xb0;databyte=0;outtoad9835(combyte,databyte);/*setSYNC=1,SELSRC=1*/databuf[0]=FA1;databuf[1]=FA2;databuf[2]=FA3;databuf[3]=FA4;writefrq0(*databuf);} outtoad9835(combyte,databyte)997.5系統(tǒng)設(shè)計總結(jié) 采用DDS芯片與MCU相結(jié)合實現(xiàn)的數(shù)字頻率合成器,輸出信號可調(diào),最小頻率分辨率為0.02Hz,最高輸出頻率為1MHz,具有非常高的精度和頻率穩(wěn)定性。根據(jù)不同應(yīng)用場合的要求,還可進行功能擴展,如產(chǎn)生調(diào)頻信號、調(diào)相信號等。數(shù)字頻率合成器較之其他形式的頻率合成器,具有頻率間隔小,穩(wěn)定性高等特點,既可作為高精度的合成信號源,也可用于無線通信中的收、發(fā)信機,數(shù)字通信中的載波同步、網(wǎng)同步及調(diào)制解調(diào)電路和電子對抗、電子測量等方面。因此,利用AD9835與AT89C2051相結(jié)合實現(xiàn)的數(shù)字頻率合成器具有重要的應(yīng)用價值。

7.5系統(tǒng)設(shè)計總結(jié) 采用DDS芯片與MCU相結(jié)合實現(xiàn)100第7章數(shù)字頻率合成器的設(shè)計

7.1設(shè)計任務(wù)

7.2設(shè)計方案論證

7.3系統(tǒng)硬件設(shè)計

7.4系統(tǒng)軟件設(shè)計

7.5系統(tǒng)設(shè)計總結(jié)第7章數(shù)字頻率合成器的設(shè)計 7.1設(shè)計任務(wù)101

7.1設(shè)計任務(wù) 設(shè)計一個數(shù)字頻率合成器,該數(shù)字頻率合成器的輸出信號波形為正弦波,輸出信號的頻率為f0=0~1MHz,頻率最小步進間隔為0.08Hz,輸出電壓峰—峰值為Up-p=0.3~5V,供電電源為+5V。7.1設(shè)計任務(wù) 設(shè)計一個數(shù)字頻率合成器,該數(shù)字頻率合1027.2設(shè)計方案論證 7.2.1MCU和鎖相環(huán)路相結(jié)合的實現(xiàn)方案 MCU和鎖相環(huán)路相結(jié)合的實現(xiàn)方案如圖7.1所示。圖中,在基本鎖相環(huán)路的反饋支路中接入了具有高分頻比的可變分頻器,用MCU控制分頻器的分頻比就可得到若干個標(biāo)準頻率輸出。為了得到所需的頻率間隔,往往在電路中還加入一個前置分頻器。

7.2設(shè)計方案論證 7.2.1MCU和鎖相環(huán)路相結(jié)合103圖7.1MCU和鎖相環(huán)路相結(jié)合的實現(xiàn)方案電路框圖圖7.1MCU和鎖相環(huán)路相結(jié)合的實現(xiàn)方案電路框圖104 1.前置分頻器分頻比的確定 由得,故 Δf=f0(N+1)-f0(N)= 式中Δf為頻率間隔。 由得,若f0的范圍為f0min~f0max,則N對應(yīng)有Nmin~Nmax。 7.2.2MCU和DDS芯片相結(jié)合的實現(xiàn)方案 DDS的基本原理是利用采樣定理,通過查表法產(chǎn)生波形。DDS的結(jié)構(gòu)有很多種,其基本的電路原理可用圖7.2表示。 1.前置分頻器分頻比的確定105圖7.2DDS的原理框圖圖7.2DDS的原理框圖106 相位累加器由N位加法器與N位累加寄存器級聯(lián)構(gòu)成。每來一個時鐘脈沖fs,加法器將頻率控制字k與累加寄存器輸出的累加相位數(shù)據(jù)相加,把相加后的結(jié)果送至累加寄存器的數(shù)據(jù)輸入端。累加寄存器將加法器在上一個時鐘脈沖作用后所產(chǎn)生的新相位數(shù)據(jù)反饋到加法器的輸入端,以使加法器在下一個時鐘脈沖的作用下繼續(xù)與頻率控制字相加。這樣,相位累加器在時鐘作用下,不斷對頻率控制字進行線性相位累加。由此可以看出,相位累加器在每一個時鐘脈沖輸入時,把頻率控制字累加一次,相位累加器輸出的數(shù)據(jù)就是合成信號的相位,相位累加器的溢出頻率就是DDS輸出的信號頻率。

相位累加器由N位加法器與N位累加寄存器級聯(lián)構(gòu)成。每來一個107 用相位累加器輸出的數(shù)據(jù)作為波形存儲器(ROM)的相位取樣地址,這樣就可把存儲在波形存儲器內(nèi)的波形抽樣值(二進制編碼)經(jīng)查表查出,完成相位到幅值的轉(zhuǎn)換。波形存儲器的輸出送到D/A轉(zhuǎn)換器,D/A轉(zhuǎn)換器將數(shù)字量形式的波形幅值轉(zhuǎn)換成所要求合成頻率的模擬信號。低通濾波器用于濾除不需要的取樣分量,以便輸出頻譜純凈的正弦波信號。 利用MCU和DDS芯片相結(jié)合的實現(xiàn)方案如圖7.3所示。 用相位累加器輸出的數(shù)據(jù)作為波形存儲器(ROM)的相位取樣108圖7.3MCU和DDS芯片相結(jié)合的電路框圖圖7.3MCU和DDS芯片相結(jié)合的電路框圖1097.3系統(tǒng)硬件設(shè)計

7.3.1單片機與AD9835接口電路設(shè)計 1.AD9835原理及結(jié)構(gòu) 1)DDS工作原理7.3系統(tǒng)硬件設(shè)計 7.3.1單片機與AD9835接口110

AD9835中使用的DDS技術(shù)從連續(xù)信號的相位φ出發(fā),將一個余弦信號取樣、量化、編碼,形成一個余弦函數(shù)表存儲在ROM中。合成時改變相位增量,由于相位增量不同,一個周期內(nèi)的取樣點數(shù)也不同,這樣產(chǎn)生的正弦信號頻率也就不同,從而達到頻率合成的效果。 在這里,余弦波信號本身是非線性的,而其相位是線性的(如圖7.4所示)。 AD9835中使用的DDS技術(shù)從連續(xù)信號的相位φ出發(fā)111圖7.4余弦波信號及其相位圖7.4余弦波信號及其相位112 因此,每隔一段時間Δt(時鐘周期),有對應(yīng)的相位變化ΔP,即 ΔP=ωΔt=2πfΔt(7.1) 從式(7.1)可得合成信號的頻率f為 (7.2)

式中,fmt為固定時鐘頻率,fmt=1/Δt。因此,通過改變相位值ΔP,就可以改變合成信號的頻率f。 因此,每隔一段時間Δt(時鐘周期),有對應(yīng)的相位變化Δ113 DDS芯片AD9835的原理框圖如圖7.5所示。其中,相位累加器為32位,取其高12位作為讀取余弦波形存儲器的地址。當(dāng)時鐘使相位累加器的輸出也即余弦ROM尋址地址每遞增頻率設(shè)定為K時,對應(yīng)的波形相位變化為(7.3) DDS芯片AD9835的原理框圖如圖7.5所示。其114圖7.5AD9835的原理框圖圖7.5AD9835的原理框圖115 因此,改變相位累加器設(shè)定值K,就可以改變相位值ΔΡ,從而改變合成信號頻率f。 經(jīng)簡化,合成信號頻率可由下式?jīng)Q定: 式中,fmt=50MHz,由高穩(wěn)定度晶體振蕩器獲得,K值在1<K<232之間,最低頻率fmin=fmt/232,為0.0116Hz,這就是頻率合成器的頻率分辨率。根據(jù)Nyquist采樣定律可知,重建信號頻率最高可達fmt/2,但通常取最高頻率fmax=fmt/3。

(7.4)

因此,改變相位累加器設(shè)定值K,就可以改變相位值ΔΡ,116

2)AD9835芯片內(nèi)部結(jié)構(gòu) AD9835內(nèi)部結(jié)構(gòu)框圖如圖7.6所示,它有一個32位相位累加器,兩個32位頻率寄存器F0和F1(用于設(shè)定K值),四個12位相位寄存器P0、P1、P2、P3。程控切換F0、F1時,可實現(xiàn)相位PSK調(diào)制。余弦函數(shù)表存儲在ROM中。 32位相位累加器的輸出值截取高12位后與12位相位寄存器Pi值相加,構(gòu)成12位的相位地址,去尋址余弦ROM表,尋址得到的幅度值經(jīng)10位的高速D/A轉(zhuǎn)換后成為合成余弦信號。輸出信號總諧波分量的畸變量與時鐘頻率和輸出信號頻率之比m=fmt/f有關(guān),m值愈大,諧波畸變愈小;m值最小時,諧波畸變最大。為消除m值較小時的諧波畸變,輸出端采用LC高階低通濾波器濾除高次諧波。在設(shè)計中采用5階Butterworth低通濾波器,可以將50MHz以上的高次諧波功率降低60dB,可完全滿足高精度信號源的要求。

2)AD9835芯片內(nèi)部結(jié)構(gòu)117圖7.6AD9835內(nèi)部結(jié)構(gòu)框圖圖7.6AD9835內(nèi)部結(jié)構(gòu)框圖118 3)引腳說明 AD9835引腳功能說明如表7.1所示。

3)引腳說明119表7.1AD9835引腳功能說明

表7.1AD9835引腳功能說明120 4)命令及控制寄存器說明 AD9835的命令及控制寄存器說明見表7.2~表7.8。 4)命令及控制寄存器說明121表7.2控制寄存器

表7.2控制寄存器122表7.3控制寄存器地址

表7.3控制寄存器地址123表7.4命令

表7.4命令124表7.5控制AD9835表7.5控制AD9835125表7.6寫數(shù)據(jù)到寄存器

表7.6寫數(shù)據(jù)到寄存器126表7.7設(shè)置SYNC、SELSRC表7.7設(shè)置SYNC、SELSRC127表7.8開關(guān)、復(fù)位、清零

表7.8開關(guān)、復(fù)位、清零128 引腳PSELSCT、PSEL0、PSEL1是外加調(diào)制信號,可用于對DDS進行直接位控調(diào)制,實現(xiàn)數(shù)字二值調(diào)頻(FSK)和數(shù)字四值調(diào)相(PSK)。引腳FSYNC、SCLK、SDATA用來對DDS進行程控工作模式設(shè)定。數(shù)據(jù)傳輸方式為同步串行方式。AD9835可以設(shè)定為SLEEP、RESET工作方式。在SLEEP工作方式下,功耗為1.75mW。

引腳PSELSCT、PSEL0、PSEL1是外加調(diào)129 2.AD9835的典型應(yīng)用電路 如圖7.7所示,REFIN與REFOUT相連接,則參考電壓為1.21V。在引腳REFIN接一個10nF電容到地。時鐘電路由U2構(gòu)成,U2為50MHz晶體振蕩信號源。SCLK、SDATA、FSYNC與單片機的P1.0、P1.1、P1.2引腳相連,為AD9835提供命令和頻率寄存器中的數(shù)據(jù),以便實現(xiàn)信號頻率的設(shè)置和初相位的設(shè)置。信號輸出端IOUT接5階ButterworthLC低通濾波器,通帶截止頻率為12MHz,阻帶截止頻率為25MHz,阻帶衰減大于60dB。

2.AD9835的典型應(yīng)用電路130圖7.7AD9835應(yīng)用電路圖圖7.7AD9835應(yīng)用電路圖131 7.3.2單片機及按鍵電路設(shè)計 1.AT89C2051的主要性能及引腳功能說明 AT89C2051的引腳如圖7.8所示。AT89C2051的性能如下: (1)和MCS-51產(chǎn)品兼容。 (2)2K字節(jié)可重編程閃速存儲器。 (3)1000寫/擦除周期。 (4)2.7~6V的操作范圍。 (5)全靜態(tài)操作:0~24MHz。 (6)兩級加密程序存儲器。

7.3.2單片機及按鍵電路設(shè)計132圖7.8AT89C2051的引腳圖圖7.8AT89C2051的引腳圖133 (7)128×8位內(nèi)部RAM。 (8)兩個16位定時器/計數(shù)器。 (9)六個中斷源。 (10)編程串行UART通道。 (11)直接LED驅(qū)動輸出,I/O引腳緩沖器可吸收20mA電流。 (12)一個片內(nèi)模擬比較器。 (13)低功耗空載和掉電方式。 (14)15根可編程I/O引線。 (7)128×8位內(nèi)部RAM。134 2.單片機按鍵電路設(shè)計 如圖7.9所示,單片機采用Atmel公司的89C2051。在XTAL.1和XTAL.2之間并聯(lián)12MHz晶振,XTAL.1和XTAL.2分別與地之間接27pF電容,為單片機提供12MHz時鐘。單片機的機器周期為1μs。 2.單片機按鍵電路設(shè)計135圖7.9單片機及按鍵電路圖圖7.9單片機及按鍵電路圖136 復(fù)位電路采用X5045芯片。當(dāng)程序“跑飛”時,看門狗芯片X5045將單片機復(fù)位,從而保證系統(tǒng)能夠正常運行。 4個按鍵中,S1為上鍵,S2為下鍵,S3為左鍵,S4為右鍵。系統(tǒng)通過4個按鍵對信號輸出頻率進行設(shè)定。上鍵S1增大頻率步進間隔,下鍵S2減小頻率步進間隔,左鍵S3按照所設(shè)定的頻率步進間隔減小信號的輸出頻率,右鍵S4按照所設(shè)定的頻率步進間隔增大信號的輸出頻率。平時引腳在上拉電阻作用下保持高電平,當(dāng)按鍵按下時,把引腳拉為低電平,通過程序來判斷按鍵并實現(xiàn)相應(yīng)的功能。頻率間隔與對應(yīng)值如表7.9所示。

復(fù)位電路采用X5045芯片。當(dāng)程序“跑飛”時,看門狗芯片137表7.9頻率間隔與對應(yīng)值表

表7.9頻率間隔與對應(yīng)值表138 7.3.3顯示電路設(shè)計 1.PS7219基本原理 PS7219是一個高性能、低價格的多位LED顯示驅(qū)動器。PS7219是武漢力源公司的產(chǎn)品,它在性能上完全兼容國外的產(chǎn)品MAX7219,并且還增添了位閃等功能。其接口采用流行的同步串行外設(shè)接口(SPI),可與任何一種單片機方便地接口,并可同時驅(qū)動八位共陰極LED數(shù)碼管或64只獨立LED發(fā)光二極管。PS7219A型內(nèi)置一個可靠的μP監(jiān)控電路,可為外部提供一個脈寬大于140ms、觸發(fā)門限典型值為4.63V的高電平復(fù)位信號。 7.3.3顯示電路設(shè)計139圖7.10PS7219引腳圖圖7.10PS7219引腳圖140 PS7219內(nèi)部具有15×8bitRAM功能控制寄存器,可方便尋址,對每位數(shù)字可單獨控制,刷新不需重寫整個顯示器。顯示亮度可數(shù)字控制,每位都具有閃爍使能控制位,引腳CON置高電平,可禁止所有顯示,達到降低功耗的效果,但同時并不影響對控制寄存器的修改。PS7219還有一個掉電模式、一個允許用戶選擇從1位數(shù)顯示到8位數(shù)顯示的掃描界限寄存器和一個強迫所有LED接通的測試模式。N個PS7219級聯(lián),可實現(xiàn)N×8位LED數(shù)碼管的顯示。 PS7219的應(yīng)用很廣泛,例如條形圖顯示、7段顯示、工業(yè)控制、儀表控制面板、LED模型顯示等。 PS7219是共陰極LED顯示驅(qū)動器,采用24腳DIP和SO兩種封裝,其引腳排列如圖7.10所示。 PS7219內(nèi)部具有15×8bitRAM功能控制寄存141 2.顯示部分電路設(shè)計 如圖7.11所示,PS7219與AT89C2051的連接為:RST、LOAD、DIN、CLK分別與單片機的RESET、P3.3、P3.4、P3.5相連,通過串行連接方式,單片機把命令和要顯示的數(shù)據(jù)傳送給PS7219。八位數(shù)碼管用來顯示信號發(fā)生器的輸出頻率,其中六位為整數(shù)部分,兩位為小數(shù)部分。即頻率最小顯示分辨率為0.01Hz,最大輸出頻率為999999.99Hz。

2.顯示部分電路設(shè)計142圖7.11顯示電路原理圖圖7.11顯示電路原理圖143 7.3.4系統(tǒng)總體電路圖 系統(tǒng)總體電路圖如圖7.12所示。圖中,運放AD817構(gòu)成輸出信號幅度調(diào)節(jié)電路。

7.3.4系統(tǒng)總體電路圖144圖7.12系統(tǒng)整體電路圖圖7.12系統(tǒng)整體電路圖1457.4系統(tǒng)軟件設(shè)計 7.4.1概述 整個軟件采用模塊化程序設(shè)計,用C語言編程,便于移植,可讀性強,主要分為顯示模塊disp.c、dds模塊ad9835.c、看門狗模塊x5045.c及主模塊mainpr.c。改變頻率時,僅需要改變FREGO寄存器的值,就可以改變輸出頻率,輸出頻率(7.5)

7.4系統(tǒng)軟件設(shè)計 7.4.1概述(7.5

溫馨提示

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

最新文檔

評論

0/150

提交評論