找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3808|回复: 8
打印 上一主题 下一主题
收起左侧

两AD9833如何实现示波器同步输出,并且相位可调

[复制链接]
跳转到指定楼层
楼主
200黑币
     SPI模式写AD9833

     实现功能:两个AD9833,其中一个为基准输出频率为60KHZ,0初始相位正弦波,另一AD9833输出同频率60KHZ,(相位需可调)正弦波。两波形用示波器显示,通过调整另一波形的相位并用示波器观察两波形的相位差。
    遇到问题:示波器如何同步显示两波形。若能同步,可否其中一个波形固定,另一波形相位可调?


硬件图:




程序如下:
sbit f_sync = P2^2;
sbit s_clk         = P2^1;
sbit s_data = P2^0;


#define DDS_SCLK_UP         s_clk=1
#define DDS_SCLK_DOWN         s_clk=0

#define DDS_SDATA_UP         s_data=1
#define DDS_SDATA_DOWN         s_data=0

#define DDS_FSYNC_UP         f_sync=1
#define DDS_FSYNC_DOWN         f_sync=0

//#define BITB 0x0800


//AD9833输入时钟值
unsigned long int MCLK=25000000;       
double p=3.141592653589793;
//寄存器配置数组
unsigned int Config_Data[8];

//频率
unsigned long int code freq[5]={30000,60000,120000,480000,960000};

//函数声明
static void delay2us(unsigned char i);
static void changeFreq(unsigned char key);
static unsigned char getKeyValue();
void writeDDS2Byte(unsigned int config);
void waveGenerate(unsigned long int frequency,double phase,unsigned char signal_type);


//void main(void)
//{
//        waveGenerate(freq[4],2*p,0); //
//}


/*******************************************************************
*        功能:波形发生器
*
*        入口参数:         frequency: 期望得到的信号频率 (frequency<MCLK)
*
*                          phase:期望得到的相位
*
*             signal_type:0正弦波1(三角波),2(方波)   
*
*        默认配置:         0相移,方波不分频
*******************************************************************/
void waveGenerate(unsigned long int frequency,double phase,unsigned char signal_type)
{
        unsigned char k;
        unsigned long int freq_temp;
        unsigned int phase_temp;
        if(frequency>MCLK)
        frequency=MCLK;
        switch(signal_type)
        {
                case 0://正弦波
                        Config_Data[0]=0x2108;//控制寄存器配置值,复位片内其他寄存器,AD9833上电时,期间应复位,要使AD9833复位应将reset位置1,即bit8置1,要通过Vout引脚提供正弦波输出,应将mode(D1)bit清0并将OPBITEN(D5)bit清0,当DIV2=1时即bit3=1,DAC的MSB被直接送至Vout引脚
                        Config_Data[7]=0x2008;//控制寄存器配置值,不复位片内其他寄存器,要使AD9833退出复位,应将该位清零,即bit8位清零,要通过Vout引脚提供正弦波输出,应将mode(D1)bit清0并将OPBITEN(D5)bit清0,当DIV2=1时即bit3=1,DAC的MSB被直接送至Vout引脚
                break;
                case 1://三角波
                        Config_Data[0]=0x210A;//控制寄存器配置值,复位片内其他寄存器,AD9833上电时,期间应复位,要使AD9833复位应将reset位置1,即bit8置1,要通过Vout引脚提供三角波输出,应将mode(D1)1,DIV2=1时即bit3=1,DAC的MSB被直接送至Vout引脚
                        Config_Data[7]=0x200A;//控制寄存器配置值,不复位片内其他寄存器,要使AD9833退出复位,应将该位清零,即bit8位清零,要通过Vout引脚提供三角波输出,应将mode(D1)置1,DIV2=1时即bit3=1,DAC的MSB被直接送至Vout引脚
                break;
                case 2://方波,不分频
                        Config_Data[0]=0x2128;//控制寄存器配置值,复位片内其他寄存器,AD9833上电时,期间应复位,要使AD9833复位应将reset位置1,即bit8置1,当OPBITEN(D5)置1,mode(D1)清0,DIV2=1时即bit3=1,Vout输出DAC数据MSB
                        Config_Data[7]=0x2028;//控制寄存器配置值,不复位片内其他寄存器,要使AD9833退出复位,应将该位清零,即bit8位清零,当OPBITEN(D5)置1,mode(D1)清0,DIV2=1时即bit3=1,Vout输出DAC数据MSB
                        break;
                default://正弦波
                        Config_Data[0]=0x2108;
                        Config_Data[7]=0x2008;
                break;
        }
        //freq_temp=frequency*(2^28/MCLK),MCLK=6Mhz?,2^28/MCLK约等于44.739242666666669
        //phase_temp=phase*(4096/2p),p=3.141592653589793
        freq_temp=frequency*10.73741824; //载入所选频率寄存器的值,此信号会经过如下相位偏移处理,2?/4096*PHASEREG,PHASEREG是所选相位输出频率和参考时钟频率之间的关系,必须考虑所选输出频率和参考时钟频率之间的关系,以免产生不良的输出异常
        phase_temp=phase*(4096/2*p);//651.898646904403295309
        Config_Data[1]=freq_temp&0x3fff;//先将bit15,bit14位清0,控制字写入
        Config_Data[3]=Config_Data[1];//先将bit15,bit14位清0,控制字写入
        Config_Data[2]=(freq_temp&0x0fffc000)>>14;//先将bit15,bit14位清0,控制字写入
        Config_Data[4]=Config_Data[2];//先将bit15,bit14位清0,控制字写入
        Config_Data[5]=phase_temp&0x1fff;
        Config_Data[5]=Config_Data[6];


        Config_Data[1]=Config_Data[1]|0x4000;//(频率寄存器)FREQ0 14 LSBs,bit15=0,bit14=1,FREQ0寄存器写入
        Config_Data[2]=Config_Data[2]|0x4000;//(频率寄存器)FREQ0 14 MSBs,bit15=0,bit14=1,FREQ0寄存器写入
        Config_Data[3]=Config_Data[3]|0x8000;//(频率寄存器)FREQ1 14 LSBs,bit15=1,bit14=0,FREQ1寄存器写入
        Config_Data[4]=Config_Data[4]|0x8000;//(频率寄存器)FREQ1 14 MSBs,bit15=1,bit14=0,FREQ1寄存器写入
//        Config_Data[5]=0xC000;//(相位寄存器)PHASE0
//        Config_Data[6]=0xE000;//(相位寄存器)PHASE1
        Config_Data[5]=Config_Data[5]|0xC000;//(相位寄存器)PHASE0,bit15=1,bit14=1,bit13=0,PHASE0寄存器写入
        Config_Data[6]=Config_Data[6]|0xE000;//(相位寄存器)PHASE1,bit15=1,bit14=1,bit13=1,PHASE1寄存器写入
        for(k=0;k<8;k++)
        {
                writeDDS2Byte(Config_Data[k]);
        }
}

