高清晰AD9854中文资料附带51程序

更新时间:2023-11-16 20:23:01 阅读量: 教育文库 文档下载

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

DDS模块设计

DDS模块的设计是本系统的重点,也是本章阐述的重点。DDS模块主要是围绕芯片AD9854进行设计的,设计要求既要满足性能指标,还要求优化电路,减小电路面积,否则13路DDS共同存在会使系统体积显得较大。下面先介绍AD9854的基本特性。

4.2.1 AD9854介绍

时钟模式参考时钟输入4*-20*参考频率倍频器频率累加器相位累加器14位相位偏置字波形存储器数字乘法器逆sinc滤波器上升和下降边沿乘法器12位D/A模拟信号输出12位幅度调制数据48位频率转换字FSK/BPSK/HOLD更新双向寄存器更新信号频率控制字,以及频率控制逻辑12位控制数据12位D/A模拟信号输出比较器输入程序寄存器读信号写信号I/O端口缓冲器6位地址总线8位数据总线程序更新时钟比较器输出串行/并行选择复位电源地图4-2 AD9854功能结构框图

chart4-2 AD9854 function and structure

如图4-2所示,AD9854内部包括一个具有48位相位累加器、一个可编程时钟倍频器、一个反sinc滤波器、两个12位300MHz DAC,一个高速模拟比较器以及接口逻辑电路。其主要性能特点如下:

1. 高达300MHz的系统时钟;

2. 能输出一般调制信号,FSK,BPSK,PSK,CHIRP,AM等; 3. 100MHz时具有80dB的信噪比;

4. 内部有4*到20*的可编程时钟倍频器;

5. 两个48位频率控制字寄存器,能够实现很高的频率分辨率。 6. 两个14位相位偏置寄存器,提供初始相位设置。

7. 带有100MHz的8位并行数据传输口或10MHz的串行数据传输口。 AD9854的芯片封装图如下:

图4-3 AD9854芯片封装图 chart4-3 AD9854 chip encapsulation

AD9854有40个程序寄存器,对AD9854的控制就是对这些程序寄存器写数据实现的。

表4-1 AD9854并行接口寄存器功能

Table 4-1 AD9854 parallel interface registers function 并行地址 寄存器功能 默认值 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 相位寄存器#1<13:8>(15,14位无效) 相位寄存器#1<7:0> 相位寄存器#2<13:8>(15,14位无效) 相位寄存器#2<7:0> 频率转换字#1<47:40> 频率转换字#1<39:32> 频率转换字#1<31:24> 频率转换字#1<23:16> 频率转换字#1<15:8> 频率转换字#1<7:0> 频率转换字#1<47:40> 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x0B 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 频率转换字#1<39:32> 频率转换字#1<31:24> 频率转换字#1<23:16> 频率转换字#1<15:8> 频率转换字#1<7:0> 三角频率字<47:40> 三角频率字<39:32> 三角频率字<31:24> 三角频率字<23:16> 三角频率字<15:8> 三角频率字<7:0> 更新时钟计数器<31:24> 更新时钟计数器<23:16> 更新时钟计数器<15:8> 更新时钟计数器<7:0> 边沿速率计数器<19:16>(23,22,21,20不起作用) 边沿速率计数器<15:8> 边沿速率计数器<7:0> 节电控制 时钟倍频控制器 DDS模式控制与累加器清零控制 传输模式,和OSK控制 输出幅度乘法器I<11:8>(15,14,13,12不起作用) 输出幅度乘法器I<7:0> 输出幅度乘法器Q<11:8>(15,14,13,12不起作用) 输出幅度乘法器Q<7:0> 输出边沿变化率控制器<7:0> QDAC,Q通道D/A输入<11:8> QDAC,Q通道D/A输入<7:0> 表4-2 AD9854控制寄存器功能

