文号
t52274
阅读
7669
回复
13
收藏
3
求单片机达人看下AD9850驱动程序
2012/11/16
IP:黑龙江
本人打算做一个单片机AT89S52驱动AD9850的DDS信号发生器。
程序写好了,也用面包板搭了相应的电路,无奈信号就是出不来。
在网上查了很多资料,发现科创这里的高人很多,
于是通过了网站那折磨人的注册流程来到这里,请各位达人不吝赐教。

attachment icon AD9850手册.pdf 318.05KB PDF 171次下载 预览


attachment icon datasheet_AT89S52.pdf 231.04KB PDF 147次下载 预览
请先看程序,我去画原理图,随后放上来。
//header files
#include "reg52.h"            //header file of SCM
#include "stdio.h"            //standard buffered input&output
#include "intrins.h"


#define uint unsigned int
#define uchar unsigned char
//program
sbit w_clk    =P2^2;  //P2.2口接ad9850的w_clk脚/PIN7    AD9850与51单片机接口定义
sbit fq_up    =P2^1;  //P2.1口接ad9850的fq_up脚/PIN8
sbit rset     =P2^0;  //P2.0口接ad9850的rset脚/PIN12
sbit bit_data =P1^7;  //P1.7口接ad9850的D7脚/PIN25   P1为8位数据口
//subfunctions
//serial
void resets()
{
w_clk=0;
fq_up=0;
rset=0;      
rset=1;
rset=0;
w_clk=0;      
w_clk=1;
w_clk=0;
fq_up=0;    
fq_up=1;
fq_up=0;
}
void wrs(unsigned char w0,double freq)
{
unsigned char i,w;
long int y;
double x;
x=4294967295/100;
freq=freq/1000000;
freq=freq*x;
y=freq;
w=(y>>=0);
for(i=0;i<8;i++)
{
bit_data=(w>>i)&0x01;
w_clk=1;
w_clk=0;
}
w=(y>>8);
for(i=0;i<8;i++)
{
bit_data=(w>>i)&0x01;
w_clk=1;
w_clk=0;
}
w=(y>>16);
for(i=0;i<8;i++)
{
bit_data=(w>>i)&0x01;
w_clk=1;
w_clk=0;
}
w=(y>>24);
for(i=0;i<8;i++)
{
bit_data=(w>>i)&0x01;
w_clk=1;
w_clk=0;
}
w=w0;  
for(i=0;i<8;i++)
{
bit_data=(w>>i)&0x01;
w_clk=1;
w_clk=0;
}
fq_up=1;
fq_up=0;
}


main()
{
    P0=0x00;
    DL(20);
    P1=0x00;
    DL(20);
    P2=0x00;
    DL(20);
    P3=0x00;
    DL(20);


    resets();
    DL(20);


    wrs(0x00,100000);
    
    while(1)
{    
    
//    DL(10000);
}
}
14年1个月前IP:未同步
470852
1楼
电路也不上一个,不好分析,9850串行使用的时候
D[7..0]要接成固定的电平,记不得是00000111 还是11111000了,电路连接一定要注意这点
而且,串行驱动时候,一定要复位1us以上,才能变为串行模式,你程序中复位置1后立即置0
达不到这个时间要求。

既然用了循环,为啥要搞5个for啊?
引用
评论
ivansdk作者
14年1个月前IP:未同步
470855
2楼
回 1楼(ehco) 的帖子
十分感谢您的回复,我这就去试一下。
另外接成固定的电平就是接到VCC和GND么?还是要用单片机控制?还是要加排阻?
引用
评论
ivansdk作者
14年1个月前IP:未同步
470857
3楼
回 1楼(ehco) 的帖子
用5个for是因为w为unsigned char 如果循环到32位就要用long int了,比较长。
引用
评论
14年1个月前IP:未同步
470859
4楼
回 2楼(ivansdk) 的帖子
俺的电路是这样的,你看看D0-7
1.jpg
引用
评论
14年1个月前IP:未同步
470860
5楼
Re:回 1楼(ehco) 的帖子
引用第3楼ivansdk于2012-11-16 21:07发表的 回 1楼(ehco) 的帖子 :
用5个for是因为w为unsigned char 如果循环到32位就要用long int了,比较长。

您可以定义1个unsigned char{5} 的数组
然后两层for循环
外层5次
内层8次

外层进行指针操作,指向数组即可
引用
评论
14年1个月前IP:未同步
470865
6楼
顺便送你个俺以前写的东东 9850和9851基本是一样的 就是主频不一样而已

attachment icon DDS原理及AD9851电路设计、测试.pdf 777.96KB PDF 210次下载 预览

是这样的
AD9851 工作前必须对其进行初始化,AD9851 上电后默认为并行通信方式,如需采用串行通信方式,上
电后应将AD9851的D7~D0置为二进制数XXXXX011,紧接着依次往W_CLK和FQ_UD端输入宽度约1uS的
高电平脉冲就可以使AD9851工作在串行模式下。
引用
评论
ivansdk作者
14年1个月前IP:未同步
470871
7楼
回 6楼(ehco) 的帖子
哥,你真是我亲哥,太感谢了。
引用
评论
14年1个月前IP:未同步
470888
8楼
给LZ一个我买模块时候的资料
attachment icon AD9850模块.zip 3.48MB ZIP 58次下载
引用
评论
14年1个月前IP:未同步
470889
9楼
还有LZ我已经自己用Arduino写了程序成功控制AD9850,懒得看例程,看例程还不如自己读IC手册
引用
评论
ivansdk作者
14年1个月前IP:未同步
470903
10楼
回 8楼(justinpiggy) 的帖子
这东西下了,不过里面的我差不多全都有的。
我现在怀疑是我的电路没搭好。
愁nee。。
引用
评论
ivansdk作者
14年1个月前IP:未同步
470980
11楼
回 6楼(ehco) 的帖子
查了一下9850和9851的datasheet 发现 9851确实需要设置串口,但是9850没有这个的啊。。
引用
评论
ivansdk作者
14年1个月前IP:未同步
471032
12楼
原来是程序出的错误。
w=(y>>=0);
改为
w=(y>>0);
就可以了。
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的