基于AD9854的DDS外围电路设计和程序 - 图文

更新时间:2024-03-21 00:18:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

前段时间非常忙,AD9854这个芯片真是整的我头好疼,虽然在网上也查了大量的资料,不过关于AD9854使用的资料真是少之又少,无奈,只好自己去研究DATASHEET,好在终于实现了,并且通过调试,输出波形稳定!现在把我的设计法出来供大家使用参考。原理图和PCB图为AD9854外围电路!

以下是AD9854的控制程序!

//#include #include \#include #define USE_KEY 0

#define uchar unsigned char

#define uint unsigned int #define schar signed char #define sint signed int

#define ulong unsigned long int //须主程序定义的参数 /

sbit ADDR0 =P2^0; // sbit ADDR1 =P2^1; // sbit ADDR2 =P2^2; // sbit ADDR3 =P2^3; // sbit ADDR4 =P2^4; // sbit ADDR5 =P2^5; // /

sbit AD_FUD =P3^7; //UP_DATA sbit RUN =P3^2;

sbit WR_LOW =P3^5; // WR sbit MASTER_RESET=P3^3;

bit bdata F_Flag,OneSec_Flag,Re_Flag,P_Flag; //

uchar SecOne; uchar Time_count; uchar AD_Addr; uchar dats;

uchar TAB_Data[40]; //

//初始化串口。配置定时器 // void

initial_system() {

EA = 0;

TMOD=0x21; //初始化定时器0 PCON=0x00; SCON=0x50;

TH0 = 0xdc; //10毫秒定时, 采用晶体11.0592 定时器0,方式1 TL0 = 0x00;

TH1 = 0xfd; //波特率9600 采用晶体11.0592 定时器1,方式1 TL1 = 0xfd;

TR0 =1; //开启定时器0 TR1 =1; //开启定时器0 ET0 =1; //时钟0

ES =0; //开串口中断 EA = 1 ; // 使能所有中断 }

void Timer0() interrupt 1 using 3 {

TH0 = 0xdc; //10毫秒 采用晶体11.0592 定时器0,方式1 TL0 = 0x00; SecOne++;

if(SecOne>200) //计时1秒钟 {

SecOne=0x00; OneSec_Flag=1; RUN=~RUN; } } //

void AD9854_delay(int time) {

int i;

for(i = 0; i < time; i++) {

_nop_(); _nop_(); _nop_(); _nop_(); } }