Table 5-2 AD9854 control registers function 7 6 5 4 3 2 1 N PLL范围 ACC2清零 开输出滤波 N PLL低通 Triangle 比较器 0 倍频 4位 N 倍频3位 模式位 2 控制DAC 倍频2位 模式位 2 I通道DAC 倍频 1位 模式位 2 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x40 0x00 0x00 0x00 0x00 0x64 0x20 0x20 0x00 0x00 0x00 0x00 0x80 0x00 0x00 地址 0 数字部分 倍频0位 内部更新 默认值 0x00 0x64 0x01 0x1D N 0x1E N 0x1F ACC1清零 0x20 N OSK使OSK模N N 串行地SDO有0x20 能 式 位字节效 优先 通过并行总线将数据写入程序寄存器时,实际上只是暂存在I/O缓冲区中,只有提供更新信号,这些数据才会更新到程序寄存器。AD9854提供两种更新方式,内部更新和外部更新。内部更新通过更新时钟计数器完成,当计数器计自减为零后会产生一个内部更新信号;

外部更新需要在外部更新管脚上给与一个高电平脉冲。默认的更新模式为内部更新,可以通过设置控制寄存器0x1F的0位进行修改。

4.4.2 多AD9854应用原理与方法

多路相位可控信号源的设计关键是实现多路DDS模块的相位的同步控制。要实现多路DDS相位同步,只需要在各DDS设置完成相位偏置后,提供一个使各路DDS同步工作的外部更新信号。根据这样的工作原理,以AD9854为例,给出多路相位可控信号源的基本结构。

相位偏置设置Update参考时钟 DDS1DDS2DDS3ABC参考时钟 DDS1DDS2DDS3 图4-4 多路DDS组成相位可控信号原理图 chart4-4 mult-DDS constitution and principium

图4-4中左半部分是一个正确多路DDS的结构,由一个统一时钟源提供参考时钟,相位偏置通过并行或串行总线设置,其值保存于各路AD9854的缓冲寄存器中。通过统一的外部更新信号启动各路DDS同步工作,从而实现了各路DDS信号之间以固定的相位差同步工作。

参考时钟的连线方式很重要,图4-4右半部分给出了种错误的连接方式。参考时钟到各DDS的距离不等,这就会引起各路DDS的参考时钟不同步,从而也无法保证各路DDS的同步。

此外外部更新信号Update虽然没有必要严格的等长,但最好要与参考时钟保证正确的时序,因为Update信号送入AD9854后会在内部系统时钟(由外部时钟倍频和锁相得到)的上升沿触发更新。各路DDS的Update信号与内部系统时钟有可能出现一个时钟周期的抖动,在这个系统时钟的前后两个时间点产生更新。Update信号与系统时钟的时序要求如下:

参考时钟更新脉冲0.3ns1.5ns

图4-5a 单端外部参考时钟输入模式下更新信号时序

chart 4-5a Update scheduling in single refer clock mode

参考时钟更新脉冲0.5ns1.2ns

图4.5b 差分外部参考时钟输入模式时序更新信号时序

chart 4-5a Update scheduling in differnece refer clock mode

对于AD9854而言,其真正的相位值,是相位偏置值和相位累加器的输出值的和,在

对相位偏置值更新时,一定要保证相位累加器的值是确定的。最简单的方法是在设置相位前,将所有AD9854通过Master Reset信号重置,此时AD9854的寄存器恢复到默认值(见表4-1)。

下面步骤可完成对多个AD9854实现相位可控同步输出:

1,上电后给所有AD9854的复位信号管脚MasterRest提供一个长达10个系统时钟的复位信号,此时所有AD9854的程序寄存器都恢复为默认值。

2,使用并行总线设置AD9854的特殊功能寄存器:

a,更新模式设置为外部信号更新模式,且DDS工作在Single模式下,即寄存器0x1F=0x00;

b,参考时钟为30MHz,这里要获得210MHz的系统时钟,所以倍频数设置为7,由于超过200MHz,要开PLL低通,即寄存器0x1e=0x3d;

c,电源只打开I通道DAC和数字部分,寄存器0x1D=0x14;

d,开输出滤波,不用OSK功能,寄存器0x20=0x40;设置内部更新时钟,也可以不设置。

3,所有的AD9854完成模式设置后,内部更新时钟寄存器计数到0时,步骤2的设置才真正更新。此时由于频率控制字为0,因此相位累加器不工作,始终为0。

4,按以上步骤完成所有AD9854的初始设置后,使用并行传输向各AD9854写入频率转换字#1和相位偏置寄存器#1。

5,完成所有AD9854的频率和相位设置后,给一个全局的外部更新信号Update,此时各路AD9854就开始同步工作。注意Update信号的时序要求非常严格,最好满足图4.5的时序。

