AD9850/AD9851驱动调试

优快云话题挑战赛第2期
参赛话题:学习笔记

AD9850/AD9851
AD9850/AD9851 模块是采用ADI 应用最广泛的DDS(AD9850 和 AD9851)制作的模块。
ADI 的性能就不用多说了。模块主要参考 AD9850 和 AD9851 的资料做的。

主要功能特点:

  • 模块能够输出正弦波和方波,2 个正弦波和 2 个方波输出。
    AD9850: 0-40MHz
    AD9851: 0-70MHz
    频率在 20-30MHz 后谐波越来越大,波形会越来越不干净。
    方波: 0-1MHz
  • 采用 70MHz 的低通滤波器,使波形的 SN 比更好
  • 比较器的基准输入端电压由可变电阻产生,调节该电阻可以得到不同的占空比方波
    注:在输出正弦波的情况下,接线到方波输出的 IO 口,直接调节
    蓝色的电位器可输出方波。
  • AD9850 模块采用 125MHz 的有源晶振,AD9851 模块采用 30MHZ 的有源晶振
    AD9850 和 AD9851 主要区别
  • AD9850 的时钟频率最高 125MHz,AD9851 的时钟频率最高 180MHz。输出最高频率
    AD9851 要比 AD9850 高。
  • AD9850 没有 6 倍频,AD9851 有

功能框图============================================================
在这里插入图片描述

1:下载对应的驱动 程序

//***************************************************//
//函数1:           ad9850_reset()                    //
//函数2:           ad9850_reset_serial()             //
//函数3:           ad9850_wr_parrel(unsigned char w0,double frequence)//
//函数4:           ad9850_wr_serial(unsigned char w0,double frequence)//

//***************************************************//
//                  子程序说明                       //
//***************************************************//
//函数1:  ad9850_reset()
//        复位ad9850,之后为并口写入模式        
//函数2:  ad9850_reset_serial()
//        复位ad9850,之后为串口写入模式
//函数3:  ad9850_wr_parrel(unsigned char w0,double frequence)
//        并口写ad9850数据,w0为ad9850中w0的数据,frequence
//        为写入的频率	
//函数4:  ad9850_wr_serial(unsigned char w0,double frequence)
//        串口写ad9850数据,w0为ad9850中w0的数据,frequence
//        为写入的频率	
//需定义的位:
         //ad9850_w_clk    ;
         //ad9850_fq_up    ;
         //ad9850_rest     ;
         //ad9850_bit_data ;
//例:
         //sbit ad9850_w_clk    =P2^2;
         //sbit ad9850_fq_up    =P2^1;
         //sbit ad9850_rest     =P2^0;
         //sbit ad9850_bit_data =P1^7;
//***************************************************//
//                 写数据说明                        //
//***************************************************//
//写数据例:
//       ad9850_reset()
//       wr_lcd02_data(unsigned char x)
//       ad9850_wr_parrel(0x01,1000)
//       ad9850_wr_serial(0x01,1000)
//***************************************************//
//---------------------------------------------------//
//                   程序                            //
//---------------------------------------------------//
# include <reg51.h>
# include <stdio.h>
# include <intrins.h>
sbit ad9850_w_clk    =P2^2;  //P2.2口接ad9850的w_clk脚/PIN7
sbit ad9850_fq_up    =P2^1;  //P2.1口接ad9850的fq_up脚/PIN8
sbit ad9850_rest     =P2^0;  //P2.0口接ad9850的rest脚/PIN12
sbit ad9850_bit_data =P1^7;  //P1.7口接ad9850的D7脚/PIN25
//P1为8位数据口
//***************************************************//
//              ad9850复位(并口模式)                 //
//---------------------------------------------------//
void ad9850_reset()
{
ad9850_w_clk=0;
ad9850_fq_up=0;
//rest信号
ad9850_rest=0;
ad9850_rest=1;
ad9850_rest=0;
}
//***************************************************//
//              ad9850复位(并口模式)                 //
//---------------------------------------------------//
void ad9850_reset_serial()
{
ad9850_w_clk=0;
ad9850_fq_up=0;
//rest信号
ad9850_rest=0;
ad9850_rest=1;
ad9850_rest=0;
//w_clk信号
ad9850_w_clk=0;
ad9850_w_clk=1;
ad9850_w_clk=0;
//fq_up信号
ad9850_fq_up=0;
ad9850_fq_up=1;
ad9850_fq_up=0;
}
//***************************************************//
//          向ad9850中写命令与数据(并口)             //
//---------------------------------------------------//
void ad9850_wr_parrel(unsigned char w0,double frequence)
{
unsigned char w;
long int y;
double x;
//计算频率的HEX值
x=4294967295/125;//适合125M晶振
//如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//写w0数据
w=w0;   
P1=w;      //w0
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w1数据
w=(y>>24);
P1=w;      //w1
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w2数据
w=(y>>16);
P1=w;      //w2
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w3数据
w=(y>>8);
P1=w;      //w3
ad9850_w_clk=1;
ad9850_w_clk=0;
//写w4数据
w=(y>>=0);
P1=w;      //w4
ad9850_w_clk=1;
ad9850_w_clk=0;
//移入始能
ad9850_fq_up=1;
ad9850_fq_up=0;
}
//***************************************************//
//          向ad9850中写命令与数据(串口)             //
//---------------------------------------------------//
void ad9850_wr_serial(unsigned char w0,double frequence)
{
unsigned char i,w;
long int y;
double x;
//计算频率的HEX值
x=4294967295/125;//适合125M晶振
//如果时钟频率不为180MHZ,修改该处的频率值,单位MHz  !!!
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
//写w4数据
w=(y>>=0);
for(i=0;i<8;i++)
{
ad9850_bit_data=(w>>i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//写w3数据
w=(y>>8);
for(i=0;i<8;i++)
{
ad9850_bit_data=(w>>i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//写w2数据
w=(y>>16);
for(i=0;i<8;i++)
{
ad9850_bit_data=(w>>i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//写w1数据
w=(y>>24);
for(i=0;i<8;i++)
{
ad9850_bit_data=(w>>i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//写w0数据
w=w0;   
for(i=0;i<8;i++)
{
ad9850_bit_data=(w>>i)&0x01;
ad9850_w_clk=1;
ad9850_w_clk=0;
}
//移入始能
ad9850_fq_up=1;
ad9850_fq_up=0;
}
//***************************************************//
//                   测试程序1000Hz                  //
//---------------------------------------------------//
main()
{
P0=0x00;
P1=0x00;
P2=0x00;
P3=0x00;
//---------------------------------------------------//
//---------------------------------------------------//
//串行写1000Hz程序
ad9850_reset_serial();
ad9850_wr_serial(0x00,1000);
//---------------------------------------------------//
while(1)
{
}
}

OUT1 和OUT2 端能测试到对应输出 1KHz 信号。如需测试方波,调节可变电位器, 可在方波 1 和方波 2 端测试到方波。

原理图:

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr Robot

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

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

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

打赏作者

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

抵扣说明:

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

余额充值