void TAB_DataWord() {

TAB_Data[0]=0x00; //00H Phase Adjust Register #1 <13:8> (Bits 15, 14 don't care) Phase #1 相位为0

TAB_Data[1]=0x00; //01H Phase Adjust Register #1 <7:0> 01H

TAB_Data[2]=0x00; //02H Phase Adjust Register #2 <13:8> (Bits 15, 14 don't care) Phase #2 相位为0

TAB_Data[3]=0x00; //03H Phase Adjust Register #1 <7:0> 03H //100M

TAB_Data[4]=0X31; //Frequency Tuning Word 1 <47:40>//623795E0184A TAB_Data[5]=0X1B; //Frequency Tuning Word 1 <39:32> TAB_Data[6]=0xE6; //Frequency Tuning Word 1 <31:24> TAB_Data[7]=0xE6; //Frequency Tuning Word 1 <23:16> TAB_Data[8]=0x53; //Frequency Tuning Word 1 <15:8> TAB_Data[9]=0x86; //Frequency Tuning Word 1 <7:0> //FTW2

TAB_Data[10]=0x31; //Frequency Tuning Word 2 <47:40

TAB_Data[11]=0x1B; //Frequency Tuning Word 2 <39:32> TAB_Data[12]=0xE6; //Frequency Tuning Word 2 <31:24> TAB_Data[13]=0xE6; //Frequency Tuning Word 2 <23:16> TAB_Data[14]=0x53; //Frequency Tuning Word 2 <15:8>

TAB_Data[15]=0x86; //Frequency Tuning Word 2 <7:0> //500KHZ //FTW

TAB_Data[16]=0x01; //Delta Frequency Word <47:40> TAB_Data[17]=0x47; //Delta Frequency Word <39:32> TAB_Data[18]=0xAE; //Delta Frequency Word <31:24> TAB_Data[19]=0x14; //Delta Frequency Word <23:16> TAB_Data[20]=0x7A; //Delta Frequency Word <15:8>

TAB_Data[21]=0xE1; //Delta Frequency Word <7:0> 三角波 //频率为0 //Upclok

TAB_Data[22]=0x00; //Update Clock <31:24> TAB_Data[23]=0x00; //Update Clock <23:16> TAB_Data[24]=0x00; //Update Clock <15:8>

TAB_Data[25]=0xF0; //Update Clock <7:0> //系统出现寄存器更新信号reg. Int Update Clk.=0;外部更新

TAB_Data[26]=0x00; //Ramp Rate Clock <19:16> (Bits 23, 22, 21, 20 don't care) TAB_Data[27]=0x00; //Ramp Rate Clock <15:8> TAB_Data[28]=0x00; //Ramp Rate Clock <7:0>

TAB_Data[29]=0x10; //Don't Care(0),Don't Care(0),Don't Care(0),Comp PD (1),Reserved_Always Low(0),QDAC PD(0),DAC PD(0),DIG PD(0).

TAB_Data[30]=0x20; //Don't Care(0),PLL Range(1),Bypass PLL(1),Ref Mult 4(0),Ref Mult 3(0),Ref Mult 2(0),Ref Mult 1(0),Ref Mult 0(0).

TAB_Data[31]=0x10; //CLR ACC1(0),CLR ACC2(0),Triangle(0)(三角波),SRC QDAC(0),Mode

2(0),Mode 1(0),Mode 0(0),Int Update Clk(0). 注意

TAB_Data[32]=0x50; //Don't Care(0),Bypass_Inv_Sinc(0),OSK EN(0),OSK INT(0),Don't Care(0),Don't Care(0),LSB First(0),SDO_Active(0).

TAB_Data[33]=0x00; //Output Shape Key I Mult <11:8> (Bits 15, 14, 13, 12 don't care)

TAB_Data[34]=0x0F; //Output Shape Key I Mult <7:0>

TAB_Data[35]=0x00; //Output Shape Key Q Mult <11:8> (Bits 15, 14, 13, 12 don't care)

TAB_Data[36]=0x0F; //Output Shape Key Q Mult <7:0> TAB_Data[37]=0xFF; //Output Shape Key Ramp Rate <7:0>

TAB_Data[38]=0x00; //QDAC <11:8> (Bits 15, 14, 13, 12 don't care)

TAB_Data[39]=0x0F; //QDAC <7:0> (Data is required to be in twos complement format) }

void AD9854_ParallelSendByte(uchar addr,uchar data1)

{

// WR_LOW=0; //lhyaddr WR_LOW=WRB _nop_();

P2=addr&0x3F; _nop_(); P1=data1;

WR_LOW=0; //lhyaddr WR_LOW=WRB _nop_();

WR_LOW=1; _nop_(); _nop_();

WR_LOW=0; //lhyaddr WR_LOW=WRB }

data0=*(SWord+i);

AD9854_ParallelSendByte(Special_addr,data0); AD9854_delay(5); } }

void Init9854(void) {

WR_LOW=0; AD_FUD=0;

MASTER_RESET=0; } //

void main(void) { uchar i;

MASTER_RESET=0;

initial_system(); //系统初始化 Init9854();

TAB_DataWord(); MASTER_RESET=0; _nop_(); _nop_(); _nop_(); _nop_();

MASTER_RESET=1; AD9854_delay(30); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

MASTER_RESET=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

AD9854_delay(500); AD9854_delay(500); AD9854_delay(500); for (i=0;i<40;i++) {

dats=TAB_Data[i]; AD_Addr=i;

AD9854_ParallelSendByte(AD_Addr,dats); }

_nop_(); AD_FUD=0; _nop_(); _nop_(); _nop_(); AD_FUD=1;

AD9854_delay(80); _nop_(); _nop_();

AD_FUD=0; while(1) {

if(OneSec_Flag==1) {

_nop_(); _nop_(); _nop_();

AD9854_delay(80); _nop_(); _nop_(); _nop_();

AD9854_delay(80); _nop_();

for (i=0;i<40;i++)

{

dats=TAB_Data[i]; AD_Addr=i;

AD9854_ParallelSendByte(AD_Addr,dats); }

_nop_(); AD_FUD=0; _nop_(); _nop_();

AD9854_delay(80); AD_FUD=1; _nop_();

AD9854_delay(80); _nop_(); _nop_();

AD_FUD=0;

OneSec_Flag=0; }

_nop_(); _nop_(); } }

本文来源:https://www.bwwdw.com/article/ygo8.html

Top