完成各路AD9854的初次同步输出后,若改变频率控制字,就不能在保证相位的正确设置了,此时可以设置特殊寄存器位ACC0(0x1F的6,7位)强制清零,然后再同步恢复的方式实现相位累加器输出的同步。

//=====================================================================

// AD9854 驱动程序设计 //硬件连接: P0 ——Data;

// P2 ——Adr; // RESET ——P3^7; // UDCLK ——P3^6; // WR ——P3.5; // RD ——p3.4; // FDATA ——P3^3; // OSK ——P3^2; // VDD--逻辑电源(3.3V) // VSS--GND(0V) //AD9854.c

//writer:谷雨 2008年8月22日~24日于EDA实验室

//说明:本程序基于硬件的外接晶振为20MHZ

//=====================================================================

#include //STC单片机头文件 #include

#define uint unsigned int #define uchar unsigned char #define ulong unsigned long

uchar FreqWord[6];

//**********************以下为系统时钟以及其相关变量设置**************************

/*

此处根据自己的需要设置系统时钟以及与其相关的因子,一次需且只需开启一个

CLK_Set为时钟倍频设置,可设置4~20倍倍频,但最大不能超过300MHZ Freq_mult_ulong和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型

*/ /*

#define CLK_Set 4 const ulong Freq_mult_ulong = 3518437; const double Freq_mult_doulle = 3518437.2088832; */ /*

#define CLK_Set 5 const ulong Freq_mult_ulong = 2814750;

//6个字节频率控制字

const double Freq_mult_doulle = 2814749.76710656; */

#define CLK_Set 6 const ulong Freq_mult_ulong = 2345625; const double Freq_mult_doulle = 2345624.80592213; /*

#define CLK_Set 7 const ulong Freq_mult_ulong = 2010536; const double Freq_mult_doulle = 2010535.54793326; */ /*

#define CLK_Set 8 const ulong Freq_mult_ulong = 1759219; const double Freq_mult_doulle = 1759218.6044416; */ /*

#define CLK_Set 9 const ulong Freq_mult_ulong = 1563750; const double Freq_mult_doulle = 1563749.87061476; */ /*

#define CLK_Set 10 const ulong Freq_mult_ulong = 1407375; const double Freq_mult_doulle = 1407374.88355328; */

/*

#define CLK_Set 11 const ulong Freq_mult_ulong = 1279432; const double Freq_mult_doulle = 1279431.712321164; */ /*

#define CLK_Set 12 const ulong Freq_mult_ulong = 1172812; const double Freq_mult_doulle = 1172812.402961067; */ /*

#define CLK_Set 13 const ulong Freq_mult_ulong = 1082596; const double Freq_mult_doulle = 1082596.064271754; */ /*

#define CLK_Set 14 const ulong Freq_mult_ulong = 1005268; const double Freq_mult_doulle = 1005267.773966629; */ /*

#define CLK_Set 15 const ulong Freq_mult_ulong = 938250;

const double Freq_mult_doulle = 938249.9223688533; */

//**************************

********************************

#define AD9854_DataBus P0 #define AD9854_AdrBus P2

sbit AD9854_RST = P3^7; //AD9854复位端口 sbit AD9854_UDCLK = P3^6; //AD9854更新时钟 sbit AD9854_WR = P3^5; //AD9854写使能,低有效 sbit AD9854_RD = P3^4; //AD9854读使能,低有效 sbit AD9854_FDATA = P3^3; //AD9854 FSK,PSK控制 sbit AD9854_OSK = P3^2; //AD9854 OSK控制端

//**************************以

********************************

static void AD9854_WR_Byte(uchar addr,uchar dat); extern void AD9854_Init(void);

static void Freq_convert(long Freq);

extern void AD9854_SetSine(ulong Freq,uint Shape); static void Freq_double_convert(double Freq);

extern void AD9854_SetSine_double(double Freq,uint Shape); extern void AD9854_InitFSK(void);

extern void AD9854_SetFSK(ulong Freq1,ulong Freq2);

extern void AD9854_InitBPSK(void);

extern void AD9854_SetBPSK(uint Phase1,uint Phase2); extern void AD9854_InitOSK(void);

extern void AD9854_SetOSK(uchar RateShape);

