AD9851电路设计

目录

摘要

主要功能特点:

AD9851原理图:

下面是PCB:

规格书截取:

.c

ad9851.c


摘要

AD9850/AD9851模块是采用ADI应用最广泛的DDSAD9850AD9851)制作的模块。

ADI的性能就不用多说了。模块主要参考AD9850AD9851的资料做的。

主要功能特点:

* 幅度调节口外接,可通过电压来调节模块输出幅度。 * 模块能够输出正弦波和方波,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)
{
}
}





包含以上所有资料 DDS AD9850 AD9851 原理图 串行程序 并行程序 目 录 1 DDS 简介 1.1 产品简介 1.2 参考资料 2 DDS 的基本概念 2.1 DDS 概述 2.2 DDS 工作原理 2.3 DDS 有关名词解释 3 具体应用问题 3.1 DDS 没有输出,怎么办 3.2 哪些DDS 能直接用晶体提供时钟,哪些不能 3.3 Update 更新信号如何控制? 3.4 DDS 的扫频功能如何实现 3.5 DDS 输出级滤波器如何设计 3.6 DDS 发烫,是否正常 3.7 DDS 对输入时钟有什么要求 3.8 AD9910 的时钟输入需要注意什么? 3.9 DDS 时钟输入,DAC 输出能否使用单端模式?电路该如何接 3.10 DDS 评估板上分别有2 个变压器或2 个巴伦(Balun)有什么用处 3.11 DDS 评估板上端接电阻为50 欧,为何变压器的参数是在75 欧标定的? 3.12 ADT1-1WT 的原副边是否可以互换使用 3.13 如何同步多片DDS 芯片的输出 3.14 DDS 输出端DAC 为电流输出,怎么转换为电压,有什么限制 3.15 DDS 的AGND,DGND 应该怎样连接,接模拟地还是数字地 3.16 有些DDS 评估板上的MC100LVEL16 的用途是什么? 3.17 AD7008 已经停产,有什么可以替代 3.18 如何确定DDS 寄存器的值 3.19 DDS 的评估板软件对操作系统有什么要求 3.20 DDS 除了正弦波,还能产生别的波形么 3.21 用DDS 有什么好处 3.22 ADI 的DDS 捷变频能力为多少 3.23 有无DDS 的参考程序代码 3.24 如何使用DDS 进行幅度调制 3.25 如何用AD5930 来产生一个单频信号 3.26 为什么DDS 输出的幅度会随频率的增加而减小 3.27 DDS 输出电压的幅度如何计算 3.28 应该用什么样的仪器来调试DDS 3.29 输出杂散较大,怎么办
03-12
### AD9850 芯片概述 AD9850 是一款高性能直接数字频率合成器 (DDS),能够提供精确的信号生成能力。该器件内部集成了一个高速比较器,可以直接产生正弦波、三角波以及方波等多种波形输出[^1]。 #### 主要特性 - **高分辨率**:具备高达 32 位相位累加器,可以实现非常精细的频率调整。 - **宽频带范围**:支持从直流到超过 40 MHz 的工作频率区间。 - **低功耗设计**:典型情况下仅消耗约 150 mW 功率,在便携式设备中有广泛应用前景。 - **内置 RAM 和 ROM**:用于存储预设模式或自定义配置文件,简化编程过程并提高灵活性。 - **多种接口选项**:除了标准 SPI 接口外还提供了并行加载功能,方便不同应用场景下的连接需求. #### 应用领域 由于其出色的性能参数和技术特点,使得 AD9850 成为了众多电子项目中的理想选择: - 测试测量仪器 - 频谱分析仪校准源 - 射频通信系统的本地荡器替代方案 - 各类音频处理装置的核心组件之一 - 实验室教育演示平台的关键部件 ```cpp // C++ 示例代码展示如何初始化 AD9850 并设置输出频率 void setup_AD9850(double frequency){ uint32_t freq_word = calculate_frequency_word(frequency); digitalWrite(LE_PIN, LOW); // 设置 LE 引脚为低电平 shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, (freq_word >> 24) & 0xFF); shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, (freq_word >> 16) & 0xFF); shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, (freq_word >> 8) & 0xFF); shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, freq_word & 0xFF); digitalWrite(WR_PIN, HIGH); // 写入命令 delayMicroseconds(1); digitalWrite(WR_PIN, LOW); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YY_Share

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值