DDS信號(hào)發(fā)生器采用直接數(shù)字頻率合成(Direct Digital Synthesis,簡(jiǎn)稱DDS)技術(shù),把信號(hào)發(fā)生器的頻率穩(wěn)定度、準(zhǔn)確度提高到與基準(zhǔn)頻率相同的水平,并且可以在很寬的頻率范圍內(nèi)進(jìn)行精細(xì)的頻率調(diào)節(jié)。采用這種方法設(shè)計(jì)的信號(hào)源可工作于調(diào)制狀態(tài),可對(duì)輸出電平進(jìn)行調(diào)節(jié),也可輸出各種波形。
DDS原理
在介紹DDS信號(hào)發(fā)生器原理之前我們先了解一下DDS原理。
若對(duì)一正弦波形進(jìn)行采樣,每周期為 m 個(gè)采樣點(diǎn),分別記為 1~m。 對(duì)應(yīng)每次參考時(shí)鐘 f c , 輸出一個(gè)采樣點(diǎn),輸出圖中所示的一個(gè)周期的正弦,需要 m 個(gè)時(shí)鐘周期,則輸出的波形頻率為 f a =f c/m。對(duì)于這種情況, 每次時(shí)鐘到來時(shí),相位累加器加 1 ,則就會(huì)在第 i 個(gè)時(shí)鐘周期輸出 第 i 個(gè)采樣點(diǎn)( i = 1~m) ,第 m + 1 個(gè)時(shí)鐘輸出第 1 個(gè)采樣點(diǎn),以此循壞,這時(shí)的相位累加器實(shí) 際上是步進(jìn)為 1 的模 m 計(jì)數(shù)器。 如果每次時(shí)鐘到來時(shí), 總是間隔一個(gè)采樣點(diǎn)輸出,即相位累 加器的步進(jìn)為 2 ,這時(shí)在第 i 個(gè)周期輸出第 2i 個(gè)采樣點(diǎn),輸出波形如圖 1. 2 的波形 b,顯然波 形 b 的頻率是 a 的 2 倍,即 f b = 2 f a 。
綜上所述,如果相位累加器的步進(jìn)為 B, 則輸出波形的頻率為 B×f a , f a 是最小的輸 出頻率稱為頻率分辨率或步進(jìn)間隔, B 為頻率控制字。給定不同的頻率控制字即可輸出不同 的頻率。頻率輸出公式為: f 0 = fc/m* B
在實(shí)際設(shè)計(jì)中,如果累加器長(zhǎng)度為N ,則可以有2N 個(gè)存儲(chǔ)單元存儲(chǔ)采樣數(shù)據(jù),如果我們 對(duì)一個(gè)周期的波形進(jìn)行2N 個(gè)點(diǎn)的采樣,即m = 2N , 此時(shí)輸出頻率f o 和系統(tǒng)時(shí)鐘頻率f c ,相 fc f0 = N B 2 位累加器長(zhǎng)度N 以及頻率控制字B的關(guān)系為: 為了使波形輸出不失真,根據(jù)奈奎 斯特定理, B最高為2 N - 1 。另外要提高DDS 的精度,就需要分母越大越好,即采樣點(diǎn)的個(gè)數(shù) 越多,越接近實(shí)際波形。但實(shí)際上不可能提供如此之多的存儲(chǔ)空間,這就需要對(duì)采樣點(diǎn)進(jìn)行量 化。如圖1 (c) 所示,如果量化單位為K,則前K 個(gè)點(diǎn)的值總是相同的,為采樣值1 ,第二組K 個(gè) 采樣點(diǎn)的值為采樣值2 ,以此類推,第i 組K 個(gè)采樣點(diǎn)的值為采樣值i , 共需要m/K個(gè)存儲(chǔ)單元 來存儲(chǔ)m/K個(gè)采樣點(diǎn)。
DDS 的雜散來源之一就是相位累加器相位舍位造成的雜散。現(xiàn)有的頻率控制主要采用 二進(jìn)制頻率控制原理。這是因?yàn)?FPGA 采用二進(jìn)制的數(shù)據(jù)處理機(jī)制以及波形存儲(chǔ)器的二進(jìn) 制尋址方式,所以通常情況下 mK、m、K 都是二進(jìn)制整數(shù),如 m = 2^N ,這就要求對(duì)計(jì)算結(jié)果 進(jìn)行十進(jìn)制近似取舍,造成了波形發(fā)生器的輸出頻率以及頻率分辨率存在無法消除的誤差。
DDS 以數(shù)控振蕩器的方式,產(chǎn)生頻率、相位可控制的正弦,電路包括了基準(zhǔn)時(shí)鐘源、相位累加器、相位調(diào)制器、正弦ROM 查找表、D/A 轉(zhuǎn)換 器和低通濾波器等。 頻率控制字N 和相位控制字M 分別控制DDS 所輸出的正弦波的頻率和相 位。DDS 系統(tǒng)的核心是相位累加器,它由一個(gè)N 位累加器與N 位相位寄存器構(gòu)成。時(shí)鐘脈沖每觸發(fā)一次, 累加器便將頻率控制數(shù)據(jù)與相位寄存器輸出的累加相位數(shù)據(jù)相加, 然后把相加后的結(jié)果送至相位寄存器的數(shù)據(jù)輸入端。 相位寄存器將累加器在上一個(gè)時(shí)鐘作用后所產(chǎn)生的新相位數(shù)據(jù)反饋到累加器的輸入端, 以使加法器在下一個(gè)時(shí)鐘的作用下繼續(xù)與頻率控制數(shù)據(jù)相加。 這樣, 相位累加器在參考時(shí)鐘的作用下將進(jìn)行線性相位累加, 當(dāng)相位累加器累加滿時(shí), 就會(huì)產(chǎn)生一次溢出, 以完成一個(gè)周期性的動(dòng)作, 這個(gè)周期就是DDS 合成信號(hào)的一個(gè)頻率周期, 相位累加器的溢出頻率就是DDS 輸出的信號(hào)頻率。 相位寄存器的輸出與相位控制字相加, 結(jié)果作為正弦查找表的地址。 查找表由ROM 構(gòu)成, 其內(nèi)部存有一個(gè)完整周期正弦波的數(shù)字幅度信息, 每個(gè)查找表的地址對(duì)應(yīng)正弦波中的一個(gè)相位點(diǎn)。 查找表把輸入地址信息映射成正弦波幅度信號(hào), 同時(shí)輸出到D/A 轉(zhuǎn)換器的輸入端, 通過D/A 可將數(shù)字量形式的波形幅值轉(zhuǎn)換成所要求的合成頻率模擬量形式信號(hào)。 低通濾波器用于衰減和濾除不需要的取樣分量, 以便輸出頻譜純凈的正弦波信號(hào)。
DDS信號(hào)發(fā)生器原理
DDS信號(hào)發(fā)生器原理是建立在采樣定理基礎(chǔ)上,首先對(duì)需要產(chǎn)生的波形進(jìn)行采樣,將采樣值數(shù)字化后存入存儲(chǔ)器作為查找表,然后通過查表讀取數(shù)據(jù),再經(jīng)D/A轉(zhuǎn)換器轉(zhuǎn)換為模擬量,將保存的波形重新合成出來。DDS基本原理框圖如圖所示。
除了濾波器之外,DDS系統(tǒng)都是通過數(shù)字集成電路實(shí)現(xiàn)的,易于集成和小型化。系統(tǒng)的參考時(shí)鐘源通常是一個(gè)具有高穩(wěn)定性的晶體振蕩器,為各組成 部分提供同步時(shí)鐘。頻率控制字(FSW)實(shí)際上是相位增量值(二進(jìn)制編碼)作為相位累加器的累加值。相位累加器在每一個(gè)參考時(shí)鐘脈沖輸入時(shí),累加一次頻率,其輸出相應(yīng)增加一個(gè)步長(zhǎng)的相位增量。由于相位累加器的輸出連接在波形存儲(chǔ)器(ROM)的地址線上,因此其輸出的改變就相當(dāng)于查表。這樣就可以通過查表 把存儲(chǔ)在波形存儲(chǔ)器內(nèi)的波形抽樣值(二進(jìn)制編碼)查找出來。ROM的輸出送到D/A轉(zhuǎn)換器,經(jīng)D/A轉(zhuǎn)換器轉(zhuǎn)換成模擬量輸出。
DDS信號(hào)發(fā)生器設(shè)計(jì)
1、方案設(shè)計(jì)與論證
設(shè)計(jì)的DDS信號(hào)發(fā)生器系統(tǒng)以STC89C52芯片為核心控制,通過可編程放大電路實(shí)現(xiàn)了正弦波、方波的輸出功能,其頻率步進(jìn)值和幅度步進(jìn)值達(dá)到了設(shè)計(jì)要求。
本設(shè)計(jì)采用直接數(shù)字頻率合成。單片機(jī)從鍵盤獲得控制信息,控制兩路DDS芯片AD9850產(chǎn)生的兩路設(shè)定頻率的正弦波和方波。輸出信號(hào)經(jīng)過調(diào)整后輸入AD7524可以在單片機(jī)的控制下完成對(duì)信號(hào)的程控誤差。從DDS模塊輸出的兩路信號(hào)經(jīng)過低通濾波和直流偏置將兩路信號(hào)輸入模擬乘法器AD835,一路作為載波,一路作為調(diào)制波,從AD835產(chǎn)生調(diào)制波。同時(shí)可以將DDS信號(hào)輸入到CD4046B芯片進(jìn)行振蕩輸出調(diào)頻信號(hào)。
整體設(shè)計(jì)方案:以單片機(jī)STC89C52為核心,完成四方面的功能:采用DDS專用芯片AD9850產(chǎn)生正弦波和方波,高帶DA轉(zhuǎn)換器AD7524控制AM調(diào)制度,接收紅外遙控的控制碼,同進(jìn)LCD液晶顯示所有數(shù)據(jù)。其系統(tǒng)如圖所示。
2、理論分析、計(jì)算與各模塊設(shè)計(jì)
?。?)DDS波形產(chǎn)生電路設(shè)計(jì)
DDS基本原理:正弦波形一個(gè)周期離散樣點(diǎn)的幅值數(shù)字量存于ROM(或RAM)中,按一定的地址間隔(相位增量)讀出,由D/A轉(zhuǎn)換成模擬正弦信號(hào),經(jīng)過低通濾波,濾除D/A帶來的小臺(tái)階和數(shù)字電路產(chǎn)生的毛刺,即可獲得所需要的正弦信號(hào)。AD9850可以產(chǎn)生正弦波、方波。AD9834內(nèi)部的相位累加器的字寬為32位,SIN函數(shù)表有4096樣點(diǎn)值,因此32位的相位累加器輸出僅截取12位用于查表。其內(nèi)部原理框圖如下:
AD9850參數(shù):
最高參考時(shí)鐘為125MHz,輸出頻率分辨率可達(dá)0.0291Hz,允許產(chǎn)生最高輸出頻率62.5MHz。芯片內(nèi)部提供5bits數(shù)字控制相位調(diào)制,
AD9850有32位相位累加器,而ROM為14位,將32位累加器的輸出截高位的14位輸入正弦(ROM)查詢表,從查詢表輸出給D/A。D/A的輸出是兩個(gè)互補(bǔ)的模擬電流,在12腳處接一個(gè)電阻Rset,使?jié)M量程輸出為10~20mA電流,經(jīng)過濾波器輸出正弦波。
AD9850主要引腳說明:
1、(D0~D7):8bit數(shù)據(jù)輸入端。用于下載32bit頻率調(diào)節(jié)字和8bit相位控制字。
2、(W-CLK):字裝載時(shí)鐘,用于裝載并行或串行的頻率/相位/控制字
3、(RSET):DAC外接電阻,該電阻決定DAC輸出電流的最大值。對(duì)于典型應(yīng)用(IOUTmax=10mA)時(shí),RSET的值為3.9kΩ,另一端連接到地線。外接電阻RSET與DAC輸出電流 IOUT的關(guān)系為
電路原理圖如圖2-2所示:
圖2-2 DDS波形產(chǎn)生電路
?。?)程控衰減電路設(shè)計(jì)
程控衰減電路由D/A轉(zhuǎn)換芯片AD7524構(gòu)成,主要利用此D/A芯片的可程控電阻網(wǎng)絡(luò)構(gòu)成基于AD7524構(gòu)成的程控衰減器,而在其輸出端得到幅度可控的正弦波。由AD7524的8位數(shù)據(jù)輸入端進(jìn)行控制,可實(shí)現(xiàn)1~1/56級(jí)衰減。其相關(guān)電路如圖2-3所示:
圖2-3 程控衰減電路
?。?)模擬AM電路設(shè)計(jì)
該電路選用AD835作為乘法器,將載波和調(diào)制信號(hào)相乘得AM信號(hào),其兩路輸入信號(hào)幅值可達(dá)到-1V—+1V,對(duì)噪聲可形成較強(qiáng)的抑制能力。另外,普通雙邊帶調(diào)制需要調(diào)制信號(hào)疊加直流成分,因此調(diào)制信號(hào)在輸入到乘法器前需經(jīng)過電平轉(zhuǎn)換電路為調(diào)制信號(hào)疊加適當(dāng)?shù)闹绷?。由于前?jí)的調(diào)制信號(hào)是由程控衰減器輸出,所以在程控衰減器初始輸出的情況下,可以通過調(diào)節(jié)電平轉(zhuǎn)換電路的直流偏置,使模擬AM電路的初始輸出的調(diào)幅波形的調(diào)制度調(diào)整至1。這樣設(shè)置可以為之后的程控調(diào)制帶來方便。通過P8的跳線可以選擇調(diào)制波為方波,從面實(shí)現(xiàn)ASK調(diào)制。其電路如圖所示。
圖2-4 AM信號(hào)產(chǎn)生電路
?。?)模擬FM電路的設(shè)計(jì)
頻率調(diào)頻信號(hào)的基本特點(diǎn)是它的瞬時(shí)頻率按調(diào)制信號(hào)規(guī)律變化,因而,一種最容易想到的方法是用調(diào)制信號(hào)直接控制振蕩器的振蕩頻率,使其不失真地反映調(diào)制信號(hào)的變化。通常將這種直接調(diào)變振蕩器頻率的方法稱為直接調(diào)頻法。本設(shè)計(jì)中,使用鎖相環(huán)集成電路CD4046內(nèi)部自帶的VCO產(chǎn)生FM波。通過P10 的跳線可以選擇方波為調(diào)制波,從而實(shí)現(xiàn)FSK。其電路如5所示。
圖2-5 FM、FSK信號(hào)產(chǎn)生電路
?。?)控制與顯示電路
輸入控制采用紅外遙控器控制,通過HS0038紅外一體化接收頭解碼、放大,將控制碼發(fā)送給單片機(jī),再由單片機(jī)控制DDS模塊、程控衰減模塊產(chǎn)生不同的波形。
顯示部分使用128*64點(diǎn)陣寬屏液晶,可以顯示不同模式下的頻率及波形,達(dá)到直觀、形象的效果。
此模塊如圖所示:
3、程序設(shè)計(jì)
主程序流程圖如圖所示
4、代碼
AD9850的驅(qū)動(dòng)程序C文件
#include《intrins.h》
#include “AD9850I.h”
#include “l(fā)cd12864.h”
//unsigned char freq[8]; //液晶顯示8種步進(jìn)頻率值
unsigned char freq[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/********************
函數(shù):AD9850Reset
功能:AD9850的復(fù)位函數(shù)
********************/
void AD9850Reset(void)
{
AD9850WCLK = 1;
AD9850FQUD = 1;
// AD9850ReSet = 0;
// AD9850ReSet = 1;//復(fù)位腳置高電平(10個(gè)AD9850的時(shí)鐘周期)
// _nop_();_nop_();_nop_();_nop_();_nop_();
// _nop_();_nop_();_nop_();_nop_();_nop_();//延時(shí),其實(shí)不用這么長(zhǎng)
// AD9850ReSet = 0;//復(fù)位完成,再拉低
}
/*步進(jìn)按鍵函數(shù)*/
void f10Mhz(void) //10Mhz步進(jìn)
{
freq[0]=freq[0]+1;
if(freq[0]》=10)
{
freq[0]=0;
}
display_led();
}
void f1Mhz(void) //1Mhz步進(jìn)
{
freq[1]=freq[1]+1;
if(freq[1]》=10)
{
freq[1]=0;
}
display_led();
}
void f100Khz(void) //100Khz步進(jìn)
{
freq[2]=freq[2]+1;
if(freq[2]》=10)
{
freq[2]=0;
}
display_led();
}
void f10Khz(void) //10Khz步進(jìn)
{
freq[3]=freq[3]+1;
if(freq[3]》=10)
{
freq[3]=0;
}
display_led();
}
void f1Khz(void) //1Khz步進(jìn)
{
freq[4]=freq[4]+1;
if(freq[4]》=10)
{
freq[4]=0;
}
display_led();
}
void f100Hz(void) //100hz步進(jìn)
{
freq[5]=freq[5]+1;
if(freq[5]》=10)
{
freq[5]=0;
}
display_led();
}
void f10Hz(void) //10hz步進(jìn)
{
freq[6]=freq[6]+1;
if(freq[6]》=10)
{
freq[6]=0;
}
display_led();
}
void f1Hz(void) //1hz步進(jìn)
{
freq[7]=freq[7]+1;
if(freq[7]》=10)
{
freq[7]=0;
}
display_led();
}
/***計(jì)算控制字************/
/***入口:頻率數(shù)組指針***出口,控制字值*****/
unsigned long jisuan(unsigned char data *fno)//*fno-0》freq[0.。.7]
{
unsigned long dds_no ;
dds_no=
?。?(fno+7))*FF0+
?。?(fno+6))*FF1+
?。?(fno+5))*FF2+
?。?(fno+4))*FF3+
(*(fno+3))*FF4+
?。?(fno+2))*FF5+
?。?(fno+1))*FF6+
(*fno)*FF7 ;
return(dds_no);
}
/********************
**函數(shù):AD9850SetFre
**功能:AD9850設(shè)定頻率控制字函數(shù)
**參數(shù):Fre,float型,要設(shè)定的頻率,單位Hz
********************/
void AD9850ISetFre()
{
unsigned long FTW = 0;//要寫入的32位頻率控制字(AD9850一次需要寫入40位控制字)
unsigned char part1,part2,part3,part4;
FTW=jisuan(freq);
// if(FTW 》 30000000)
// FTW = 30000000;
// FTW = (unsigned long) (Fre * AD9850_125M);//計(jì)算頻率控制字(公式:FTW=(2^32/fosc)*Fre)
/*以下將32位頻率控制字分解*/
part1 = (unsigned char) (FTW》》24);//取32~25位
part2 = (unsigned char) (FTW》》16);//取24~17位
part3 = (unsigned char) (FTW》》8); //取16~9位
part4 = (unsigned char) (FTW); //取8~1位
/*以上將32位頻率控制字分解*/
AD9850FQUD = 1;
AD9850WCLK = 1;
AD9850DATAPORT = 0x00;//寄存器最高的八位只送0x00
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part1;
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part2;
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part3;
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part4;
AD9850WCLK = 0;//AD9850WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850FQUD = 0;//AD9850FQUD上升沿將AD9850緩沖區(qū)的40位數(shù)據(jù)送入DDS Core
}
/********************
**函數(shù):AD9850SetFre
**功能:AD9850設(shè)定頻率控制字函數(shù)
**參數(shù):Fre,float型,要設(shè)定的頻率,單位Hz
********************/
void AD9850IISetFre(float Fre)
{
unsigned long FTW = 0;//要寫入的32位頻率控制字(AD9850一次需要寫入40位控制字)
unsigned char part1,part2,part3,part4;
if(Fre 》 30000000)
Fre = 30000000;
FTW = (unsigned long) (Fre * 34.3597384);//計(jì)算頻率控制字(公式:FTW=(2^32/fosc)*Fre)
/*以下將32位頻率控制字分解*/
part1 = (unsigned char) (FTW》》24);//取32~25位
part2 = (unsigned char) (FTW》》16);//取24~17位
part3 = (unsigned char) (FTW》》8); //取16~9位
part4 = (unsigned char) (FTW); //取8~1位
/*以上將32位頻率控制字分解*/
AD9850FQUD = 1;
AD9850WCLK = 1;
AD9850DATAPORT = 0x00;//寄存器最高的八位只送0x00
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part1;
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part2;
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part3;
AD9850WCLK = 0;//WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850WCLK = 1;
AD9850DATAPORT = part4;
AD9850WCLK = 0;//AD9850WCLK上升沿送數(shù)據(jù)
_nop_();
AD9850FQUD = 0;//AD9850FQUD上升沿將AD9850緩沖區(qū)的40位數(shù)據(jù)送入DDS Core
}
主程序
#include 《reg52.h》
#include “AD9850I.h”
#include “hs0038.h”
#include “l(fā)cd12864.h”
void main()
{
hs0038_init(); //HS0038初始化,使用了外部中斷0///定時(shí)器1
lcd12864_init();
AD9850Reset();
while(1)
{
Get_Ircode_And_Dis();
switch (ircode[2])
{ /**************模式選擇****************/
case 0x07:xuanzekey();break;
case 0x15:quedingkey();break;
case 0x09:fanhuikey();break;
/*************頻率調(diào)整區(qū)***************/
case 0x0c:if(flag1==1) {f10Mhz();}; break;
case 0x18:if(flag1==1) {f1Mhz(); };break;
case 0x5e:if(flag1==1) {f100Khz();};break;
case 0x08:if(flag1==1) {f10Khz(); };break;
case 0x1c:if(flag1==1) {f1Khz(); } ;break;
case 0x5a:if(flag1==1) {f100Hz();} ;break;
case 0x42:if(flag1==1) {f10Hz(); } ;break;
case 0x52:if(flag1==1) {f1Hz(); } ;break;
/***************頻率確認(rèn)***************/
case 0x4a: if(flag1==1)
{
pce1=0;
pce2=1;
pce3=1;
AD9850ISetFre();
};
break;
/***************AM調(diào)制*********************/
case 0x16: pce1=1; //片選AD9850 I 實(shí)驗(yàn)板U1
pce2=0; //片選AD9850 I 實(shí)驗(yàn)板U2
pce3=1;
AD9850IISetFre(1000.0);break;
case 0x44:if(flag2==1)
{
pce1=1;
pce2=1;
pce3=0;
pwr=0;
AM_mastepdown();
};
break;
case 0x40: if(flag2==1)
{
pce1=1;
pce2=1;
pce3=0;
pwr=0;
AM_mastepup();
};
break;
/***************FM調(diào)制*********************/
case 0x19:AD9850IISetFre(5000.0);break;
default:break;
}
ircode[2]=0; //注意一定要把ircode[2]清零。。。。。
// AD9850SetFre();
}
}
?
由表可以看出,此DDS信號(hào)發(fā)生器設(shè)計(jì)方案在頻率穩(wěn)定度方面,正弦波、三角波、方波在帶負(fù)載的情況下均十分穩(wěn)定,這正是DDS專用芯片AD9834的特點(diǎn)。
評(píng)論
查看更多