extern void AD9854_InitAM(void);

extern void AD9854_SetAM(uint Shape);

extern void AD9854_InitRFSK(void);

extern void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_Up_Down,ulong FreRate);

static void delay (uint us);

Freq_High,ulong

//====================================================================================

//函数名称:void AD9854_WR_Byte(uchar addr,uchar dat) //函数功能:AD9854并行口写入数据 //入口参数:addr 6位地址 // dat 写入的数据 //出口参数:无

//====================================================================================

void AD9854_WR_Byte(uchar addr,uchar dat) { }

//====================================================================================

//函数名称:void AD9854_Init(void) //函数功能:AD9854初始化 //入口参数:无 //出口参数:无

//====================================================================================

void AD9854_Init(void) {

AD9854_WR=1;//将读、写控制端口设为无效 AD9854_AdrBus = (addr&0x3f) | (P2&0xc0); AD9854_DataBus = dat; AD9854_WR = 0; AD9854_WR = 1;

AD9854_RD=1; AD9854_UDCLK=0;

AD9854_RST=1; //复位AD9854 AD9854_RST=0;

AD9854_UDCLK=1; //更新AD9854输出 AD9854_WR_Byte(0x1d,0x10); //关闭比较器

AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x00); //设置系统为模式0,由外部更新 AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿

AD9854_UDCLK=0; }

//====================================================================================

//函数名称:void Freq_convert(long Freq) //函数功能:正弦信号频率数据转换

//入口参数:Freq 需要转换的频率,取值从0~SYSCLK/2 //出口参数:无 但是影响全局变量FreqWord[6]的值

//说明: 该算法位多字节相乘算法,有公式FTW = (Desired Output Frequency × 2N)/SYSCLK

// 得到该算法,其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK

// 为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6] //====================================================================================

void Freq_convert(long Freq) {

ulong FreqBuf;

ulong Temp=Freq_mult_ulong;

uchar Array_Freq[4];

//将输入频率因子分为四个字节

Array_Freq[0]=(uchar)Freq; Array_Freq[1]=(uchar)(Freq>>8); Array_Freq[2]=(uchar)(Freq>>16); Array_Freq[3]=(uchar)(Freq>>24);

FreqBuf=Temp*Array_Freq[0];

FreqWord[0]=FreqBuf; FreqBuf>>=8;

FreqBuf+=(Temp*Array_Freq[1]); FreqWord[1]=FreqBuf; FreqBuf>>=8;

FreqBuf+=(Temp*Array_Freq[2]); FreqWord[2]=FreqBuf; FreqBuf>>=8;

FreqBuf+=(Temp*Array_Freq[3]);

FreqWord[3]=FreqBuf; FreqBuf>>=8;

FreqWord[4]=FreqBuf; FreqWord[5]=FreqBuf>>8; }

//====================================================================================

//函数名称:void AD9854_SetSine(ulong Freq,uint Shape) //函数功能:AD9854正弦波产生程序

//入口参数:Freq 频率设置,取值范围为0~(1/2)*SYSCLK

// Shape 幅度设置. 为12 Bit,取值范围为(0~4095) ,取值越大,幅度越大 //出口参数:无

//====================================================================================

void AD9854_SetSine(ulong Freq,uint Shape) {

uchar count;

uchar Adress;

Adress = 0x04; //选择频率控制字地址的初值

Freq_convert(Freq); //频率转换

for(count=6;count>0;) //写入6字节的频率控制字

{

AD9854_WR_Byte(Adress++,FreqWord[--count]);

}

AD9854_UDCLK=1; //更新AD9854输出

AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));

AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

AD9854_UDCLK=0; }

//====================================================================================

//函数名称:void Freq_doublt_convert(double Freq) //函数功能:正弦信号频率数据转换

//入口参数:Freq 需要转换的频率,取值从0~SYSCLK/2 //出口参数:无 但是影响全局变量FreqWord[6]的值

//说明: 有公式FTW = (Desired Output Frequency × 2N)/SYSCLK得到该函数, // 其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK // 为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6] //注意: 该函数与上面函数的区别为该函数的入口参数为double,可使信号的频率更精确

// 谷雨建议在100HZ以下用本函数,在高于100HZ的情况下用函数void

Freq_convert(long Freq)

//====================================================================================

