目录
摘要
AD9850/AD9851模块是采用ADI应用最广泛的DDS(AD9850和AD9851)制作的模块。
ADI的性能就不用多说了。模块主要参考AD9850和AD9851的资料做的。
主要功能特点:
* 幅度调节口外接,可通过电压来调节模块输出幅度。 * 模块能够输出正弦波和方波,2 个正弦波和 2 个方波输出。
AD9850: 0-40MHz
AD9851: 0-70MHz
频率在 30MHz 后谐波越来越大,波形会越来越不干净(详细波形见测试图)。
方波: 0-10MH * 博客提供测试波形图片。正弦波,方波及幅度调节输出波形。 * 采用 70MHz 的低通滤波器,使波形的 SN 比更好 * 并口和串口数据输入可以通过一个跳帽选择 * 输出波形幅度控制的管脚(PIN12)引出,方便做输出波形的幅度调节应用。 * 比较器的基准输入端电压由可变电阻产生,调节该电阻可以得到不同的占空比方波; 亦可通过调冒选择到外部电压控制。 * AD9850 模块采用 125MHz 的有源晶振,AD9851 模块采用 30MHZ 的有源晶振
AD9850 和 AD9851 主要区别
*AD9850 的时钟频率最高 125MHz,AD9851 的时钟频率最高 180MHz。输出最高频率
AD9851 要比 AD9850 高。 * AD9850 时钟输入没有 6 倍频,AD9851 有
AD9851原理图:
芯片输出经过一个滤波器,低通滤波器,输出波形幅值稳定在一点多伏,差不多是一伏;
理论上是可以串行或者并行控制,但是我发现,并行控制会出现问题,串行的数据比较稳定,现象比较正常;
最好把数字地和模拟地互相隔离;
上电指示灯好像用大了,4.7K的话LED比较亮,刺眼。。。。。,用10K好一点;
下面是PCB:
额画的像一只蜘蛛。。。不过问题不大。
经过测试,是能够正常使用的。
规格书截取:
FEATURES 180 MHz Clock Rate with Selectable 6 Reference Clock Multiplier On-Chip High Performance 10-Bit DAC and High Speed Comparator with Hysteresis SFDR >43 dB @ 70 MHz AOUT
32-Bit Frequency Tuning Word Simpliff ed Control Interface: Parallel or Serial Asynchronous Loading Format 5-Bit Phase Modulation and Offset Capability Comparator Jitter
AD9851是一种高度集成的器件,采用先进的DDS技术,加上内部高速,高性能D/ a转换器和比较器,形成数字可编程频率合成器和时钟发生器功能。
当参考精确时钟源时,AD9851产生稳定的频率和相位可编程的数字化模拟输出正弦波。
这种正弦波可以直接用作频率源,或内部转换为方波的敏捷时钟发生器应用程序。
AD9851的创新高速DDS核心接受32位频率调谐字,在180 MHz系统时钟下,输出调谐分辨率约为0.04 Hz。
AD9851包含一个独特的6× REFCLK乘法器电路,消除了对高速参考振荡器的需求。
6× REFCLK乘法器对SFDR和相位噪声特性的影响最小。
AD9851提供5位可编程相位调制分辨率,使其输出的相移增量为11.25°。
AD9851包含一个内部高速比较器,可以配置为接受DAC的(外部)滤波输出,以产生低抖动输出脉冲。
频率调谐、控制和相位调制字通过并行或串行加载格式异步加载到AD9851中。
并行加载格式由5个8位控制字(字节)的迭代加载组成。
第一个8位字节控制输出相位,6x REFCLK倍增器,断电启用和加载格式;
其余字节包括32位频率调优字。
串行加载是通过一个40位串行数据流通过一个并行输入总线线来完成的。
AD9851采用先进的CMOS技术,以555 mW的功耗(5 V电源)和180 MHz的最大时钟速率提供这一突破性的功能。
AD9851采用节省空间的28引脚SSOP表面贴装封装,引脚对引脚兼容流行的AD9850 125 MHz DDS。
它被指定在>3.0 V电源电压下,在-40°C至+85°C的扩展工业温度范围内工作。
3.0 V以下,适用于0℃~ 85℃的商用温度范围。
oled9851代码参考
.c
#include "reg52.h"
#include "intrins.h"
#include "codetab.h"
#include "LQ12864.h"
#include "stdio.h"
#include "math.h"
#include "stdio.h"
sbit ad9850_w_clk =P3^5;
sbit ad9850_fq_up =P3^6;
sbit ad9850_rest =P3^7;
sbit ad9850_bit_data =P1^7;
sbit k1 =P3^2;
sbit k2 =P3^1;
sbit k3 =P3^0;
char numm[]="000";
char nummm[]="0";
long int cc;
int z;
int bz=0;
void ad9850_reset()
{
ad9850_w_clk=0;
ad9850_fq_up=0;
ad9850_rest=0;
ad9850_rest=1;
ad9850_rest=0;
}
void ad9850_reset_serial()
{
ad9850_w_clk=0;
ad9850_fq_up=0;
ad9850_rest=0;
ad9850_rest=1;
ad9850_rest=0;
ad9850_w_clk=0;
ad9850_w_clk=1;
ad9850_w_clk=0;
ad9850_fq_up=0;
ad9850_fq_up=1;
ad9850_fq_up=0;
}
void ad9850_wr_parrel(unsigned char w0,double frequence)
{
unsigned char w;
long int y;
double x;
x=4294967295/150;
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
w=w0;
P1=w; //w0
ad9850_w_clk=1;
ad9850_w_clk=0;
w=(y>>24);
P1=w; //w1
ad9850_w_clk=1;
ad9850_w_clk=0;
w=(y>>16);
P1=w; //w2
ad9850_w_clk=1;
ad9850_w_clk=0;
w=(y>>8);
P1=w; //w3
ad9850_w_clk=1;
ad9850_w_clk=0;
w=(y>>=0);
P1=w; //w4
ad9850_w_clk=1;
ad9850_w_clk=0;
ad9850_fq_up=1;
ad9850_fq_up=0;
}
void show(int n)
{
int a,b,c,d;
a=n/1000;
b=n%1000/100;
c=n%100/10;
d=n%10;
sprintf(numm, "%d%d%d",a,b,c);
sprintf(nummm, "%d",d);
OLED_P8x16Str(45,3,&numm[0]);
OLED_P8x16Str(78,3,&nummm[0]);
}
void main(void)
{
P0=0x00;
P1=0x00;
P2=0x00;
P3=0x00;
k1=1;
k2=1;
k3=1;
ad9850_reset();
cc=11465000;
ad9850_wr_parrel(0x21,cc);
OLED_Init(); //OLED初始化
OLED_CLS();//清屏
z=cc/100000 ;
show(z);
OLED_P8x16Str(30,0,"D D S");
OLED_P16x16Ch(5,3,1);
OLED_P16x16Ch(20,3,2);
OLED_P8x16Str(35,3,":");
OLED_P8x16Str(70,3,".");
OLED_P8x16Str(88,3,"MHz");
// OLED_Fill(0xff); //屏全亮
// delay(2000);
// OLED_Fill(0x00); //屏全灭
// delay(200);
// delay(4000);
// OLED_CLS();
while(1)
{
if(k1==0)
{
delay(400);
if(k1==0)
{
if(bz==0) cc=cc-1000000;
else cc=cc-100000 ;
ad9850_wr_parrel(0x21,cc);
z=cc/100000 ;
show(z);
while(!k1);
}
}
if(k2==0)
{
delay(400);
if(k2==0)
{
bz=!bz;
while(!k2);
}
}
if(k3==0)
{
delay(400);
if(k3==0)
{
if(bz==0) cc=cc+1000000;
else cc=cc+100000;
ad9850_wr_parrel(0x21,cc);
z=cc/100000 ;
show(z);
while(!k3);
}
}
}
}
ad9851.c
//***************************************************//
//函数1: ad9851_reset() //
//函数2: ad9851_reset_serial() //
//函数3: ad9851_wr_parrel(unsigned char w0,double frequence)//
//函数4: ad9851_wr_serial(unsigned char w0,double frequence)//
//版本: V1.1 //
//日期: 2008/12/19 //
//修改日期: 2008/12/19 //
//编写者: my_dds(my_dds@163.com) //
//***************************************************//
// 子程序说明 //
//***************************************************//
//函数1: ad9851_reset()
// 复位ad9851,之后为并口写入模式
//函数2: ad9851_reset_serial()
// 复位ad9851,之后为串口写入模式
//函数3: ad9851_wr_parrel(unsigned char w0,double frequence)
// 并口写ad9851数据,w0为ad9851中w0的数据,frequence
// 为写入的频率
//函数4: ad9851_wr_serial(unsigned char w0,double frequence)
// 串口写ad9851数据,w0为ad9851中w0的数据,frequence
// 为写入的频率
//需定义的位:
//ad9851_w_clk ;
//ad9851_fq_up ;
//ad9851_rest ;
//ad9851_bit_data ;
//例:
//sbit ad9851_w_clk =P2^2;
//sbit ad9851_fq_up =P2^1;
//sbit ad9851_rest =P2^0;
//sbit ad9851_bit_data =P1^7;
//***************************************************//
// 写数据说明 //
//***************************************************//
//写数据例:
// ad9851_reset()
// wr_lcd02_data(unsigned char x)
// ad9851_wr_parrel(0x01,1000)
// ad9851_wr_serial(0x01,1000)
//***************************************************//
//---------------------------------------------------//
// 程序 //
//---------------------------------------------------//
# include <reg51.h>
# include <stdio.h>
# include <intrins.h>
sbit ad9851_w_clk =P2^2; //P2.2口接AD9851的w_clk脚/PIN7
sbit ad9851_fq_up =P2^1; //P2.1口接AD9851的fq_up脚/PIN8
sbit ad9851_rest =P2^0; //P2.0口接AD9851的rest脚/PIN12
sbit ad9851_bit_data =P1^7; //P1.7口接AD9851的D7脚/PIN25
//P1为8位数据口
//***************************************************//
// ad9851复位(并口模式) //
//---------------------------------------------------//
void ad9851_reset()
{
ad9851_w_clk=0;
ad9851_fq_up=0;
//rest信号
ad9851_rest=0;
ad9851_rest=1;
ad9851_rest=0;
}
//***************************************************//
// ad9851复位(并口模式) //
//---------------------------------------------------//
void ad9851_reset_serial()
{
ad9851_w_clk=0;
ad9851_fq_up=0;
//rest信号
ad9851_rest=0;
ad9851_rest=1;
ad9851_rest=0;
//w_clk信号
ad9851_w_clk=0;
ad9851_w_clk=1;
ad9851_w_clk=0;
//fq_up信号
ad9851_fq_up=0;
ad9851_fq_up=1;
ad9851_fq_up=0;
}
//***************************************************//
// 向ad9851中写命令与数据(并口) //
//---------------------------------------------------//
void ad9851_wr_parrel(unsigned char w0,double frequence)
{
unsigned char w;
long int y;
double x;
//计算频率的HEX值
x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)
//如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//写w0数据
w=w0;
P1=w; //w0
ad9851_w_clk=1;
ad9851_w_clk=0;
//写w1数据
w=(y>>24);
P1=w; //w1
ad9851_w_clk=1;
ad9851_w_clk=0;
//写w2数据
w=(y>>16);
P1=w; //w2
ad9851_w_clk=1;
ad9851_w_clk=0;
//写w3数据
w=(y>>8);
P1=w; //w3
ad9851_w_clk=1;
ad9851_w_clk=0;
//写w4数据
w=(y>>=0);
P1=w; //w4
ad9851_w_clk=1;
ad9851_w_clk=0;
//移入始能
ad9851_fq_up=1;
ad9851_fq_up=0;
}
//***************************************************//
// 向ad9851中写命令与数据(串口) //
//---------------------------------------------------//
void ad9851_wr_serial(unsigned char w0,double frequence)
{
unsigned char i,w;
long int y;
double x;
//计算频率的HEX值
x=4294967295/180;//适合180M晶振/180为最终时钟频率(或30M六倍频)
//如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//写w4数据
w=(y>>=0);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//写w3数据
w=(y>>8);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//写w2数据
w=(y>>16);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//写w1数据
w=(y>>24);
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//写w0数据
w=w0;
for(i=0;i<8;i++)
{
ad9851_bit_data=(w>>i)&0x01;
ad9851_w_clk=1;
ad9851_w_clk=0;
}
//移入始能
ad9851_fq_up=1;
ad9851_fq_up=0;
}
//***************************************************//
// 测试程序1000Hz //
//---------------------------------------------------//
main()
{
P0=0x00;
P1=0x00;
P2=0x00;
P3=0x00;
//---------------------------------------------------//
//并行写1000Hz程序
//ad9851_reset();
//ad9851_wr_parrel(0x01,1000);
//0X01为开六备频
//ad9851_wr_parrel(0x00,1000);
//0X00为不开六备频
//---------------------------------------------------//
//---------------------------------------------------//
//串行写1000Hz程序
ad9851_reset_serial();
ad9851_wr_serial(0x01,1000);
//0X01为开六备频
//ad9851_wr_serial(0x00,1000);
//0X00为不开六备频
//---------------------------------------------------//
while(1)
{
}
}