打印

请教ad9850的频率问题

[复制链接]
3211|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cuikaimin|  楼主 | 2008-8-21 09:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
computer00| | 2008-8-21 10:39 | 只看该作者

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

使用特权

评论回复
板凳
cuikaimin|  楼主 | 2008-8-22 09:23 | 只看该作者

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

//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg52.h>
#include <intrins.h>
#include <ABSACC.H>        
//-----------------------定义管脚--------------------------------------------------------
#define  data_OUT P1
#define uchar unsigned char
sbit FQ_UD=P2^7;          //AD9850信号更新申请 
sbit W_CLK=P2^6;          //写控制字时钟
sbit WD=P3^3;
uchar CON_word[5]; 
//--------------------------------------------------------------------------------------------------
// 函数名称: init_dds()
// 函数功能: DDS初始化
//--------------------------------------------------------------------------------------------------
void init_dds(void)
{
   W_CLK=0;
   FQ_UD=0;
   W_CLK=1;
   W_CLK=0;
   FQ_UD=1;
   FQ_UD=0;
}

//--------------------------------------------------------------------------------------------------
// 函数名称: WRITE_AD9850
// 函数功能: 将控制字写入AD9850
//--------------------------------------------------------------------------------------------------
void Freq_Adjust(unsigned long value_Freq)
 {  
    uchar i; 
    unsigned long f;
    uchar L4,L3,L2,L1,L0; 
    FQ_UD=0; 
    f=value_Freq*34.359738368;
    L0=0x00;
    L4= f&0x000000ff;
    L3=(f>>8)&0x000000ff;
    L2=(f>>16)&0x000000ff;
    L1=(f>>24)&0x000000ff;
   CON_word[0]=L0;
   CON_word[4]=L4;
   CON_word[3]=L3;
   CON_word[2]=L2;
   CON_word[1]=L1;
     FQ_UD=0;
     W_CLK=0;
   for(i=0;i<5;i++)
 {  
    data_OUT=CON_word;      //送控制字 
    W_CLK=0;
    W_CLK=1;                   //上升延
  }
 W_CLK=0;
 FQ_UD=1;
 FQ_UD=0;

}
//--------------------------------------------------------------------------------------------------
// 函数名称:main
// 用户主函数
// 函数功能:主函数
//--------------------------------------------------------------------------------------------------
void main()
{   
    init_dds();
    FQ_UD=0;
    Freq_Adjust(15);//输出频率为15Hz
    TMOD=0x00;
    TH0=0xC1;TL0=0x10;
    TR0=1;
    while(1)
    {
        do{}while(!TF0);
        WD=!WD;
    }
    while(1);
}

使用特权

评论回复
地板
cuikaimin|  楼主 | 2008-8-22 09:37 | 只看该作者

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

我用12M的时候频率在10k以下频率是无规律的,10k以上跟你写的频率有差,不准确。

使用特权

评论回复
5
cuikaimin|  楼主 | 2008-8-22 09:43 | 只看该作者

computer00麻烦您再帮我看看

谢了!

使用特权

评论回复
6
computer00| | 2008-8-22 10:24 | 只看该作者

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

写数据的顺序对否?

使用特权

评论回复
7
cuikaimin|  楼主 | 2008-8-22 16:22 | 只看该作者

是8位并行的数据口。

写数据的顺序也没错

使用特权

评论回复
8
stycx| | 2008-8-23 09:48 | 只看该作者

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

ad9850好象有个工具可以计算控制字

使用特权

评论回复
9
AD9851| | 2008-8-23 10:38 | 只看该作者

给你三个问题

1. 9850正弦波你测了没有?现象是怎样的?
2. 正弦波有没有经过滤波再送方波比较器?
3. 比较器参考端电压足够稳定吗?

使用特权

评论回复
10
cuikaimin|  楼主 | 2008-8-25 15:45 | 只看该作者

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

正弦波没有经过滤波.
比较器参考端电压足够稳定,5.07V.

使用特权

评论回复
11
cuikaimin|  楼主 | 2008-8-25 15:53 | 只看该作者

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

我看别的程序写频率控制字时都有一定的延时,我的程序没有.不知道多长合适.
PCB的布线会不会影响频率?

使用特权

评论回复
12
赤铸| | 2008-8-25 16:13 | 只看该作者

f=value_Freq*34.359738368 ?

怎么算的?

使用特权

评论回复
13
cuikaimin|  楼主 | 2008-8-25 18:34 | 只看该作者

什么怎么算的?

是这个公式吗?
资料上就是这样算的啊。

使用特权

评论回复
14
cuikaimin|  楼主 | 2008-8-26 10:20 | 只看该作者

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

感激不尽!
我的邮箱是:cuikaimin@yahoo.com.cn
谢谢!

使用特权

评论回复
15
h572| | 2008-9-1 19:29 | 只看该作者

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

f=value_Freq*34.359738368;
昨这样算呢!误差好大的。
参考一下我的程序!
计算结果正确,就费点时间!
   //phase(内部寄存器w)=fout  *  2^32  /  system clock
   //****************calculation W
  unsigned long tmp1,tmp2,tmp3,dat_dds;
  unsigned char w0_ser,w1_ser,w2_ser,w3_ser,w4_ser;
   tmp1=120000000;                     //输入晶振
   tmp2=dat_fre1;                        //输入频率
   tmp3=0;                               //calculation result
   for (i=0;i<32;i++)
   {
      if(tmp2>tmp1)
      {
         tmp3=tmp3+1;
         tmp3=tmp3+tmp3;
         tmp2=tmp2-tmp1;
         tmp2=tmp2+tmp2;
      }
      else
      {
         tmp3=tmp3+tmp3;
         tmp2=tmp2+tmp2;
      }
   }
   dat_dds=tmp3;                         //RESULT IN tmp3
   //*************************
   w3_ser=dat_dds>>24;
   w2_ser=dat_dds>>16;
   w1_ser=dat_dds>>8;
   w0_ser=dat_dds;
   w4_ser=0x04;                          //refclk*6

使用特权

评论回复
16
tosca| | 2008-9-1 19:51 | 只看该作者

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

0

粉丝