void Freq_double_convert(double Freq) {

ulong Low32; uint High16;

double Temp=Freq_mult_doulle; //23ca99为2的48次方除以120M

Freq*=(double)(Temp);

// 1 0000 0000 0000 0000 0000 0000 0000 0000 = 4294967295

FreqWord[0]=Low32; FreqWord[1]=Low32>>8; FreqWord[2]=Low32>>16; FreqWord[3]=Low32>>24; FreqWord[4]=High16; FreqWord[5]=High16>>8; }

//====================================================================================

//函数名称:void AD9854_SetSine_double(double Freq,uint Shape) //函数功能:AD9854正弦波产生程序

//入口参数:Freq 频率设置,取值范围为0~1/2*SYSCLK // Shape 幅度设置. 为12 Bit,取值范围为(0~4095) //出口参数:无

//====================================================================================

void AD9854_SetSine_double(double Freq,uint Shape)

High16 = (int)(Freq/4294967295); //2^32 = 4294967295 Freq -= (double)High16*4294967295; Low32 = (ulong)Freq;

{

Freq_double_convert(Freq);

for(count=6;count>0;) //写入6字节的频率控制字

//频率转换

Adress=0x04;

//选择频率控制字1地址的初值

uchar count=0; uchar Adress;

{

AD9854_WR_Byte(Adress++,FreqWord[--count]);

}

AD9854_UDCLK=1; //更新AD9854输出

AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));

AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

AD9854_UDCLK=0; }

//====================================================================================

//函数名称:void AD9854_InitFSK(void) //函数功能:AD9854的FSK初始化 //入口参数:无 //出口参数:无

//====================================================================================

void AD9854_InitFSK(void) {

AD9854_WR=1; //将读、写控制端口设为无效

AD9854_RD=1; AD9854_UDCLK=0;

AD9854_RST=1; //复位AD9854 AD9854_RST=0;

AD9854_UDCLK=1; //更新AD9854输出 AD9854_WR_Byte(0x1d,0x10); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频

AD9854_WR_Byte(0x1f,0x02); //设置系统为模式1,由外部更新 AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿

AD9854_UDCLK=0; }

//====================================================================================

//函数名称:void AD9854_SetFSK(ulong Freq1,ulong Freq2) //函数功能:AD9854的FSK设置 //入口参数:Freq1 FSK频率1 // Freq2 FSK频率2 //出口参数:无

//====================================================================================

void AD9854_SetFSK(ulong Freq1,ulong Freq2) {

uchar count=6;

const uint Shape=4000; //幅度设置. 为12 Bit,取值范围为(0~4095)

Adress1=0x04; Adress2=0x0a;

//选择频率控制字1地址的初值 //选择频率控制字2地址的初值

uchar Adress1,Adress2;

Freq_convert(Freq1); //频率转换1

for(count=6;count>0;) //写入6字节的频率控制字

{

AD9854_WR_Byte(Adress1++,FreqWord[--count]);

}

for(count=6;count>0;) //写入6字节的频率控制字

Freq_convert(Freq2); //频率转换2

{

AD9854_WR_Byte(Adress2++,FreqWord[--count]);

}

AD9854_UDCLK=1; //更新AD9854输出

AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));

AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

AD9854_UDCLK=0; }

//====================================================================================

//函数名称:void AD9854_InitBPSK(void) //函数功能:AD9854的BPSK初始化 //入口参数:无 //出口参数:无

//====================================================================================

void AD9854_InitBPSK(void) {

AD9854_WR=1; //将读、写控制端口设为无效

AD9854_RD=1; AD9854_UDCLK=0;

AD9854_RST=1; //复位AD9854 AD9854_RST=0;

AD9854_UDCLK=1; //更新AD9854输出 AD9854_WR_Byte(0x1d,0x10); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频

AD9854_WR_Byte(0x1f,0x08); //设置系统为模式4,由外部更新 AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿

AD9854_UDCLK=0; }

//====================================================================================

//函数名称:void AD9854_SetBPSK(uint Phase1,uint Phase2) //函数功能:AD9854的BPSK设置 //入口参数:Phase1 调制相位1 // Phase2 //出口参数:无

//说明: 相位为14Bit,取值从0~16383,谷雨建议在用本函数的时候将Phase1设置为0,

