打印
[电子元器件]

求助AD9833没有输出波形

[复制链接]
1690|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
由于之前焊了一块板子没有输出波形。所以重新焊了一块只有AD9833和25M晶振的板子,结果还是没有波形。经过万用表测试,输出基本上没有电压。AD9833数据手册上说输出正弦波和三角波时是0.65V,输出方波时输出为2.5V,可是没有输出信号,电压接近0,波形也没有。晶振的波形倒是正常的。

AD9833原理图.png (45.45 KB )

AD9833原理图.png

使用特权

评论回复

相关帖子

沙发
202059mm|  楼主 | 2021-5-3 12:05 | 只看该作者
程序是使用淘宝上的,应该没有问题的,IO口什么的也修改了。
main.c文件:

#include "STC15F2K60S2.H"
#include "ad9833.h"


void DelayMs( unsigned int ms)
{
        unsigned int i,j;
        for (i = 0; i < ms; i++)
                for(j=0;j<1074;j++);
}


void main()
{

        AD9833_WaveSeting(20000.0,0,SIN_WAVE,0 );//2KHz,        频率寄存器0,正弦波输出 ,初相位0
        while(1)
        {

        }
       
}


AD9833.C文件代码:

#include "ad9833.h"
#include "STC15F2K60S2.H"


sbit FSYNC  =  P3^3;
sbit CLK           =  P3^1;
sbit DAT          =  P3^0;


#define FSYNC_0()                FSYNC =0
#define FSYNC_1()                FSYNC =1

#define SCK_0()                CLK = 0
#define SCK_1()                CLK = 1                         

#define DAT_0()                DAT = 0
#define DAT_1()                DAT = 1

#define CS_0()                        CS = 0
#define CS_1()                        CS = 1



static void AD9833_Delay(void)
{
        unsigned int i;
        for (i = 0; i < 1; i++);
}



//向SPI总线发送16个bit数据
void AD9833_Write(unsigned int TxData)
{
        unsigned char i;

        SCK_1();
        //AD9833_Delay();
        FSYNC_1();
        //AD9833_Delay();
        FSYNC_0();
        AD9833_Delay();
        for(i = 0; i < 16; i++)
        {
                if(TxData&0x8000)                       
                        DAT_1();
                else
                        DAT_0();

                       

                AD9833_Delay();
                SCK_0();
                AD9833_Delay();               
                SCK_1();
               
                TxData <<= 1;
        }
        FSYNC_1();
       
}




void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR,unsigned int WaveMode,unsigned int Phase )
{

                int frequence_LSB,frequence_MSB,Phs_data;
                double   frequence_mid,frequence_DATA;
                long int frequence_hex;

                /*********************************计算频率的16进制值***********************************/
                frequence_mid=268435456/25;//适合25M晶振           2^28/fmclk          AD9833模拟输出为f=fmclk/2^28 *FREQREG
                                                             //如果时钟频率不为25MHZ,修改该处的频率值,单位MHz ,AD9833最大支持25MHz
                frequence_DATA=Freq;
                frequence_DATA=frequence_DATA/1000000;
                frequence_DATA=frequence_DATA*frequence_mid;        //FREQREG = f * 2^28/fmclk
                frequence_hex=frequence_DATA;                                //这个frequence_hex的值是32位的一个很大的数字,需要拆分成两个14位进行处理;
                frequence_LSB=frequence_hex;                                  //frequence_hex低16位送给frequence_LSB
                frequence_LSB=frequence_LSB&0x3fff;                       //去除最高两位,16位数换去掉高位后变成了14位
                frequence_MSB=frequence_hex>>14;                         //frequence_hex高16位送给frequence_HSB
                frequence_MSB=frequence_MSB&0x3fff;                     //去除最高两位,16位数换去掉高位后变成了14位

                Phs_data=Phase|0xC000;                                              //相位值
                AD9833_Write(0x0100);                                           //复位AD9833,即RESET位为1
                AD9833_Write(0x2100);                                           //选择数据一次写入,B28位和RESET位为1

                if(Freq_SFR==0)                                                  //把数据设置到设置频率寄存器0
                {
                         frequence_LSB=frequence_LSB|0x4000;
                         frequence_MSB=frequence_MSB|0x4000;
                         //使用频率寄存器0输出波形
                        AD9833_Write(frequence_LSB);                      //L14,选择频率寄存器0的低14位数据输入
                        AD9833_Write(frequence_MSB);                    //H14 频率寄存器的高14位数据输入
                        AD9833_Write(Phs_data);                                 //设置相位
                        //AD9833_Write(0x2000);                             /**设置FSELECT位为0,芯片进入工作状态,频率寄存器0输出波形**/
            }
                if(Freq_SFR==1)                                              //把数据设置到设置频率寄存器1
                {
                         frequence_LSB=frequence_LSB|0x8000;
                         frequence_MSB=frequence_MSB|0x8000;
                        //使用频率寄存器1输出波形
                        AD9833_Write(frequence_LSB);                  //L14,选择频率寄存器1的低14位输入
                        AD9833_Write(frequence_MSB);                //H14 频率寄存器1为
                        AD9833_Write(Phs_data);                             //设置相位
                        //AD9833_Write(0x2800);                       /**设置FSELECT位为0,设置FSELECT位为1,即使用频率寄存器1的值,芯片进入工作状态,                                                                                          频率寄存器1输出波形**/
                }

                if(WaveMode==TRI_WAVE)                     //输出三角波波形               
                         AD9833_Write(0x2002);
                if(WaveMode==SQU_WAVE)                     //输出方波波形
                        AD9833_Write(0x2028);                      //AD9833_Write(0x2028);
                if(WaveMode==SIN_WAVE)                      //输出正弦波形
                        AD9833_Write(0x2000);

}



使用特权

评论回复
板凳
coody| | 2021-5-3 21:16 | 只看该作者
不应该啊,AD9833差不多是AD98xx系列最简单的了。

使用特权

评论回复
评论
202059mm 2021-5-4 21:51 回复TA
我也很纳闷,调几天了没出波形emmm... 
地板
airwill| | 2021-5-6 13:44 | 只看该作者
先查查供电, 焊接和连接等低级问题, 再看
虽然很低级, 但是却很常见

使用特权

评论回复
5
xmar| | 2021-5-6 14:39 | 只看该作者
void AD9833_Write(unsigned int TxData) 改为:

void AD9833_Write(unsigned int TxData)
{
        unsigned char i;

        SCK_1();
        //AD9833_Delay();
        FSYNC_1();
        //AD9833_Delay();
        FSYNC_0();
        AD9833_Delay();
        for(i = 0; i < 16; i++)
        {
                if(TxData&0x8000)                       
                        DAT_1();
                else
                        DAT_0();
                AD9833_Delay();
                SCK_0();
                AD9833_Delay();               
                SCK_1();
               
                TxData <<= 1;
        }
        FSYNC_1();
       //增加下面三行:
        AD9833_Delay();
        DAT_1();
        AD9833_Delay();
      
}

使用特权

评论回复
6
202059mm|  楼主 | 2021-5-8 12:46 | 只看该作者
问题解决,是芯片问题,买到了两个假芯片,刚开始以为不是硬件问题,毕竟换了两个芯片了,后面发现这个AD9833输出电压有时是0V,有时候是接近电源电压。直接买了一个AD9833模块,把芯片拆下来用,最终实现了波形输出

使用特权

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

本版积分规则

2

主题

18

帖子

0

粉丝