请教ad9850的频率问题

[复制链接]
4246|15
 楼主| cuikaimin 发表于 2008-8-21 09:24 | 显示全部楼层 |阅读模式
我用ad9850产生方波,波形是出来了,但频率不准确是怎么回事?刚开始用的是12m的晶振,以为是太小了,后来又换成125m还是不行.有谁用过指点一下啊!急.
computer00 发表于 2008-8-21 10:39 | 显示全部楼层

频率不准应该是控制字没写对。

  
 楼主| cuikaimin 发表于 2008-8-22 09:23 | 显示全部楼层

下面是我的程序,各位帮忙看看有什么问题。

//-----------------------函数声明,变量定义--------------------------------------------------------<br />#include&nbsp;&ltreg52.h&gt<br />#include&nbsp;&ltintrins.h&gt<br />#include&nbsp;&ltABSACC.H&gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />//-----------------------定义管脚--------------------------------------------------------<br />#define&nbsp;&nbsp;data_OUT&nbsp;P1<br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char<br />sbit&nbsp;FQ_UD=P2^7;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//AD9850信号更新申请&nbsp;<br />sbit&nbsp;W_CLK=P2^6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写控制字时钟<br />sbit&nbsp;WD=P3^3;<br />uchar&nbsp;CON_word[5];&nbsp;<br />//--------------------------------------------------------------------------------------------------<br />//&nbsp;函数名称:&nbsp;init_dds()<br />//&nbsp;函数功能:&nbsp;DDS初始化<br />//--------------------------------------------------------------------------------------------------<br />void&nbsp;init_dds(void)<br />{<br />&nbsp;&nbsp;&nbsp;W_CLK=0;<br />&nbsp;&nbsp;&nbsp;FQ_UD=0;<br />&nbsp;&nbsp;&nbsp;W_CLK=1;<br />&nbsp;&nbsp;&nbsp;W_CLK=0;<br />&nbsp;&nbsp;&nbsp;FQ_UD=1;<br />&nbsp;&nbsp;&nbsp;FQ_UD=0;<br />}<br /><br />//--------------------------------------------------------------------------------------------------<br />//&nbsp;函数名称:&nbsp;WRITE_AD9850<br />//&nbsp;函数功能:&nbsp;将控制字写入AD9850<br />//--------------------------------------------------------------------------------------------------<br />void&nbsp;Freq_Adjust(unsigned&nbsp;long&nbsp;value_Freq)<br />&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;i;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;f;<br />&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;L4,L3,L2,L1,L0;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;FQ_UD=0;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;f=value_Freq*34.359738368;<br />&nbsp;&nbsp;&nbsp;&nbsp;L0=0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;L4=&nbsp;f&0x000000ff;<br />&nbsp;&nbsp;&nbsp;&nbsp;L3=(f&gt&gt8)&0x000000ff;<br />&nbsp;&nbsp;&nbsp;&nbsp;L2=(f&gt&gt16)&0x000000ff;<br />&nbsp;&nbsp;&nbsp;&nbsp;L1=(f&gt&gt24)&0x000000ff;<br />&nbsp;&nbsp;&nbsp;CON_word[0]=L0;<br />&nbsp;&nbsp;&nbsp;CON_word[4]=L4;<br />&nbsp;&nbsp;&nbsp;CON_word[3]=L3;<br />&nbsp;&nbsp;&nbsp;CON_word[2]=L2;<br />&nbsp;&nbsp;&nbsp;CON_word[1]=L1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FQ_UD=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W_CLK=0;<br />&nbsp;&nbsp;&nbsp;for(i=0;i&lt5;i++)<br />&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;data_OUT=CON_word;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//送控制字&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;W_CLK=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;W_CLK=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//上升延<br />&nbsp;&nbsp;}<br />&nbsp;W_CLK=0;<br />&nbsp;FQ_UD=1;<br />&nbsp;FQ_UD=0;<br /><br />}<br />//--------------------------------------------------------------------------------------------------<br />//&nbsp;函数名称:main<br />//&nbsp;用户主函数<br />//&nbsp;函数功能:主函数<br />//--------------------------------------------------------------------------------------------------<br />void&nbsp;main()<br />{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;init_dds();<br />&nbsp;&nbsp;&nbsp;&nbsp;FQ_UD=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;Freq_Adjust(15);//输出频率为15Hz<br />&nbsp;&nbsp;&nbsp;&nbsp;TMOD=0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;TH0=0xC1;TL0=0x10;<br />&nbsp;&nbsp;&nbsp;&nbsp;TR0=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do{}while(!TF0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WD=!WD;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />}<br />
 楼主| cuikaimin 发表于 2008-8-22 09:37 | 显示全部楼层