// 将Phase1设置为8192,180°相位

//====================================================================================

void AD9854_SetBPSK(uint Phase1,uint Phase2) {

uchar count;

调制相位2

const ulong Freq=60000;

const uint Shape=4000;

for(count=6;count>0;) //写入6字节的频率控制字 Freq_convert(Freq); //频率转换 AD9854_WR_Byte(0x00,Phase1>>8); //设置相位1 AD9854_WR_Byte(0x01,(uchar)(Phase1&0xff));

AD9854_WR_Byte(0x02,Phase2>>8); //设置相位2 AD9854_WR_Byte(0x03,(uchar)(Phase2&0xff)); uchar Adress;

Adress=0x04; //选择频率控制字1地址的初值

{

AD9854_WR_Byte(Adress++,FreqWord[--count]);

}

AD9854_UDCLK=1; //更新AD9854输出 AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));

AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

AD9854_UDCLK=0; }

//====================================================================================

//函数名称:void AD9854_InitOSK(void)

//函数功能:AD9854的OSK初始化 //入口参数:无 //出口参数:无

//====================================================================================

void AD9854_InitOSK(void) {

AD9854_WR_Byte(0x1d,0x10); //关闭比较器

AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频

AD9854_WR_Byte(0x1f,0x00); //设置系统为模式0,由外部更新 AD9854_WR=1; //将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0;

AD9854_RST=1; //复位AD9854 AD9854_RST=0;

AD9854_WR_Byte(0x20,0x70); //设置为可调节幅度,取消插值补偿,通断整形内部控制

}

//====================================================================================

//函数名称:void AD9854_SetOSK(uchar RateShape) //函数功能:AD9854的OSK设置

//入口参数: RateShape OSK斜率,取值为4~255,小于4则无效 //出口参数:无

//====================================================================================

void AD9854_SetOSK(uchar RateShape) {

AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0;

AD9854_WR_Byte(0x1c,(uchar)FreRate);

AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));

AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

AD9854_UDCLK=1; //更新AD9854输出

AD9854_UDCLK=0; }

//================================================================= // 函数名称 :void delay (uint us) // 函数功能 :us级延时,大概2~4 us // 入口参数 :us 延时时间的长短 // 出口参数 :无

//================================================================= void delay (uint us) { }

//测试正弦波,采用120MHZ SYSCLK时,出来10MHZ波形,波形很好,测试成功 //当采用300MHZ SYSCLK时,测试50MHZ波形时,DDS发热厉害,且波形衰减严重,幅度在35mV左右

int main() {

AD9854_Init(); uint i;

for(i=0;i

}

AD9854_SetSine(10000000,4000); while(1);

//测试正弦波,采用120MHZ SYSCLK时,出来87.697HZ波形,波形很好,测试成功 /* int main() { } */

//测试FSK,采用120MHZ SYSCLK,1K和6K,测试成功,结果对应\波形.bmp\/* int main() { } */

//测试BPSK,采用120MHZ SYSCLK,测试成功

AD9854_InitFSK();

AD9854_SetFSK(1000,6000); while(1) { }

AD9854_FDATA = 1;

delay(30000); //延时时间长,便于观察 AD9854_FDATA = 0; delay(30000);

AD9854_Init();

AD9854_SetSine_double(87.697,4000); while(1);

/* int main() { } */

//测试OSK,采用120MHZ SYSCLK,测试成功 /* int main() { } */

AD9854_InitOSK(); AD9854_SetOSK(10); while(1) { }

AD9854_OSK=1; delay(30); AD9854_OSK=0; delay(30);

AD9854_InitBPSK(); AD9854_SetBPSK(0,8192); while(1) { }

AD9854_FDATA = 1; delay(10);

AD9854_FDATA = 0; delay(10);

//测试AM,采用120MHZ SYSCLK,测试成功 /* int main() { } */

//测试RFSK,采用120MHZ SYSCLK,测试成功 /* int main() {

AD9854_InitRFSK();

AD9854_SetRFSK(1000,60000,100,30); while(1) { }

AD9854_FDATA = 1;

delay(30000); //延时时间长,便于观察 AD9854_FDATA = 0; delay(30000); AD9854_InitAM(); while(1) { }

AD9854_SetAM(2000); delay(10);

AD9854_SetAM(4000); delay(10);

} */

