頻率合成技術(shù)是將一個(gè)(或多個(gè))基準(zhǔn)頻率變換成另一個(gè)(或多個(gè))合乎質(zhì)量要求的所需頻率的技術(shù)。在通信、雷達(dá)、導(dǎo)航、電子偵察、干擾與抗干擾等眾多領(lǐng)域都有應(yīng)用。隨著各種頻率合成器和頻率合成方案的出現(xiàn),頻率合成技術(shù)得到了不斷的發(fā)展。 1971年3月美國學(xué)者J.Tierncy,C.M.Rader和B.Gold首次提出了直接數(shù)字頻率合成(DDS__Direct Digital Synthesis)技術(shù)。這是一種從相位概念出發(fā)直接合成所需要的波形的新的全數(shù)字頻率合成技術(shù)。同傳統(tǒng)的頻率合成技術(shù)相比,DDS技術(shù)具有極高的頻率分辨率、極快的變頻速度,變頻相位連續(xù)、相位噪聲低,易于功能擴(kuò)展和全數(shù)字化便于集成,容易實(shí)現(xiàn)對(duì)輸出信號(hào)的多種調(diào)制等優(yōu)點(diǎn),滿足了現(xiàn)代電子系統(tǒng)的許多要求,因此得到了迅速的發(fā)展。 目前市面上的DDS芯片,價(jià)格昂貴、功能固定單一,應(yīng)用受到限制。本綜合實(shí)驗(yàn)項(xiàng)目采用基于FPGA的EDA技術(shù)設(shè)計(jì)實(shí)現(xiàn)DDS芯片,并可以根據(jù)實(shí)際需要對(duì)其功能進(jìn)行靈活地修改,配置。
1.2 DDS 工作原理 一個(gè)純凈的單頻信號(hào)可表示為:  (2-1) 只要它的幅度U和初始相位  不變,它的頻譜就是位于  的一條譜線。為了分析簡化起見,可令U=1,  =0,這將不會(huì)影響對(duì)頻率的研究。即:  (2-2) 如果對(duì)(2-2)的信號(hào)進(jìn)行采樣,采樣周期為  (即采樣頻率為  ),則可得到離散的波形序列:  (2-3) 相應(yīng)的離散相位序列為:  (2-4) 式中:  (2-5) 是連續(xù)兩次采樣之間的相位增量。根據(jù)采樣定理:  (2-6) 只要從(2-3)出來的離散序列即可唯一的恢復(fù)出(2-2)的模擬信號(hào)。從(2-2)可知,是相位函數(shù)的斜率決定了信號(hào)的頻率;從(2-5)可知,決定相位函數(shù)斜率的是兩次采樣之間的相位增量  。因此,只要控制這個(gè)相位增量,就可以控制合成信號(hào)的頻率,F(xiàn)將整個(gè)周期的相位2  分成M份,每一份為  ,若每次的相位增量選擇為  的K倍,即可得到信號(hào)的頻率:  (2-7) 相應(yīng)的模擬信號(hào)為:  (2-8) 式中K和M都是正整數(shù),根據(jù)采樣定理的要求,K的最大值應(yīng)小于M的1/2。 綜上所述,在采樣頻率一定的情況下,可以通過控制兩次采樣之間的相位增量(不得大于π)來控制所得離散序列的頻率,經(jīng)保持、濾波之后可唯一的恢復(fù)出此頻率的模擬信號(hào)。 DDS工作原理框圖如圖2.1所示: 圖2.1 DDS原理框圖 其實(shí)質(zhì)是以基準(zhǔn)頻率源(系統(tǒng)時(shí)鐘)對(duì)相位進(jìn)行等間隔的采樣。由圖2.1見,DDS 由相位累加器和波形存儲(chǔ)器(即,ROM查詢表)構(gòu)成的數(shù)控振蕩器(NCO_ Numerically Controlled Oscillators)、數(shù)模轉(zhuǎn)換器(DAC)以及低通濾波器(LPF)三部分組成。在每一個(gè)時(shí)鐘周期,N位相位累加器與其反饋值進(jìn)行累加,其結(jié)果的高L位作為查詢表的地址,然后從ROM中讀出相應(yīng)的幅度值送到DAC。再由DAC將其轉(zhuǎn)換成為階梯模擬波形,最后由具有內(nèi)插作用的LPF將其平滑為連續(xù)的正弦波形作為輸出。因此,通過改變頻率控制字K就可以改變輸出頻率  。 在這里  ,  。 由上面的分析可得DDS的輸出頻率:  (2-9) 由上式可知,DDS的最小輸出頻率為:  (2-10) DDS的頻率分辨率為:  (2-11) DDS頻率輸入字的計(jì)算: FW(N-1:0) = 2Nf0/fc (2-12) 1.3 DDS基本結(jié)構(gòu)組成 一個(gè)基本的DDS系統(tǒng)由數(shù)控振蕩器(NCO)、數(shù)模轉(zhuǎn)換器(DAC)和低通濾波器(LPF)三部分構(gòu)成,如圖3.1所示: 圖3.1 DDS的基本結(jié)構(gòu) 數(shù)控振蕩器(NCO)產(chǎn)生頻率可控制的數(shù)字正弦載波,通過數(shù)模轉(zhuǎn)換器(DAC)得到模擬正弦波,最后經(jīng)過低通濾波器(LPF)除去各種干擾信號(hào)。 本實(shí)驗(yàn)項(xiàng)目中的設(shè)計(jì)主要針對(duì)數(shù)控振蕩器(NCO)部分,DAC部分直接采用實(shí)驗(yàn)系統(tǒng)箱提供的數(shù)/模轉(zhuǎn)換電路。 1.4 DDS的設(shè)計(jì) 在DDS的設(shè)計(jì)中其最基本的構(gòu)件是相位累加器和波形存貯器。通常也可在波形存貯器前面加一個(gè)相位調(diào)制器,使其具有相位調(diào)制的功能,為了防止頻率控制字、相位控制字改變時(shí)干擾相位累加器和相位調(diào)制器的正常工作,分別在這兩個(gè)模塊前面加入了兩組寄存器,從而靈活且穩(wěn)定地控制頻率字和相位字的輸入。如圖4.1所示: 圖中相位累加器(phasea)是整個(gè)DDS的核心,在這里完成相位累加功能,其輸入是相位增量,又可稱為頻率控制字  ,由于  與輸出頻率  是簡單的線性關(guān)系:  (4-1) 事實(shí)上當(dāng)基準(zhǔn)時(shí)鐘  是  時(shí),  就等于  。 相位調(diào)制器(phasemod)接收相位累加器的相位輸出,在這里加一個(gè)相位偏移值,主要用于實(shí)現(xiàn)信號(hào)的相位調(diào)制,如PSK(相移鍵控)等,在不使用時(shí)可以去掉該部分,或加一個(gè)固定的相位控制字。 波形存儲(chǔ)器(即,正弦ROM查找表)(sinlup)把存儲(chǔ)在相位累加器中的抽樣值轉(zhuǎn)換成正弦波幅度的數(shù)字量函數(shù),可理解為相位到幅度的轉(zhuǎn)換。它的輸入是相位調(diào)制器輸出的高M(jìn)位(而并非全部N位)值,將其作為正弦ROM查找表的地址值;查詢表把輸入的地址相位信息映射成正弦波幅度信號(hào);輸出送往DAC,轉(zhuǎn)化為模擬信號(hào)。
2 AD9850簡介 2.1芯片性能 隨著數(shù)字技術(shù)的飛速發(fā)展,用數(shù)字控制方法從一個(gè)參考頻率源產(chǎn)生多種頻率的技術(shù),即直接數(shù)字頻率合成(DDS)技術(shù)異軍突起。美國AD公司推出的高集成度頻率合成器AD9850便是采用DDS技術(shù)的典型產(chǎn)品之一。AD9850采用先地蝗CMOS工藝,其功耗在3.3V供電時(shí)僅為155mW,擴(kuò)展工業(yè)級(jí)溫度范圍為-40~80℃,采用28腳SSOP表面封裝形式。AD9850的引腳排列,圖2為其組成框圖。圖2中層虛線內(nèi)是一個(gè)完整的可編程DDS系統(tǒng),外層虛線內(nèi)包含了AD9850的主要組成部分。AD9850內(nèi)含可編程DDS系統(tǒng)和高速比較器,能實(shí)現(xiàn)全數(shù)字編程控制的頻率合成?删幊藾DS系統(tǒng)的核心是相位累加器,它由一個(gè)加法器和一個(gè)N位相位寄存器組成,N一般為24~32。每來一個(gè)外部參考時(shí)鐘,相位寄存器便以步長M遞加。相位寄存器的輸出與相位控制字相加后可輸入到正弦查詢表地址上。正弦查詢表包含一個(gè)正弦波周期的數(shù)字幅度信息,每一個(gè)地址對(duì)應(yīng)正弦波中0°~360°范圍的一個(gè)相位點(diǎn)。查詢表把輸入地址的相位信息映射成正弦波幅度信號(hào),然后驅(qū)動(dòng)DAC以輸出模式量。相位寄存器每過2N/M個(gè)外部參考時(shí)鐘后返回到初始狀態(tài)一次,相位地正弦查詢表每消費(fèi)品一個(gè)循環(huán)也回到初始位置,從而使整個(gè)DDS系統(tǒng)輸出一個(gè)正弦波。輸出的正弦波周期To=Tc2N/M,頻率fout=Mfc/2N,Tc、fc分別為外部參考時(shí)鐘的周期和頻率。AD9850采用32位的相位累加器將信號(hào)截?cái)喑?4位輸入到正弦查詢表,查詢表的輸出再被截?cái)喑?0位后輸入到DAC,DAC再輸出兩個(gè)互補(bǔ)的電流。DAC滿量程輸出電流通過一個(gè)外接電阻RSET調(diào)節(jié),調(diào)節(jié)關(guān)系為ISET=32(1.148V/RSET),RSET的典型值是3.9kΩ。將DAC的輸出經(jīng)低通濾波后接到AD9850內(nèi)部的高速比較器上即可直接輸出一個(gè)抖動(dòng)很小的方波。AD9850在接上精密時(shí)鐘源和寫入頻率相位控制字之間后就可產(chǎn)生一個(gè)頻率和相位都可編程控制的模擬正弦波輸出,此正弦波可直接用作頻率信號(hào)源或經(jīng)內(nèi)部的高速比較器轉(zhuǎn)換為方波輸出。在125MHz的時(shí)鐘下,32位的頻率控制字可使AD9850的輸出頻率分辨率達(dá)0.0291Hz;并具有5位相位控制位,而且允許相位按增量180°、90°、45°、22.5°、11.25°或這些值的組合進(jìn)行調(diào)整。流程如圖(2)。
2 .2AD9850 的控制字及控制時(shí)序 AD9850 的控制字有 40 位 ,其中 32 位是頻率控制位 ,5 位是相位控制位 ,1 位是電源休眠控制位 ,2 位是工作方式選擇控制位。在應(yīng)用中 ,工作方式選擇位設(shè)為00 ,因?yàn)?01 ,10 ,11 已經(jīng)預(yù)留作為工廠測試用。頻率控制位可通過下式計(jì)算得到:f out = ( f r ×W) / 232其中: f out 要輸出的頻率值; f r 為參考時(shí)鐘頻率;W 為相應(yīng)的十進(jìn)制頻率控制字, 然后轉(zhuǎn)換為十六進(jìn)制即可。AD9850 有串行和并行兩種控制命令字寫入方式。其中串行寫入方式是采用 D7 作為數(shù)據(jù)輸入端 ,每次W_CL K的上升沿把一個(gè)數(shù)據(jù)串行移入到輸入寄存器40 位數(shù)據(jù)都移入后 ,FQ_UD 上升沿完成輸出信號(hào)頻率和相位的更新。串行控制字的寫入時(shí)序如圖 3 所示。但是要注意的是 ,此時(shí)數(shù)據(jù)輸入端的三個(gè)管腳不可懸空 ,其中D0 ,D1 腳接高電平 ,D2腳要接地。
圖(3) 2.3管腳定義
3 硬件部分 3.1基于AD9850的模塊原理圖
3.2硬件電路設(shè)計(jì) AD9850 控制字的寫入方式有串行和并行兩種。并行寫入方式的優(yōu)點(diǎn)是數(shù)據(jù)傳輸?shù)乃俣瓤?,能夠提升整個(gè)系統(tǒng)的處理速度 ,但占用的單片機(jī)的 I/ O 口資源太多。與并行方式相比 ,串行寫入方式在數(shù)據(jù)傳輸?shù)乃俣壬弦?,但它更大優(yōu)點(diǎn)是能節(jié)省很多 I/ O 口資源[8 ]。所以 ,本系統(tǒng)采用A T89S52 單片機(jī)作為控制核心 ,通過串行寫入控制字的方式控制 AD9850 芯片 ,加上鍵盤和L ED 顯示部分等外圍電路 ,構(gòu)成整個(gè)系統(tǒng)電路。為了詳細(xì)介紹 AD9850 的用法 ,這里重點(diǎn)給出本系統(tǒng)中A T89S52 單片機(jī)與 AD9850 芯片連接電路 ,如圖 4 所示 ,其中 R1 = 1 kΩ, R2 = 10kΩ, R3 =1kΩ,單片機(jī)晶振選用12 MHz ,電容采用 30 p F 經(jīng)典值。單片機(jī)采用12 MHz晶振時(shí) ,它的高電平時(shí)間能夠滿足 AD9850 。
圖(4) 4軟件部分 4.1 軟件部分設(shè)計(jì) 軟件程序的功能就是通過程序使整個(gè)系統(tǒng)按照人們的設(shè)想要求工作起來 ,本系統(tǒng)中最主要的部分就是將AD9850 的 40 位控制字通過單片機(jī)寫入到 AD9850 芯片內(nèi) ,系統(tǒng)的程序流程圖如圖 4 所示。要根據(jù)寫入控制字方式的不同嚴(yán)格按照 AD9850 的時(shí)序圖來編寫控制字寫入子程序。本文主要給出串行寫入方式的C源程序以供讀者調(diào)試參考。
4.2參考程序
- /*******************************************
- 函數(shù):關(guān)于AD9850的DDS調(diào)頻
- ********************************************/
- #include <reg52.h>
- #include <intrins.h>
- #include <string.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define WRITE_DATA_IO P1 //定義AD9850數(shù)據(jù)端口
- #define LED_DATA_IO P0 //定義LED燈數(shù)據(jù)端口
- Unsigned char code duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80}; //設(shè)置數(shù)碼管段碼0-9
- unsigned char code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //設(shè)置數(shù)碼管位碼
- uchar WRITE_DATA[5]; //9850頻率和控制字,WRITE_DATA[5]為控制字,其他32位為頻率字
- uchar display_data[8]; //8位數(shù)碼管的數(shù)值
- unsigned long frequence; //無符號(hào)長整形數(shù)值,我們需要輸入的頻率
- uint MHZ, KHZ , HZ; //將需要的頻率分解為MHZ,KHZ,HZ
- uchar AD9850_temp; //AD9850工作標(biāo)志位
-
- sbit W_SLK = P2^0; //AD9850字節(jié)輸入,上升沿有效
- sbit DQ_VD = P2^1; //AD9850四字節(jié)輸入后,上升沿有效
- sbit key_unit = P2^2; //按鍵的個(gè)位
- sbit key_decade = P2^3; //按鍵的十位
- sbit key_power = P2^4; //按鍵的十次冪
- sbit key_sure = P2^5; //按鍵確認(rèn)
- sbit weila = P2^6; //LED數(shù)碼管的位碼
- sbit duanla = P2^7; //LED數(shù)碼管的段碼
- /*******************************************
- 函 數(shù):延時(shí)函數(shù),延時(shí)tms
- 入口函數(shù):無
- 出口頻率:無
- ********************************************/
- void delay1ms(uchar t)
- {
- uchar tt;
- while(t--)
- {
- tt= 125;
- while(tt--);
- }
- }
- /*************************LED顯示函數(shù)**************************************/
-
- /*******************************************
- 函 數(shù):初始化定時(shí)器0
- 入口函數(shù):無
- 出口頻率:無
- ********************************************/
- void INIT_time0()
- {
- TMOD |= 0x01;
- TH0 = -2000 / 256;
- TL0 = -2000 % 256;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- /*******************************************
- 函 數(shù):LED數(shù)碼管在start位開始顯示num數(shù)據(jù)
- 入口函數(shù):start是數(shù)據(jù)從第幾位顯示,num是顯示多少位
- 出口頻率:無
- ********************************************/
- void LED_display(uchar start, uchar num)
- {
- static unsigned char i = 0;
- uchar delay = 15;
- if(AD9850_temp == 1)
- {
- display_data[0] = MHZ / 10; //將頻率分解讓數(shù)碼管顯示
- display_data[1] = MHZ % 10;
- display_data[2] = KHZ / 100;
- display_data[3] = KHZ % 100 / 10;
- display_data[4] = KHZ % 10;
- display_data[5] = HZ / 100;
- display_data[6] = HZ % 100 / 10;
- display_data[7] = HZ % 10;
- }
- LED_DATA_IO = 0xed; //顯示兩個(gè)小數(shù)點(diǎn)
- weila = 1; //位碼鎖存
- weila = 0;
-
- LED_DATA_IO = duanma[10];
- duanla = 1;
- duanla = 0;
- while(delay--);
- LED_DATA_IO = weima[i+start];
- weila = 1;
- weila = 0;
-
- LED_DATA_IO = duanma[display_data[i]];
- duanla = 1;
- duanla = 0;
- i++;
- if(i == num)
- i = 0;
- }
- /*******************************************
- 函 數(shù):中斷函數(shù)
- 入口函數(shù):無
- 出口頻率:無
- ********************************************/
- void INT_time0() interrupt 1
- {
- TH0 = -2000 / 256;
- TL0 = -2000 % 256;
- LED_display(0, 8);
- }
- /*************************按鍵函數(shù)*************************************/
- /*******************************************
- 函 數(shù):按鍵初始化,確定頻率的大小
- 入口函數(shù):無
- 出口頻率:無
- ********************************************/
- void INIT_key() reentrant //可從入函數(shù)
- {
- uchar unit = 0,decade = 0, power = 0, i;
- AD9850_temp = 0; //AD9850開始標(biāo)志位關(guān)閉
- memset(display_data, 0, 8);
- while(1)
- {
- if(key_unit == 0) //個(gè)位鍵
- {
- delay1ms(20); //延時(shí),防抖動(dòng)
- if(key_unit == 0)
- {
- while(key_unit == 0);
- unit++;
- if(unit == 10 )
- unit = 0;
-
- display_data[6] = unit;
- }
- }
-
- if(key_decade == 0) //十位鍵
- {
- delay1ms(20);
- if(key_decade == 0)
- {
- while(key_decade == 0);
- decade++;
- if(decade == 10)
- decade = 0;
-
- display_data[5] = decade;
- }
- }
-
- if(key_power == 0) //10次冪鍵
- {
- delay1ms(20);
- if(key_power == 0)
- {
- while(key_power == 0);
- power++;
- if(power == 7)
- power = 0;
-
- display_data[7] = power;
- }
- }
-
- if(key_sure == 0) //確定鍵
- {
- delay1ms(20);
- if(key_sure == 0)
- {
- while(key_sure == 0);
- break;
- }
- }
- }
-
- frequence = unit + 10*decade; //將按鍵得到的數(shù)值進(jìn)行變換,得到我們需要的頻率
- for(i = 1; i <= power; i++)
- frequence *= 10;
-
- if(frequence >= 20000000) //由于AD9850的頻率范圍是1——20MHZ,所以超過了就重新輸入
- {
- frequence = 0;
- INIT_key();
- }
-
- MHZ = frequence / 1000000; //將頻率分解位MHZ,KHZ,HZ,主要是為了在中斷中計(jì)算量少些,以免影響中斷效果
- KHZ = frequence % 1000000 / 1000;
- HZ = frequence %1000;
-
- AD9850_temp = 1; //AD9850開始標(biāo)志位開啟
- }
-
- /*************************AD9850函數(shù)**************************************/
- /*******************************************
- 函 數(shù):進(jìn)行9850的DDS函數(shù)發(fā)生,寫入控制字,寫入頻率字
- 從高字往低字寫
- 入口函數(shù):需要的頻率
- 出口頻率:無
- ********************************************/
- void AD9850_WRITE()
- {
- unsigned long temp;
- char i;
- W_SLK = 0;
- DQ_VD = 0;
-
- temp = (unsigned long)(34.359738368 * frequence);
- for(i = 0; i < 4; i++)
- WRITE_DATA[i] = temp >> (i * 8);
-
- for(i = 4; i >= 0; i--)
- {
- W_SLK = 0;
- WRITE_DATA_IO = WRITE_DATA[i];
- W_SLK = 1;
- _nop_();
- }
- DQ_VD = 1;
- }
- /*************************主函數(shù)**************************************/
- /*******************************************
- 函 數(shù):主函數(shù),完成對(duì)全局的操控
- 入口函數(shù):無
- 出口頻率:無
- ********************************************/
- void main()
- {
- INIT_time0(); //初始化時(shí)間中斷
- while(1)
- {
- if(key_sure == 0)
- {
- delay1ms(20);
- if(key_sure == 0)
- {
- while(key_sure == 0);
- INIT_key();
- AD9850_WRITE();
- }
- }
- }
- }
復(fù)制代碼
5波形圖 1.9MHZ正弦波
1HZ方波
1HZ正弦波
1MHZ方波 1MHZ實(shí)物 1MHZ正弦波
6結(jié)束語 本模塊學(xué)習(xí)是基于AD9850的DDS信號(hào)發(fā)生器的基礎(chǔ)上,通過了解AD9850的工作原理和工作要求來完成正弦波.矩形波等波形在系統(tǒng)時(shí)鐘125M的條件下的學(xué)習(xí)。 本次學(xué)習(xí)得到了精度很高的正弦波和矩形波,其占空比為46.5%已經(jīng)很接近預(yù)期的結(jié)果。
以上的Word格式文檔51黑下載地址: |