上面的程序竟然生产30Hz的方波。

我用12M的时候频率在10k以下频率是无规律的,10k以上跟你写的频率有差,不准确。
 楼主| cuikaimin 发表于 2008-8-22 09:43 | 显示全部楼层

computer00麻烦您再帮我看看

谢了!
computer00 发表于 2008-8-22 10:24 | 显示全部楼层

没用过9850,它是8位并行的数据口?

写数据的顺序对否?
 楼主| cuikaimin 发表于 2008-8-22 16:22 | 显示全部楼层

是8位并行的数据口。

写数据的顺序也没错
stycx 发表于 2008-8-23 09:48 | 显示全部楼层

检查控制字是否正确.直接输入 L0-L5 看是否正常

ad9850好象有个工具可以计算控制字
AD9851 发表于 2008-8-23 10:38 | 显示全部楼层

给你三个问题

1.&nbsp;9850正弦波你测了没有?现象是怎样的?<br />2.&nbsp;正弦波有没有经过滤波再送方波比较器?<br />3.&nbsp;比较器参考端电压足够稳定吗?
 楼主| cuikaimin 发表于 2008-8-25 15:45 | 显示全部楼层

9850的正弦波波形很好,无杂波.频率跟输出方波一样.

正弦波没有经过滤波.<br />比较器参考端电压足够稳定,5.07V.<br />
 楼主| cuikaimin 发表于 2008-8-25 15:53 | 显示全部楼层

我都怀疑是程序的延时有问题.

我看别的程序写频率控制字时都有一定的延时,我的程序没有.不知道多长合适.<br />PCB的布线会不会影响频率?<br />
赤铸 发表于 2008-8-25 16:13 | 显示全部楼层

f=value_Freq*34.359738368 ?

怎么算的?
 楼主| cuikaimin 发表于 2008-8-25 18:34 | 显示全部楼层

什么怎么算的?

是这个公式吗?<br />资料上就是这样算的啊。
 楼主| cuikaimin 发表于 2008-8-26 10:20 | 显示全部楼层

谁有c51ad9850的正确程序,麻烦发给我学习一下.

感激不尽!<br />我的邮箱是:cuikaimin@yahoo.com.cn<br />谢谢!
h572 发表于 2008-9-1 19:29 | 显示全部楼层

昨这样算呢!误差好大的。

f=value_Freq*34.359738368;<br />昨这样算呢!误差好大的。<br />参考一下我的程序!<br />计算结果正确,就费点时间!<br />&nbsp;&nbsp;&nbsp;//phase(内部寄存器w)=fout&nbsp;&nbsp;*&nbsp;&nbsp;2^32&nbsp;&nbsp;/&nbsp;&nbsp;system&nbsp;clock<br />&nbsp;&nbsp;&nbsp;//****************calculation&nbsp;W<br />&nbsp;&nbsp;unsigned&nbsp;long&nbsp;tmp1,tmp2,tmp3,dat_dds;<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;w0_ser,w1_ser,w2_ser,w3_ser,w4_ser;<br />&nbsp;&nbsp;&nbsp;tmp1=120000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输入晶振<br />&nbsp;&nbsp;&nbsp;tmp2=dat_fre1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输入频率<br />&nbsp;&nbsp;&nbsp;tmp3=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//calculation&nbsp;result<br />&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;i&lt32;i++)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(tmp2&gttmp1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp3=tmp3+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp3=tmp3+tmp3;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp2=tmp2-tmp1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp2=tmp2+tmp2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp3=tmp3+tmp3;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp2=tmp2+tmp2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;dat_dds=tmp3;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RESULT&nbsp;IN&nbsp;tmp3<br />&nbsp;&nbsp;&nbsp;//*************************<br />&nbsp;&nbsp;&nbsp;w3_ser=dat_dds&gt&gt24;<br />&nbsp;&nbsp;&nbsp;w2_ser=dat_dds&gt&gt16;<br />&nbsp;&nbsp;&nbsp;w1_ser=dat_dds&gt&gt8;<br />&nbsp;&nbsp;&nbsp;w0_ser=dat_dds;<br />&nbsp;&nbsp;&nbsp;w4_ser=0x04;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//refclk*6
tosca 发表于 2008-9-1 19:51 | 显示全部楼层

去AD官方网站下个专用计算工具,很好用的

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部