這個做的比較簡單,原理圖后來有幾處修改,不要緊,是按照官方評估板修改的,574沒用到不焊接(連PC機的)。原理圖暫時提供pdf版本的吧,畫的也不好。大家拿到資料自己學(xué)習(xí)參考就是了,不要到處發(fā)布。^-^
控制模塊工作中.JPG (769.85 KB, 下載次數(shù): 250)
下載附件
2016-1-12 01:25 上傳
實驗設(shè)備..JPG (716.73 KB, 下載次數(shù): 252)
下載附件
2016-1-12 01:26 上傳
控制模塊.JPG (1001.52 KB, 下載次數(shù): 238)
下載附件
2016-1-12 01:26 上傳
信號發(fā)生模塊.JPG (762.99 KB, 下載次數(shù): 216)
下載附件
2016-1-12 01:26 上傳
實測輸出2MHz正弦波.JPG (641.65 KB, 下載次數(shù): 255)
下載附件
2016-1-12 01:25 上傳
實測輸出5MHz正弦波.JPG (632.46 KB, 下載次數(shù): 197)
下載附件
2016-1-12 01:25 上傳
實測輸出15MHz正弦波.JPG (633.18 KB, 下載次數(shù): 219)
下載附件
2016-1-12 01:26 上傳
0.png (36.1 KB, 下載次數(shù): 240)
下載附件
2016-1-12 01:23 上傳
dds信號發(fā)生器的原理圖文件
1.png (31.25 KB, 下載次數(shù): 213)
下載附件
2016-1-12 01:23 上傳
3種方式的源代碼
下面是全部完整的制作資料下載:
DDS信號發(fā)生器模塊制作資料.rar
(914.12 KB, 下載次數(shù): 661)
2016-1-12 01:25 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
程序編寫環(huán)境:win xp+Keil uVision 3(8.18)
主要功能模塊:STC89C516RD+單片機(是51內(nèi)核就行),AD9850信號發(fā)生芯片,JHD529M1型12864液晶模塊(帶中文字庫),4*4矩陣鍵盤
單片機IO口使用情況:
P0口接液晶顯示器數(shù)據(jù)線,
P1.0接液晶的RS(CS),P1.1接液晶的RW(SLD),P1.2接液晶的E(SCLK),P1.3接液晶的PSB,P1.4接液晶的RESET
P1.5接AD9850的RESET,P1.6接AD9850的WCLK,P1.7接AD9850的FQUD
P2口接鍵盤,P3口接AD9850,
鍵盤示意圖(4*4矩陣):
| 7 | 8 | 9 | set |
—————————————————————
| 4 | 5 | 6 | enter |
—————————————————————
| 1 | 2 | 3 | backspace |
—————————————————————
| . | 0 | 波形 | enter |
操作指南:
1.上電開機,顯示歡迎界面
2.按“確定”鍵,進入頻率設(shè)置界面
3.按“設(shè)置”鍵開始設(shè)置頻率,可以使用退格鍵。(整數(shù)最多5位,小樹最多3位)
4.按“確定”鍵完成輸入,此時從AD9850出可以得到所要頻率的波形。
5.需要重新設(shè)定頻率時,重復(fù)3,4步驟即可。
部分程序源碼預(yù)覽:
- /*************************************************************
- **項目:AD9850信號發(fā)生器設(shè)計
- **作者:徐士斌
- **版本:1.0.0.8
- **簡介:本程序接收來自4*4矩陣鍵盤輸入的頻率,并計算出相應(yīng)的
- 頻率控制字,寫到DDS芯片AD9850中,同時在LCD12864上顯示輸出頻率。
- *************************************************************/
- #include "lcdfun.h"
- #define uc unsigned char
- #define ui unsigned int
- #define MAXINPUT 13
- #define MAXZHENSHU 5
- #define MAXXIAOSHU 3
- sbit WCLK=P1^6;
- sbit FQUD=P1^7;
- sbit reset_9850=P1^5;
- uc i,j,t;
- uc vkey,key; //全局變量,存儲檢測到的/轉(zhuǎn)換得到的按鍵值
- //input存輸入的數(shù)字(input[0][]空出不用),num存輸入字符個數(shù),pdot存小數(shù)點的位置
- unsigned char input[MAXINPUT][1],num,pdot;
- unsigned char waveform=1;//輸出波形,1-sin 2-方波 3-三角波(沒用處)
- unsigned long zheng,xiao=0,freqctrlbyte;//輸入字符的整數(shù)、小數(shù)部分,頻率控制字
- unsigned long const_zheng=71,const_xiao;//常數(shù)
- unsigned long ulong1,ulong3,ulongtemp;
- const uc code CLEAR[] = {" "};
-
- uc code HELLO11[] = {"信息與通信中心"};
- uc code HELLO12[] = {"開放實驗"};
- uc code HELLO21[] = {"歡迎使用"};
- uc code HELLO22[] = {"信號發(fā)生器"};
- uc code HELLO23[] = {"點擊“確定”進入"};
-
- uc code HELLO32[] = {"狀態(tài):"};
- uc code HELLO33[] = {"頻率設(shè)定:"};
- uc code FH1[] = {"AD9850"};
- uc code FH2[] = {"KHz"};
- uc code SZ[][1]= {0x30,0x31,0x32,0x33,0x34,0x35,0x36,
- 0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46,0x2e,0x20,};
-
- const uc code NORMAL[] = {"正常"};
- const uc code ERROR[] = {"錯誤"};
- const uc code SIN[]= {"正弦"};
- const uc code FANGBO[] = {"方波"};
- const uc code TRI[] = {"三角"};
- const uc code SET[] = {"設(shè)置"};
- /*************************************************************
- 延時一毫秒子程序
- *************************************************************/
- void delay(uc a)
- {
- while(a--)
- for(i=100;i>0;i--);
- }
- /*************************************************************
- 檢測按鍵,按鍵值存到vkey中
- *************************************************************/
- unsigned int getkey()
- {
- uc a,b;
- while(1) //鍵盤掃描程序
- {
- vkey=0;
- P2=0xf0; //p2接矩陣鍵盤
- a=P2; //a存列信息
- if(a!=0xf0)
- {
- delay(10);
- P2=0x0f;
- b=P2; //b存行信息
- delay(10);
- switch(a|b)//c=a|b為鍵盤掃描的鍵值
- {
- case 0xee:
- {vkey=1;break;}
- case 0xde:
- {vkey=2;break;}
- case 0xbe:
- {vkey=3;break;}
- case 0x7e:
- {vkey=4;break;}
- case 0xed:
- {vkey=5;break;}
- case 0xdd:
- {vkey=6;break;}
- case 0xbd:
- {vkey=7;break;}
- case 0x7d:
- {vkey=8;break;}
- case 0xeb:
- {vkey=9;break;}
- case 0xdb:
- {vkey=10;break;}
- case 0xbb:
- {vkey=11;break;}
- case 0x7b:
- {vkey=12;break;}
- case 0xe7:
- {vkey=13;break;}
- case 0xd7:
- {vkey=14;break;}
- case 0xb7:
- {vkey=15;break;}
- case 0x77:
- {vkey=16;break; }
- default:
- {vkey=0;}
- }
- delay(200);//按鍵延時200ms
- return 0;
- }
- }//while(1)結(jié)束
- }
- /*************************************************************
- 顯示當(dāng)前輸出波形形狀
- *************************************************************/
- void playwaveform()
- {
- if(waveform==1)
- {Serial_DisplayStrings_WithAddress(0x9e,SIN);}
- if(waveform==2)
- {Serial_DisplayStrings_WithAddress(0x9e,FANGBO);}
- if(waveform==3)
- {Serial_DisplayStrings_WithAddress(0x9e,TRI);}
- }
- /*************************************************************
- 顯示歡迎界面
- *************************************************************/
- void welcome()
- {
- clearscreen();
- Serial_DisplayStrings_WithAddress(0x90,HELLO11);//信息與通信工程中心
- Serial_DisplayStrings_WithAddress(0x8a,HELLO12);//開放實驗
- delay(200);delay(200);delay(200);delay(200);
- delay(200);delay(200);delay(200);delay(200);
- delay(200);delay(200);delay(200);delay(200);
- clearscreen();
- Serial_DisplayStrings_WithAddress(0x82,HELLO21);//歡迎使用
- Serial_DisplayStrings_WithAddress(0x92,FH1);//AD9850
- Serial_DisplayStrings_WithAddress(0x89,HELLO22);//信號發(fā)生器
- Serial_DisplayStrings_WithAddress(0x98,HELLO23);//點擊“確定”進入
- }
- /*************************************************************
- 顯示正常工作界面
- *************************************************************/
- void hello3()
- {
- clearscreen();
- Serial_DisplayStrings_WithAddress(0x80,FH1); //AD9850
- Serial_DisplayStrings_WithAddress(0x83,HELLO22);//信號發(fā)生器
- Serial_DisplayStrings_WithAddress(0x90,HELLO33);//頻率設(shè)定:
- Serial_DisplayStrings_WithAddress(0x8d,FH2);//Hz
- Serial_DisplayStrings_WithAddress(0x98,HELLO32);//狀態(tài):
- Serial_DisplayStrings_WithAddress(0x9b,NORMAL);//顯示“正�!�
- playwaveform(); //顯示當(dāng)前波形形狀
- }
- /*************************************************************
- 向AD9850寫入頻率控制字
- *************************************************************/
- void writefreg(unsigned long freq)
- {
- unsigned char mw3=0x00,mw4=0x00;
- unsigned char mw0=0x00,mw1=0x00,mw2=0x00;
- mw4=freq&0x0ff;
- freq=freq/256;
- mw3=freq&0x0ff;
- freq=freq/256;
- mw2=freq&0x0ff;
- freq=freq/256;
- mw1=freq&0x0ff;
- mw0=0x00;
- P0=mw0;
- WCLK=0;
- WCLK=1;
-
- P0=mw1;
- WCLK=0;
- WCLK=1;
-
- P0=mw2;
- WCLK=0;
- WCLK=1;
-
- P0=mw3;
- WCLK=0;
- WCLK=1;
-
- P0=mw4;
- WCLK=0;
- WCLK=1;
- FQUD=0;
- FQUD=1;
- }
- /*************************************************************
- 將虛擬按鍵轉(zhuǎn)換成數(shù)字按鍵
- *************************************************************/
- void vkey2key()
- {
- switch(vkey)
- {
- case 1:{key=7;break;}
- case 2:{key=8;break;}
- case 3:{key=9;break;}
- case 5:{key=4;break;}
- case 6:{key=5;break;}
- case 7:{key=6;break;}
- case 9:{key=1;break;}
- case 10:{key=2;break;}
- case 11:{key=3;break;}
- case 14:{key=0;break;}
- case 13:{key=16;break;}////
- default:{key=20;}
- }
- }
- /*************************************************************
- 在LCD12864上顯示輸入的字符
- *************************************************************/
- void displayinput()
- {
- unsigned int t=0;
- //先清相關(guān)的屏
- for( i=0x88;i<=0x8f;i++)
- { Serial_DisplayStrings_WithAddress(i,CLEAR); }
- //顯示input數(shù)組內(nèi)容
- Serial_Write_LCD(COMMAND,BASIC_FUNCTION);//基本指令動作
- Serial_DDRAM_Address_Set(0x88);
- for(i=1;i<=num;i++)
- Serial_Write_LCD(DATA, SZ[input[i][0]][0]);
- Serial_DisplayStrings_WithAddress(0x8d,FH2);
- }
- /*************************************************************
- 由輸入的字符計算得到頻率控制字
- *************************************************************/
- unsigned char input2output()
- {
- unsigned long temp=1;
- t=0; ulongtemp=0;ulong3=0;
- ulong1=0;zheng=0;
- //計算輸入的整數(shù)部分
- if(pdot!=0)
- {for(i=1;i<pdot;i++)zheng=zheng*10+input[i][0];}
- else
- {for(j=1;j<=num;j++)zheng=zheng*10+input[j][0];}
- //計算輸入的小數(shù)部分
- if(pdot!=0)
- {
- xiao=0;
- for(i=pdot+1,temp=100;i<=num;i++,temp/=10)
- {xiao=xiao+input[i][0]*temp;}
- }
- zheng*=1000; //整數(shù)加權(quán)
- zheng=zheng+xiao; //其實沒有小數(shù)啦
- ulong1=zheng*(71);//71//42
- ulong3=zheng*0.582788267;//0.582788267//0.94967296
- freqctrlbyte=ulong1+ulong3;
- return 1;
- }
- /*************************************************************
- 確定鍵處理函數(shù)
- *************************************************************/
- void onok()
- {
- unsigned char result;
- result=input2output();
- if(result==1)
- writefreg(freqctrlbyte);
- Serial_DisplayStrings_WithAddress(0x9b,NORMAL);//顯示狀態(tài)“正�!�
- }
- /*************************************************************
- 初始化AD9850
- *************************************************************/
- void init_9850()
- {
- reset_9850 = 1;
- delay(100);
- reset_9850 = 0;
- }
- /*************************************************************
- 主函數(shù)
- *************************************************************/
- void main(void)
- {
- EA=0; //全局中斷不被允許
- Serial_Init_LCD();
- init_9850();
- welcome(); //hello12()
- s1: getkey();
- if(vkey==4) hello3();
- else {goto s1;}
- hello3();
- newstart:num=0;pdot=0;
- for(i=0;i<MAXINPUT;i++) input[i][0]=0x00;
- while(1)
- {
- getkey();
- if(vkey==4) //剛開始只有SET鍵有效,進入設(shè)置過程
- { //每次設(shè)置初始化//hello3();
- Serial_DisplayStrings_WithAddress(0x9b,SET);//顯示狀態(tài)“設(shè)置”
- num=0;pdot=0;for(i=0;i<MAXINPUT;i++)input[i][0]=0x00;
- displayinput();
-
- while(1)
- {
- getkey();
- switch(vkey)
- {
- case 0:
- {
- break;//由于沒有按鍵的時候vkey一直為0,所以一般此處不做任何處理
- }
- case 4:
- {
- num=0;pdot=0;
- displayinput();
- break;
- }
- case 8:
- {
- onok(); //暫時用這個鍵當(dāng)回車
- goto newstart;
- }
- case 12: //刪除
- {
- if(num<=0){num=0;pdot=0;break;}//已經(jīng)沒有輸入字符了
- if(num==pdot) //處理dot被刪除時的情況
- {pdot=0;num--;displayinput();break;}
- num--;
- displayinput();
- break;
- }
- case 13: //按鍵dot位
- {
- if((num+1)>(MAXINPUT-1))break; //總字符數(shù)超出范圍
- if(pdot!=0)break; //已經(jīng)有小數(shù)點了
- num++;pdot=num;vkey2key();
- input[num][0]=key;
- displayinput();
- break;
- }
- case 15: //波形選擇
- {
- waveform++;
- if(waveform>3)waveform=1;
- playwaveform();
- break;
- }
- case 16:
- {
- onok(); //回車,不過這個鍵不好用了
- goto newstart;
- break;
- }
- default:
- { if(num>=(MAXINPUT-1)){break;} //總字符數(shù)超出范圍
- if((pdot!=0)&&((num-pdot)>=MAXXIAOSHU))break;//小數(shù)個數(shù)超出范圍
- if((pdot==0)&&((num+1)>MAXZHENSHU))break; //整數(shù)個數(shù)超出范圍
- num++;
- vkey2key();//轉(zhuǎn)換
- input[num][0]=key;
- displayinput();
- }
- } //switch
- }//while
- }//if
- else continue;
- } //while
- }//main
- /************************************************************/
復(fù)制代碼
下面是設(shè)計文檔的預(yù)覽:
第1章 緒 論 1.1課題研究的意義與作用 1.2 DDS的研究現(xiàn)狀及發(fā)展趨勢 1.3 DDS的系統(tǒng)簡介 1.3.1 DDS的基本原理 1.3.2 DDS的能特點 1.3.3 實現(xiàn)AD9850信號發(fā)生系統(tǒng)的方案 1.4 液晶顯示器及其指令介紹 1.4.1 JHD529M1概述 1.4.2 JHD529M1基本特性: 1.4.3 JHD529M1模塊接口說明: 1.4.4 JHD529M1指令系統(tǒng)說明 第2章 信號發(fā)生系統(tǒng)硬件設(shè)計 2.1 系統(tǒng)功能實現(xiàn)及需求分析 2.2 主要電路設(shè)計 2.2.1正弦信號產(chǎn)生模塊設(shè)計 2.2.2 液晶顯示電路設(shè)計 2.2.3 鍵盤擴展電路設(shè)計 第3章 信號發(fā)生系統(tǒng)軟件設(shè)計 3.1 程序編寫及調(diào)試 3.2 程序設(shè)計思路及部分模塊測試程序 3.2.1 程序設(shè)計思路 3.2.2 部分模塊測試程序 第4章 系統(tǒng)參數(shù)性能測試及總結(jié) 4.1試驗參數(shù)測試結(jié)果 4.2實驗總結(jié) 致 謝 參考文獻
前 言 本系統(tǒng)以51單片機為控制核心,由正弦信號發(fā)生模塊、方波信號發(fā)生模塊以及測試信號發(fā)生模塊組成。采用數(shù)控的方法控制DDS芯片AD9850產(chǎn)生1Hz-20MHz正弦信號和方波信號。另外,本系統(tǒng)從簡單、調(diào)整方便、功能完備為出發(fā)點,基本實現(xiàn)了設(shè)計中的要求,波形輸出較穩(wěn)定,且精度較高。本設(shè)計還配備有LCD顯示屏、鍵盤,提供了友好的人機交互界面。
第1章 緒 論 1.1課題研究的意義與作用 1971年,美國學(xué)者j.Tierney等人撰寫的" A Digital Frequency Synthesizer"-文首次提出了以全數(shù)字技術(shù),從相位概念出發(fā)直接合成所需波形的一種新的頻率合成原理。限于當(dāng)時的技術(shù)和器件水平,它的性能指標(biāo)尚不能與已有的技術(shù)相比,故未受到重視。近10年間,隨著微電子技術(shù)的迅速發(fā)展,直接數(shù)字頻率合成器(Direct Digital Frequency Synthesis簡稱DDS或DDFS)得到了飛速的發(fā)展,它以有別于其它頻率合成方法的優(yōu)越性能和特點成為現(xiàn)代頻率合成技術(shù)中的姣姣者。具體體現(xiàn)在相對帶寬寬、頻率轉(zhuǎn)換時間短、頻率分辨率高、輸出相位連續(xù)、可產(chǎn)生寬帶正交信號及其他多種調(diào)制信號、可編程和全數(shù)字化、控制靈活方便等方面,并具有極高的性價比。 1.2 DDS的研究現(xiàn)狀及發(fā)展趨勢 在頻率合成(FS, Frequency Synthesis)領(lǐng)域中,常用的頻率合成技術(shù)有模擬鎖相環(huán)、數(shù)字鎖相環(huán)、小數(shù)分頻鎖相環(huán)(fractional-N PLL Synthesis)等,直接數(shù)字合成(Direct Digital Synthesis-DDS)是近年來新的FS技術(shù)。單片集成的DDS產(chǎn)品是一種可代替鎖相環(huán)的快速頻率合成器件。DDS是產(chǎn)生高精度、快速變換頻率、輸出波形失真小的優(yōu)先選用技術(shù)。DDS以穩(wěn)定度高的參考時鐘為參考源,通過精密的相位累加器和數(shù)字信號處理,通過高速D/A變換器產(chǎn)生所需的數(shù)字波形(通常是正弦波形),這個數(shù)字波經(jīng)過一個模擬濾波器后,得到最終的模擬信號波形。如圖1-1所示,通過高速DAC產(chǎn)生數(shù)字正弦數(shù)字波形,通過帶通濾波器后得到一個對應(yīng)的模擬正弦波信號,最后該模擬正弦波與一門限進行比較得到方波時鐘信號。 DDS系統(tǒng)一個顯著的特點就是在數(shù)字處理器的控制下能夠精確而快速地處理頻率和相位。除此之外,DDS的固有特性還包括:相當(dāng)好的頻率和相位分辨率(頻率的可控范圍達μHz級,相位控制小于0.09°),能夠進行快速的信號變換(輸出DAC的轉(zhuǎn)換速率300百萬次/秒)。這些特性使DDS在軍事雷達和通信系統(tǒng)中應(yīng)用日益廣泛。 其實,以前DDS價格昂貴、功耗大(以前的功耗達Watt級)、DAC器件轉(zhuǎn)換速率不高,應(yīng)用受到限制,因此只用于高端設(shè)備和軍事上。隨著數(shù)字技術(shù)和半導(dǎo)體工業(yè)的發(fā)展,DDS芯片能集成包括高速DAC器件在內(nèi)的部件,其功耗降低到mW級(AD9851在3.3v時功耗為650mW),功能增加了,價格便宜。因此,DDS也獲得廣泛的應(yīng)用:現(xiàn)代電子器件、通信技術(shù)、醫(yī)學(xué)成像、無線、PCS/PCN系統(tǒng)、雷達、衛(wèi)星通信。
dds%E4%BF%A1%E5%8F%B7%E5%8F%91%E7%94%9F%E5%99%A8%E8%AE%BE%E8%AE%A1%E6%8A%A5%E5%91%8Afinal.001.jpg (15.6 KB, 下載次數(shù): 228)
下載附件
2016-1-12 01:52 上傳
1.3 DDS的系統(tǒng)簡介 1.3.1 DDS的基本原理 DDS的基本原理是利用采樣定理,通過查表法產(chǎn)生波形。DDS的結(jié)構(gòu)有很多種,其基本的電路原理可用圖1-2來表示。
dds%E4%BF%A1%E5%8F%B7%E5%8F%91%E7%94%9F%E5%99%A8%E8%AE%BE%E8%AE%A1%E6%8A%A5%E5%91%8Afinal.002.jpg (13.64 KB, 下載次數(shù): 218)
下載附件
2016-1-12 01:52 上傳
相位累加器由N位加法器與N位累加寄存器級聯(lián)構(gòu)成。每來一個時鐘脈沖fs,加法器將頻率控制字K與累加寄存器輸出的累加相位數(shù)據(jù)相加,把相加后的結(jié)果送至累加寄存器的數(shù)據(jù)輸入端。累加寄存器將加法器在上一個時鐘脈沖作用后所產(chǎn)生的新相位數(shù)據(jù)反饋到加法器的輸入端,以使加法器在下一個時鐘脈沖的作用下繼續(xù)與頻率控制字相加。這樣,相位累加器在時鐘作用下,不斷對頻率控制字進行線性相位累加。由此可以看出,相位累加器在每一個時鐘脈沖輸入時,把頻率控制字累加一次,相位累加器輸出的數(shù)據(jù)就是合成信號的相位,相位累加器的溢出頻率就是DDS輸出的信號頻率。 用相位累加器輸出的數(shù)據(jù)作為波形存儲器(ROM)的相位取樣地址,這樣就可把存儲在波形存儲器內(nèi)的波形抽樣值(二進制編碼)經(jīng)查找表查出,完成相位到幅值轉(zhuǎn)換。波形存儲器的輸出送到D/A轉(zhuǎn)換器,D/A轉(zhuǎn)換器將數(shù)字量形式的波形幅值轉(zhuǎn)換成所要求合成頻率的模擬量形式信號。低通濾波器用于濾除不需要的取樣分量,以便輸出頻譜純凈的正弦波信號。 DDS在相對帶寬、頻率轉(zhuǎn)換時間、高分辨力、相位連續(xù)性、正交輸出以及集成化等一系列性能指標(biāo)方面遠遠超過了傳統(tǒng)頻率合成技術(shù)所能達到的水平,為系統(tǒng)提供了優(yōu)于模擬信號源的性能。 1.3.2 DDS的能特點 (1)輸出頻率相對帶寬較寬
輸出頻率帶寬為50%fs(理論值)。但考慮到低通濾波器的特性和設(shè)計難度以及對輸出信號雜散的抑制,實際的輸出頻率帶寬仍能達到40%fs。
(2)頻率轉(zhuǎn)換時間短
DDS是一個開環(huán)系統(tǒng),無任何反饋環(huán)節(jié),這種結(jié)構(gòu)使得DDS的頻率轉(zhuǎn)換時間極短。事實上,在DDS的頻率控制字改變之后,需經(jīng)過一個時鐘周期之后按照新的相位增量累加,才能實現(xiàn)頻率的轉(zhuǎn)換。因此,頻率轉(zhuǎn)換的時間等于頻率控制字的傳輸時間,也就是一個時鐘周期的時間。時鐘頻率越高,轉(zhuǎn)換時間越短。DDS的頻率轉(zhuǎn)換時間可達納秒數(shù)量級,比使用其它的頻率合成方法都要短數(shù)個數(shù)量級。
(3)頻率分辨率極高
若時鐘fs的頻率不變,DDS的頻率分辨率就由相位累加器的位數(shù)N決定。只要增加相位累加器的位數(shù)N即可獲得任意小的頻率分辨率。目前,大多數(shù)DDS的分辨率在1Hz數(shù)量級,許多小于1MHz甚至更小。
(4)相位變化連續(xù)
改變DDS輸出頻率,實際上改變的每一個時鐘周期的相位增量,相位函數(shù)的曲線是連續(xù)的,只是在改變頻率的瞬間其頻率發(fā)生了突變,因而保持了信號相位的連續(xù)性。
(5)輸出波形的靈活性
只要在DDS內(nèi)部加上相應(yīng)控制如調(diào)頻控制FM、調(diào)相控制PM和調(diào)幅控制AM,即可以方便靈活地實現(xiàn)調(diào)頻、調(diào)相和調(diào)幅功能,產(chǎn)生FSK、PSK、ASK和MSK等信號。另外,只要在DDS的波形存儲器存放不同波形數(shù)據(jù),就可以實現(xiàn)各種波形輸出,如三角波、鋸齒波和矩形波甚至是任意的波形。當(dāng)DDS的波形存儲器分別存放正弦和余弦函數(shù)表時,既可得到正交的兩路輸出。
(6)其他優(yōu)點
由于DDS中幾乎所有部件都屬于數(shù)字電路,易于集成,功耗低、體積小、重量輕、可靠性高,且易于程控,使用相當(dāng)靈活,因此性價比極高。 DDS也有局限性,主要表現(xiàn)在: (1)輸出頻帶范圍有限 由于DDS內(nèi)部DAC和波形存儲器(ROM)的工作速度限制,使得DDS輸出的最高頻有限。目前市場上采用CMOS、TTL、ECL工藝制作的DDS工習(xí)片,工作頻率一般在幾十MHz至400MHz左右。采用GaAs工藝的DDS芯片工作頻率可達2GHz左右。 (2)輸出雜散大 由于DDS采用全數(shù)字結(jié)構(gòu),不可避免地引入了雜散。其來源主要有三個:相位累加器相位舍位誤差造成的雜散;幅度量化誤差(由存儲器有限字長引起)造成的雜散和DAC非理想特性造成的雜散。 1.3.3 實現(xiàn)AD9850信號發(fā)生系統(tǒng)的方案 采用高性能DDS芯片的信號發(fā)生電路的解決方案,首先進行器件選型。隨著微電子技術(shù)的飛速發(fā)展,目前各種性能優(yōu)良的DDS產(chǎn)品不斷推出,AD公司的DDS系列產(chǎn)品以其較高的性能價格比,目前取得了極為廣泛的應(yīng)用。AD公司的常用DDS芯片選用列表見表1,下面僅對比較常用的AD公司的芯片作一簡單介紹。 表1 AD公司的常用DDS芯片選用列表 | | | | | | | | | 小型封裝,串行輸入,內(nèi)置D/A轉(zhuǎn)換器。 | | | | | 低電壓,經(jīng)濟,內(nèi)置D/A轉(zhuǎn)換器。 | | | | | | | | | | 20個管腳的TSSOP封裝并內(nèi)置比較器。 | | | | | 經(jīng)濟,小型封裝,串行輸入,內(nèi)置D/A轉(zhuǎn)換器。 | | | | | 經(jīng)濟,并行輸入,內(nèi)置D/A轉(zhuǎn)換器。 | | | | | 內(nèi)置比較器和D/A轉(zhuǎn)換器。 | | | | | 可編程數(shù)字QPSK/16-QAM調(diào)制器。 | | | | | 內(nèi)置比較器、D/A轉(zhuǎn)換器和時鐘6倍頻器。 | | | | | 內(nèi)置12位的D/A轉(zhuǎn)換器、高速比較器、線性調(diào)頻和可編程參考時鐘倍頻器。 | | | | | 內(nèi)置12位兩路正交D/A轉(zhuǎn)換器、高速比較器和可編程參考時鐘倍頻器。 | | | | | 內(nèi)置10位的D/A轉(zhuǎn)換器、150MHz相頻檢測器、充電汞和2GHz混頻器。 | AD9850 采用先進的CMOS 工藝, 其功耗在3.3V 供電時僅為155mW,溫度范圍為-40~80℃, 采用28 腳SSOP 表面封裝形式。圖2.3為其組成框圖。圖中層虛線內(nèi)是一個完整的可編程DDS系統(tǒng),外層虛線內(nèi)包含了AD9850的主要組成部分。AD9850內(nèi)含可編程DDS系統(tǒng)和高速比較器,能實現(xiàn)全數(shù)字編程控制的頻率合成�?删幊藾DS系統(tǒng)的核心是相位累加器, 它由一個加法器和一個N位相位寄存器組成,N為32;每來一個外部參考時鐘,相位寄存器便以步長M遞加;相位寄存器的輸出與相位控制字相加后可輸入到正弦查詢表地址上;正弦查詢表包含一個正弦波周期的數(shù)字幅度信息, 每一個地址對應(yīng)正弦波中 0°~360°范圍的一個相位點;查詢表把輸入地址的相位信息映射成正弦波幅度信號, 然后驅(qū)動DAC 以輸出模擬量。 相位寄存器每過2N/M個外部參考時鐘后返回到初始狀態(tài)一次, 相應(yīng)地正弦查詢表每經(jīng)過一個循環(huán)也回到初始位置, 從而使整個DDS系統(tǒng)輸出一個正弦波。輸出的正弦波周期TO = Tc2N/M,頻率fout = Mfc/2N ,Tc、fc 分別為外部參考時鐘的周期和頻率。AD9850采用32位的相位累加器將信號截斷成14 位輸入到正弦查詢表,查詢表的輸出再被截斷成10 位后輸入到DAC, DAC輸出兩個互補的電流。
dds%E4%BF%A1%E5%8F%B7%E5%8F%91%E7%94%9F%E5%99%A8%E8%AE%BE%E8%AE%A1%E6%8A%A5%E5%91%8Afinal.003.jpg (23.15 KB, 下載次數(shù): 290)
下載附件
2016-1-12 01:52 上傳
圖 2.3 AD9850信號發(fā)生系統(tǒng)組成框圖 DAC滿量程輸出電流通過一個外接電阻RSET調(diào)節(jié), 調(diào)節(jié)關(guān)系為ISET = 32 (1.248V/ RSET) , RSET的典型值是3.9kΩ。其系統(tǒng)功能結(jié)構(gòu)如圖2.4所示。AD9850在接上精密時鐘源和寫入頻率相位控制字之后就可產(chǎn)生一個頻率和相位都可編程控制的模擬正弦波輸出, 此正弦波可直接用作頻率信號源或經(jīng)內(nèi)部的高速比較器轉(zhuǎn)換為方波輸出。在125MHz 的時鐘下, 32 位的頻率控制字可使AD9850 的輸出頻率分辨率達0.0291Hz;并具有5位相位控制位,而且允許相位按增量180°、90°、45°、22.5°、11.25°或這些值的組合進行調(diào)整。
dds%E4%BF%A1%E5%8F%B7%E5%8F%91%E7%94%9F%E5%99%A8%E8%AE%BE%E8%AE%A1%E6%8A%A5%E5%91%8Afinal.004.jpg (35.46 KB, 下載次數(shù): 247)
下載附件
2016-1-12 01:52 上傳
圖 2.4 AD9850結(jié)構(gòu) 1.4 液晶顯示器及其指令介紹 1.4.1 JHD529M1概述 帶中文字庫的128X64是一種具有4位/8位并行、2線或3線串行多種接口方式,內(nèi)部含有國標(biāo)一級、二級簡體中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為128×64, 內(nèi)置8192個16*16點漢字,和128個16*8點ASCII字符集.利用該模塊靈活的接口方式和簡單、方便的操作指令,可構(gòu)成全中文人機交互圖形界面。可以顯示8×4行16×16點陣的漢字. 也可完成圖形顯示.低電壓低功耗是其又一顯著特點。由該模塊構(gòu)成的液晶顯示方案與同類型的圖形點陣液晶顯示模塊相比,不論硬件電路結(jié)構(gòu)或顯示程序都要簡潔得多,且該模塊的價格也略低于相同點陣的圖形液晶模塊。 1.4.2 JHD529M1基本特性: (1)低電源電壓(VDD:+3.0--+5.5V) (2)顯示分辨率:128×64點 (3)內(nèi)置漢字字庫,提供8192個16×16點陣漢字(簡繁體可選) (4)內(nèi)置 128個16×8點陣字符 (5)2MHZ時鐘頻率 (6)顯示方式:STN、半透、正顯 (7)驅(qū)動方式:1/32DUTY,1/5BIAS (8)視角方向:6點 (9)背光方式:側(cè)部高亮白色LED,功耗僅為普通LED的1/5—1/10 (10)通訊方式:串行、并口可選 (11)內(nèi)置DC-DC轉(zhuǎn)換電路,無需外加負壓 (12)無需片選信號,簡化軟件設(shè)計 (13)工作溫度: 0℃ - +55℃ ,存儲溫度: -20℃ - +60℃ 1.4.3 JHD529M1模塊接口說明: 硬件接口 管腳號 | 管腳名稱 | 電平 | 管腳功能描述 | 1 | VSS | 0V | 電源地 | 2 | VCC | 3.0+5V | 電源正 | 3 | V0 | - | 對比度(亮度)調(diào)整 | 4 | RS(CS) | H/L | RS=“H”,表示DB7——DB0為顯示數(shù)據(jù) RS=“L”,表示DB7——DB0為顯示指令數(shù)據(jù) | 5 | R/W(SID) | H/L | R/W=“H”,E=“H”,數(shù)據(jù)被讀到DB7——DB0 R /W=“L”,E=“H→L”, DB7——DB0的數(shù)據(jù)被寫到 IR或DR | 6 | E(SCLK) | H/L | 使能信號 | 7 | DB0 | H/L | 三態(tài)數(shù)據(jù)線 | 8 | DB1 | H/L | 三態(tài)數(shù)據(jù)線 | 9 | DB2 | H/L | 三態(tài)數(shù)據(jù)線 | 10 | DB3 | H/L | 三態(tài)數(shù)據(jù)線 | 11 | DB4 | H/L | 三態(tài)數(shù)據(jù)線 | 12 | DB5 | H/L | 三態(tài)數(shù)據(jù)線 | 13 | DB6 | H/L | 三態(tài)數(shù)據(jù)線 | 14 | DB7 | H/L | 三態(tài)數(shù)據(jù)線 | 15 | PSB | H/L | H:8位或4位并口方式,L:串口方式(見注釋1) | 16 | NC | - | 空腳 | 17 | /RESET | H/L | 復(fù)位端,低電平有效(見注釋2) | 18 | VOUT | - | LCD驅(qū)動電壓輸出端 | 19 | A | VDD | 背光源正端(+5V)(見注釋3) | 20 | K | VSS | 背光源負端(見注釋3) | *注釋1:如在實際應(yīng)用中僅使用并口通訊模式,可將PSB接固定高電平,也可以將模塊上的J8和“VCC”用焊錫短接。 *注釋2:模塊內(nèi)部接有上電復(fù)位電路,因此在不需要經(jīng)常復(fù)位的場合可將該端懸空。 *注釋3:如背光和模塊共用一個電源,可以將模塊上的JA、JK用焊錫短接。 1.4.4 JHD529M1指令系統(tǒng)說明 模塊控制芯片提供兩套控制命令,基本指令和擴充指令如下: 指令表1:(RE=0:基本指令) | | | | | | | | | | | | | | | | | | | | | | | | 將DDRAM填滿"20H",并且設(shè)定DDRAM的地址計數(shù)器(AC)到"00H" | | | | | | | | | | | | 設(shè)定DDRAM的地址計數(shù)器(AC)到"00H",并且將游標(biāo)移到開頭原點位置;這個指令不改變DDRAM 的內(nèi)容 | | | | | | | | | | | | D=1: 整體顯示 ON C=1: 游標(biāo)ON B=1:游標(biāo)位置反白允許 | | | | | | | | | | | | 指定在數(shù)據(jù)的讀取與寫入時,設(shè)定游標(biāo)的移動方向及指定顯示的移位 | | | | | | | | | | | | 設(shè)定游標(biāo)的移動與顯示的移位控制位;這個指令不改變DDRAM 的內(nèi)容 | | | | | | | | | | | | DL=0/1:4/8位數(shù)據(jù) RE=1: 擴充指令操作 RE=0: 基本指令操作 | | | | | | | | | | | | | | | | | | | | | | | | 設(shè)定DDRAM 地址(顯示位址) 第一行:80H-87H 第二行:90H-97H | | | | | | | | | | | | 讀取忙標(biāo)志(BF)可以確認內(nèi)部動作是否完成,同時可以讀出地址計數(shù)器(AC)的值 | | | | | 將數(shù)據(jù)D7——D0寫入到內(nèi)部的RAM (DDRAM/CGRAM/IRAM/GRAM) | | | | | 從內(nèi)部RAM讀取數(shù)據(jù)D7——D0 (DDRAM/CGRAM/IRAM/GRAM) | 指令表2:(RE=1:擴充指令) | | | | | | | | | | | | | | | | | | | | | | | | 進入待命模式,執(zhí)行其他指令都棵終止 待命模式 | | | | | | | | | | | | SR=1:允許輸入垂直卷動地址 SR=0:允許輸入IRAM和CGRAM地址 | | | | | | | | | | | | 選擇2行中的任一行作反白顯示,并可決定反白與否。初始值R1R0=00,第一次設(shè)定為反白顯示,再次設(shè)定變回正常 | | | | | | | | | | | | | | | | | | | | | | | | CL=0/1:4/8位數(shù)據(jù) RE=1: 擴充指令操作 RE=0: 基本指令操作 G=1/0:繪圖開關(guān) | | | | | | | | | | | | 設(shè)定繪圖RAM 先設(shè)定垂直(列)地址AC6AC5…AC0 再設(shè)定水平(行)地址AC3AC2AC1AC0 將以上16位地址連續(xù)寫入即可 | 備注:當(dāng)IC1在接受指令前,微處理器必須先確認其內(nèi)部處于非忙碌狀態(tài),即讀取BF標(biāo)志時,BF需為零,方可接受新的指令;如果在送出一個指令前并不檢查BF標(biāo)志,那么在前一個指令和這個指令中間必須延長一段較長的時間,即是等待前一個指令確實執(zhí)行完成。
第2章 信號發(fā)生系統(tǒng)硬件設(shè)計 2.1 系統(tǒng)功能實現(xiàn)及需求分析 本設(shè)計采用STC89C516RD+單片機作為主要芯片來實現(xiàn)對AD9850芯片、液晶顯示模塊等外設(shè)的控制,STC89C516RD+單片機有64kflash并且保密性能十分優(yōu)秀,完全可以滿足本設(shè)計的要求。用液晶顯示模塊可以實時顯示AD9850信號發(fā)生系統(tǒng)的工作狀態(tài)(當(dāng)前輸出頻率,控制系統(tǒng)運行狀態(tài)),提供有好的操作界面。利用鍵盤的外部輸入實現(xiàn)對輸出頻率的控制和設(shè)定。基于設(shè)計功能需求,本設(shè)計采用的是4×4矩陣式鍵盤,這樣可以合理地利用硬件資源,并且編程靈活。 2.2 主要電路設(shè)計
dds%E4%BF%A1%E5%8F%B7%E5%8F%91%E7%94%9F%E5%99%A8%E8%AE%BE%E8%AE%A1%E6%8A%A5%E5%91%8Afinal.005.jpg (13.24 KB, 下載次數(shù): 235)
下載附件
2016-1-12 01:52 上傳
圖2.1 系統(tǒng)的總體框圖 2.2.1正弦信號產(chǎn)生模塊設(shè)計 正弦信號產(chǎn)生模塊的主要部分是AD9850芯片及其外圍電路的設(shè)計。芯片輸出信號經(jīng)過橢圓形濾波器后得到正弦波,信號送回到AD9850芯片,最終輸出方波。 電路中重要的節(jié)點都可以用短路帽連接,也可以選擇性的斷開某部分電路。
dds%E4%BF%A1%E5%8F%B7%E5%8F%91%E7%94%9F%E5%99%A8%E8%AE%BE%E8%AE%A1%E6%8A%A5%E5%91%8Afinal.006.jpg (43.94 KB, 下載次數(shù): 228)
下載附件
2016-1-12 01:52 上傳
圖2.2 AD9850信號發(fā)生模塊的設(shè)計 2.2.2 液晶顯示電路設(shè)計
dds%E4%BF%A1%E5%8F%B7%E5%8F%91%E7%94%9F%E5%99%A8%E8%AE%BE%E8%AE%A1%E6%8A%A5%E5%91%8Afinal.007.jpg (43.5 KB, 下載次數(shù): 221)
下載附件
2016-1-12 01:52 上傳
圖2.3 液晶顯示界面模塊的硬件設(shè)計 2.2.3 鍵盤擴展電路設(shè)計
dds%E4%BF%A1%E5%8F%B7%E5%8F%91%E7%94%9F%E5%99%A8%E8%AE%BE%E8%AE%A1%E6%8A%A5%E5%91%8Afinal.008.jpg (49.02 KB, 下載次數(shù): 217)
下載附件
2016-1-12 01:52 上傳
圖2.4 鍵盤控制模塊的硬件設(shè)計
第3章 信號發(fā)生系統(tǒng)軟件設(shè)計 系統(tǒng)軟件部分主要包括了具有友好的交互式操作界面,各種信號的設(shè)置和控制。正弦波產(chǎn)生過程為:頻率設(shè)置,同步顯示,數(shù)據(jù)處理,然后控制DDS芯片完成各種頻率的正弦波產(chǎn)生;方波產(chǎn)生過程為:正弦波輸入到AD9850后不經(jīng)過比較,輸出方波。(詳細程序見附錄) 3.1 程序編寫及調(diào)試 程序編寫環(huán)境:Windows xp+Keil C8.18 3.2 程序設(shè)計思路及部分模塊測試程序 3.2.1 程序設(shè)計思路 單片機得到鍵盤的輸入,并將輸入內(nèi)容顯示到LCD屏幕上,按"確定"鍵后,利用輸入的頻率值計算得到相應(yīng)的頻率控制字,送到AD9850中,通過波形發(fā)生電路產(chǎn)生正確的波形輸出。 下面為程序流程圖:
dds%E4%BF%A1%E5%8F%B7%E5%8F%91%E7%94%9F%E5%99%A8%E8%AE%BE%E8%AE%A1%E6%8A%A5%E5%91%8Afinal.009.jpg (43.78 KB, 下載次數(shù): 217)
下載附件
2016-1-12 01:52 上傳
圖 3.1 程序流程圖 3.2.2 部分模塊測試程序 1.液晶顯示模塊控制 液晶顯示模塊用于同步顯示用戶輸入結(jié)果和系統(tǒng)運行狀態(tài),在系統(tǒng)運行開始時顯示歡迎界面。所有相關(guān)功能都封裝在lcdfun.h頭文件中。系統(tǒng)可以調(diào)用四個主要功能函數(shù): void Serial_Init_LCD(void); void Serial_Write_LCD( bit b_Data_Command , unsigned char uc_Content); void Serial_DDRAM_Address_Set(uchar ucDDramAdd); void Serial_DisplayStrings_WithAddress(uchar ucAdd,uchar code *p); 這四個函數(shù)分別完成LCD初始化、寫LCD、設(shè)置DDRAN地址、在LCD上顯示一個字符串的功能。其他還有清屏、延時等函數(shù)。 鍵盤輸入的字符存儲在一個input數(shù)組內(nèi),變量num存輸入字符個數(shù),pdot存小數(shù)點的位置。同時提供退格鍵功能,并進行了相關(guān)的容錯處理。本系統(tǒng)由于程序運行時間空余較多,故鍵盤通過程序掃描實現(xiàn)。如果改用中斷實現(xiàn),可以在鍵盤上加一個與非門即可。 通過鍵盤輸入的字符在input2output()函數(shù)中被轉(zhuǎn)換成二進制數(shù)字,然后經(jīng)過簡單運算,得到需要的頻率控制字,保存在freqctrlbyte變量中。
第4章 系統(tǒng)參數(shù)性能測試及總結(jié)
4.1試驗參數(shù)測試結(jié)果 - 測試儀器
·GWINSTEC 50M雙蹤模擬示波器;
·Tektronix 60M雙通道數(shù)字示波器; 2、指標(biāo)測試 (1) 正弦波指標(biāo)測試 把正弦波輸出端接入示波器,以1K,2K,5K,10K,50K,100K,500K,1M,2M,5M,10M,15M,20M作為測試點,得到如表3.1數(shù)據(jù)。 表 3.1 正弦波指標(biāo)測試數(shù)據(jù) 期望頻率 | 輸出頻率 | 失真度 ( 目測 ) | 1KHz | 1.14005KHz | 無 | 2KHz | 2.19247KHz | 無 | 5KHz | 5.61477KHz | 無 | 10KHz | 10.6178KHz | 無 | 50KHz | 51.6379KHz | 無 | 100KHz | 102.059KHz | 無 | 500KHz | 500.001KHz | 無 | 1MHz | 1.00000MHz | 無 | 2MHz | 2.00000MHz | 無 | 5MHz | 5.00001MHz | 無 | 10MHz | 10.00000MHz | 少許尖頂 | 15MHz | 15.00000MHz | 少許尖頂 | 20MHz | 20.00000MHz | 少許尖頂 |
由上表可見,正弦波輸出頻率在1KHz~500KHz帶寬內(nèi)輸出存在頻率誤差,在500KHz~20MHz帶寬內(nèi)誤差在0.001%之內(nèi)。但輸出頻率高于10MHz時輸出波形就會出現(xiàn)少許失真,原因可能是電路設(shè)計不足,跳線太多,造成高頻干擾。 (2) 方波指標(biāo)測試
把方波輸出信號接入示波器,目測輸出波形,測試數(shù)據(jù)如表3.2。 表 3.2 方波指標(biāo)測試數(shù)據(jù) 期望頻率 | 輸出頻率 | 失真度 ( 目測 ) | 1KHz | 1.000KHz | 輕微毛刺 | 2KHz | 2.000KHz | 輕微毛刺 | 5KHz | 5.000KHz | 輕微毛刺 | 10KHz | 10.001KHz | 輕微毛刺 | 50KHz | 50.001KHz | 少許毛刺 | 100KHz | 100.0KHz | 少許毛刺 | 500KHz | 500.0KHz | 少許毛刺 | 1MHz | 1.000MHz | 少許毛刺 | 2MHz | 2.000MHz | 毛刺變大 | 3MHz | 3.030MHz | 毛刺變大 | 5MHz | 5.000M | 毛刺變大 |
由上表可見,方波輸出頻率在1KHz~5MHz帶寬內(nèi)輸出頻率誤差很小。但輸出頻率高于5MHz時輸出波形就會出現(xiàn)很大失真,到10M以上時已經(jīng)近似三角波。原因可能是濾波電路設(shè)計濾波性能存在偏差,導(dǎo)致輕微毛刺始終存在。 4.2實驗總結(jié) 在確定了自己的開放實驗題目以后,我翻閱和瀏覽了許多相關(guān)資料,對ad9850的功能、優(yōu)點有了較多的了解,經(jīng)過功能分析和可行性研究,制定了設(shè)計方案和計劃。經(jīng)過潛心鉆研和指導(dǎo)老師的耐心指點,逐步完成了正弦信號輸出模塊、液晶顯示模塊、鍵盤輸入模塊等的電路設(shè)計和編程,并融合在一起,后期又不斷進行改進。在完成之時,我感到收獲頗豐,對STC單片機的體系結(jié)構(gòu)、工作原理和編程原理有了更深的了解,達到了能初步應(yīng)用的水平;熟悉了Keil C程序開發(fā)環(huán)境,已能夠在Keil C集成開發(fā)環(huán)境下編寫和調(diào)試各個系列單片機的模塊和整體程序;熟練了PROTEL畫圖軟件,熟悉了億圖專業(yè)流程圖制作工具;在實際電路組裝過程中,積累了一些經(jīng)驗,鍛煉了動手能力。
致 謝 經(jīng)過三個多月的學(xué)習(xí)和鍛煉,本次開放實驗基本完成并達到了預(yù)期目標(biāo)。在這期間自己的自學(xué)能力、創(chuàng)新能力、實際動手能力、獨立分析問題和解決問題的能力等都有了一個比較大的提高。在開放實驗過程中不僅使自己以往所學(xué)理論知識得到鞏固提高,而且在實際設(shè)計過程中獲得了一些新的認識和想法,更為重要的是開拓了自己的眼界和思路,掌握了一些基本的科學(xué)研究步驟和方法,培養(yǎng)了自己的科學(xué)精神。 |