搜索
bottom↓
回复: 12

ad9833芯片调试中,为什么只出现方波?

[复制链接]

出0入0汤圆

发表于 2009-8-10 09:05:25 | 显示全部楼层 |阅读模式
大家好,我最近正在调试AD9833这款芯片,调试结果只能出现方波,写入正弦波和三角波的控制字时,输出的都是低电平,我怀疑是硬件的问题,但是硬件的连接图是按AD9833数据手册上提供的典型电路图连接的,真是想破脑袋了,哪位高手能指点指点啊?谢谢了!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-8-10 21:30:13 | 显示全部楼层
把你的源码贴出来我看看,前段时间刚搞完这个。呵呵。

本来在博客上贴出我的AD9833的固件驱动源码,发现家里的电脑没有程序,后续贴出来在告诉你。

出0入0汤圆

 楼主| 发表于 2009-8-11 09:03:22 | 显示全部楼层
哦,谢谢你了,我选的外部时钟是1MHz的,产生的是固定频率1HZ的正弦波,所以频率寄存器0的低字节写0X410C,高字节写0X4000,具体程序如下:
//包含所需头文件
#include <iom16.h>
#define uchar unsigned char
#define uint unsigned int


//宏定义
#define FSYNC_L  PORTB_Bit4=0   //置AD9833_FSYNC为低电平,使能AD9833 SPI通讯
#define FSYNC_H  PORTB_Bit4=1     //置AD9833_FSYNC为为高电平,关断AD9833 SPI通讯
#define SCL_L    PORTB_Bit7=0      //SPI总线时钟线
#define SCL_H    PORTB_Bit7=1
#define SDA_L    PORTB_Bit5=0       //SPI总线数据线
#define SDA_H    PORTB_Bit5=1

//函数声明
void port_init(void);
void init_ad9833(void);
void Write_word (uint data);
void put(unsigned long freq_value);
void DelayMs(uint i);
//主函数
void main(void)
{
   port_init();
   init_ad9833();   //初始化AD9833
   Write_word(0x2000); //28位连续,选择频率0,相位0,RESET=0 ,选择正弦波输出
   Write_word(0x410c); //写频率0寄存器的低字节LSB(1Hz的正弦波)
   Write_word(0x4000); //写频率0寄存器的高字节MSB
   Write_word(0xc000); //写相位0寄存器
   DelayMs(20);
while(1)
{}
}

//端口初始化
void port_init(void)
{
  DDRB  = 0xFF;
  PORTB = 0xFF;
}
//初始化AD9833
void init_ad9833(void)
{
Write_word(0x2100); //28位连续,选择频率0,相位0,RESET=1
Write_word(0x4000); //写频率0寄存器的低字节LSB
Write_word(0x4000); //写频率0寄存器的高字节MSB
Write_word(0xc000); //写相位0寄存器
}
//写16位数据到AD9833,软件SPI方式
void Write_word (uint data)
{
uchar i;
SCL_H;
FSYNC_H;
DelayMs(1);
FSYNC_L;
for(i=0;i<16;i++)
{
  if(data&0x8000)
  {
    SDA_H;
  }  
  else      
  {
    SDA_L;
  }
     SCL_L;
     DelayMs(2);
     SCL_H;
     DelayMs(2);
     data=data<<1;
}
    DelayMs(1);
     FSYNC_H;
    DelayMs(5);
      SCL_L;
     
}
//延时子程序
void DelayMs(uint i)
{
  uint j;
  for(;i!=0;i--)
  {
   for(j=20;j!=0;j--)
    {;}
  }
}

出0入0汤圆

发表于 2009-8-11 09:36:46 | 显示全部楼层
贴一个我用两个AD9833产生的I&Q信号

void dds0_load(void)                        //I_DDS load
{
        PORTD&=~(1<<PD6);
        for(i=0;i<16;i++)
        {
                if((temp&0x8000)==0) PORTD&=~(1<<PD3);
                else PORTD|=(1<<PD3);
                PORTD&=~(1<<PD2);
                PORTD|=(1<<PD2);
                temp=temp<<1;
        }
        PORTD|=(1<<PD6);
}