/***********************************************************************************************
*
*        软件模拟SPI
*
*        向AD9833写入数据或控制信息时0,FSYNC应处于低电平并保持低电平,直到数据的16个位均已写入AD9833为止,FSYNC信号以帧方式传输要载入AD9833的16位信息
*
*        向AD9833发送数据时,FSYNC被拉低,单片机以8位字节传输数据,因此每个周期中只有8个SCLK下降沿,要向AD9833中载入剩余的8个位,FSYNC应在第一批8个位传输完成后保持低电平,同时启动第二次写操作来传输数
*        据的第二个字节,第二次写操作结束后FSYNC被拉高,SCLK应在两次写操作之间处于高电平空闲状态
*
************************************************************************************************/
void writeDDS2Byte(unsigned int config)
{
        unsigned char i;
        DDS_SCLK_DOWN;//拉低SCLK
        _nop_();//延时
        DDS_FSYNC_UP;//拉高FSYNC
        _nop_();//延时
        DDS_SCLK_UP;//拉高SCLK
        delay2us(1);//延时1us
        DDS_FSYNC_DOWN;//发送数据时,FSYNC拉低
        _nop_();
        for (i=0; i<16; i++)
        {
                if (config & 0x8000)
                DDS_SDATA_UP;//SDATA拉高
                else
                DDS_SDATA_DOWN;//SDATA拉低
                delay2us(1);//延时1us
                DDS_SCLK_DOWN;//SCLK拉低
                delay2us(1);//延时1us
                DDS_SCLK_UP;//SCLK拉高
                config <<= 1;//config循环左移一位
        }
        DDS_FSYNC_UP;//FSYNC拉高
        _nop_();//延时
        DDS_SCLK_DOWN;//SCLK拉低
        delay2us(100);//延时100us
}


static void delay2us(unsigned char i)
{
        while (--i);
}




AD9833_cn.pdf

885.82 KB, 下载次数: 19

最佳答案

查看完整内容

试试共用时钟线,同时操作两器件。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:868494 发表于 2020-12-1 11:15 | 只看该作者
试试共用时钟线,同时操作两器件。
回复

使用道具 举报

板凳
ID:743654 发表于 2020-12-2 08:41 | 只看该作者
没人用过AD9833么,或者有没有其他可以同步输出两波形的DDS芯片?
回复

使用道具 举报

地板
ID:743654 发表于 2020-12-3 08:39 | 只看该作者
帖子别沉啊,来位大佬帮忙解答!
回复

使用道具 举报

5#
ID:743654 发表于 2020-12-4 08:45 | 只看该作者

帖子别沉啊,来位大佬帮忙解答!
回复

使用道具 举报

6#
ID:743654 发表于 2020-12-5 11:30 | 只看该作者
有没人用过DDS芯片的,或者有没别的方案能解决我的问题,急啊,进度一直卡在这边,在此感谢各位了
回复

使用道具 举报

7#
ID:790408 发表于 2020-12-5 12:57 | 只看该作者
可以换STM32芯片试一试,STM32的内部ADC就可以实现多路ADC的采集,定时器也有四路同步输出PWM波
回复

使用道具 举报

8#
ID:743654 发表于 2020-12-7 08:38 | 只看该作者
1922323908 发表于 2020-12-5 12:57
可以换STM32芯片试一试,STM32的内部ADC就可以实现多路ADC的采集,定时器也有四路同步输出PWM波

谢谢,我的MCU用的是51的,况且对STM32也不懂
回复

使用道具 举报

9#
ID:420836 发表于 2020-12-27 00:16 | 只看该作者
也许使用一个AD9833的输出来触发另一个的输出?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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