uchar count;

const ulong Freq=60000;

//设置载频

//幅度设置. 为12 Bit,取值范围为(0~4095)

const uint Shape=4000;

uchar Adress;

Adress=0x04; //选择频率控制字地址的初值

Freq_convert(Freq); //频率转换

for(count=6;count>0;) //写入6字节的频率控制字

{

AD9854_WR_Byte(Adress++,FreqWord[--count]);

}

AD9854_WR_Byte(0x25,RateShape);

AD9854_UDCLK=1; //更新AD9854输出

//设置OSK斜率

AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));

AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

AD9854_UDCLK=0; }

//====================================================================================

//函数名称:void AD9854_InitAM(void) //函数功能:AD9854的AM初始化

//入口参数:无 //出口参数:无

//====================================================================================

void AD9854_InitAM(void) {

uchar Adress;

Adress=0x04; //选择频率控制字地址的初值

const ulong Freq=60000;

//设置载频

uchar count;

AD9854_WR=1; //将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0;

AD9854_RST=1; //复位AD9854 AD9854_RST=0; 新

AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿

for(count=6;count>0;) //写入6字节的频率控制字 Freq_convert(Freq); //频率转换 AD9854_WR_Byte(0x1d,0x10); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频

AD9854_WR_Byte(0x1f,0x00); //设置系统为模式0,由外部更

{

AD9854_WR_Byte(Adress++,FreqWord[--count]);

}

AD9854_UDCLK=1; //更新AD9854输出

AD9854_UDCLK=0; }

//====================================================================================

//函数名称:void AD9854_SetAM(uchar Shape) //函数功能:AD9854的AM设置

//入口参数:Shape 12Bit幅度,取值从0~4095 //出口参数:无

//====================================================================================

void AD9854_SetAM(uint Shape) {

AD9854_UDCLK=1; //更新AD9854输出

AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));

AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));

AD9854_UDCLK=0; }

//====================================================================================

//函数名称:void AD9854_InitRFSK(void) //函数功能:AD9854的RFSK初始化 //入口参数:无 //出口参数:无

//====================================================================================

void AD9854_InitRFSK(void)

{

AD9854_WR=1; //将读、写控制端口设为无效

AD9854_RD=1; AD9854_UDCLK=0;

AD9854_RST=1; //复位AD9854 AD9854_RST=0;

AD9854_WR_Byte(0x1d,0x10); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频

AD9854_WR_Byte(0x1f,0x24); //设置系统为模式2,由外部更新,使能三角波扫频功能

AD9854_UDCLK=1; //更新AD9854输出

AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿

AD9854_UDCLK=0; }

//====================================================================================

//函数名称:void AD9854_SetRFSK(void) //函数功能:AD9854的RFSK设置

//入口参数:Freq_Low RFSK低频率

48Bit

// Freq_High RFSK高频率 48Bit // Freq_Up_Down //

步进频率

48Bit

FreRate 斜率时钟控制 20Bit

//出口参数:无

//注: 每两个脉冲之间的时间周期用下式表示(FreRate +1)*(System Clock ),一个脉冲,

// 频率 上升或者下降 一个步进频率

//====================================================================================

void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate)

{

uchar count=6;

uchar Adress1,Adress2,Adress3;

//幅度设置. 为12 Bit,取值范围为(0~4095)

const uint Shape=4000;

Adress1=0x04; Adress2=0x0a; Adress3=0x10;

//选择频率控制字地址的初值

Freq_convert(Freq_Low); //频率1转换

for(count=6;count>0;) //写入6字节的频率控制字

{

AD9854_WR_Byte(Adress1++,FreqWord[--count]);

}

for(count=6;count>0;) //写入6字节的频率控制字 Freq_convert(Freq_High); //频率2转换

{

AD9854_WR_Byte(Adress2++,FreqWord[--count]);

}

for(count=6;count>0;) //写入6字节的频率控制字

{

AD9854_WR_Byte(Adress3++,FreqWord[--count]);

Freq_convert(Freq_Up_Down); //步进频率转换

}

AD9854_WR_Byte(0x1a,(uchar)((FreRate>>16)&0x0f)); 升速率

AD9854_WR_Byte(0x1b,(uchar)(FreRate>>8));

//设置斜

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

Top