void dds1_load(void)                        //Q_DDS load
{
        PORTD&=~(1<<PD7);
        for(i=0;i<16;i++)
        {
                if((temp&0x8000)==0) PORTD&=~(1<<PD3);
                else PORTD|=(1<<PD3);
                PORTD&=~(1<<PD2);
                PORTD|=(1<<PD2);
                temp=temp<<1;
        }
        PORTD|=(1<<PD7);
}
/*         PD2--------CLK
        PD3--------DATA
        PD6--------I_DDS
        PD7--------Q_DDS*/
void dds_load(void)                                //I&Q_DDS load
{
        temp=0x2100;
        dds0_load();
        temp=freq_L;
        dds0_load();
        temp=freq_H;
        dds0_load();
        temp=0xC000;
        dds0_load();
        temp=0x2100;
        dds1_load();
        temp=freq_L;
        dds1_load();
        temp=freq_H;
        dds1_load();
        temp=phase;
        dds1_load();
        temp=0x2000;
        PORTD&=~(1<<PD6);
        PORTD&=~(1<<PD7);
        for(i=0;i<16;i++)
        {
                if((temp&0x8000)==0) PORTD&=~(1<<PD3);
                else PORTD|=(1<<PD3);
                PORTD&=~(1<<PD2);
                PORTD|=(1<<PD2);
                temp=temp<<1;
        }
        PORTD+=0xC0;
}

出0入0汤圆

发表于 2009-8-11 20:06:53 | 显示全部楼层
把程序带过来了,呵呵,放到我的博客上了,论坛里就不贴全部的了,排版麻烦。

看你的程序,估计是不是参考了网上的很多别人编写的?我的AD9833初始的清零工作是如下进行的:

void AD9833_reset()
{
//add code here
AD9833_writedata(0x0100);      //寄存器复位
AD9833_writedata(0x2000);      //准备清空频率寄存器0
AD9833_writedata(0x4000);      //Filled with 0
AD9833_writedata(0x4000);      //Filled with 0
AD9833_writedata(0x2000);      //Prepare for clear Fre1
AD9833_writedata(0x8000);      //Filled with 0
AD9833_writedata(0x8000);         //Filled with 0
AD9833_writedata(0xD000);      //clear PHS 0
AD9833_writedata(0xF000);      //clear PHS 1
}

当时我犯的错误是这样的:
AD9833_writedata(0x2100);

后面将其更改为:
AD9833_writedata(0x0100);      //寄存器复位
AD9833_writedata(0x2000);      //准备清空频率寄存器0

就OK了。

你试试可不可以。

我的AT89S52+AD9833驱动程序查看地址:
http://qmstart1984.blog.163.com/blog/static/120691293200971111509177/

有问题在联系我。

出0入0汤圆

 楼主| 发表于 2009-8-12 12:32:31 | 显示全部楼层
哦,参考了不少的网上资料,那就博客上讨论

出0入0汤圆

发表于 2010-2-23 21:31:12 | 显示全部楼层
你把输出那个电容拿掉试试

出0入0汤圆

发表于 2011-3-26 23:52:02 | 显示全部楼层
AD9833 mark

出0入0汤圆

发表于 2011-4-1 12:58:07 | 显示全部楼层
做过,我那时正好出的正弦波,呵呵

出0入0汤圆

发表于 2011-7-4 16:15:06 | 显示全部楼层
正在调试。。

出0入0汤圆

发表于 2011-12-27 11:25:13 | 显示全部楼层
请问3楼老兄,AD9833的相位寄存器怎麽设定?

我想要产生IQ信号的话,一颗要设0度,一颗要设90度,

那这两颗寄存器的值要设多少?

出0入0汤圆

发表于 2012-2-28 16:21:53 | 显示全部楼层
有可能是片上DAC被静电打坏了。

出0入0汤圆

发表于 2013-8-25 23:08:41 | 显示全部楼层
學習了!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表