搜索
bottom↓
回复: 2

ad9850输出正弦波的相位如何设置呀,求助!!!

[复制链接]

出0入0汤圆

发表于 2012-10-1 11:57:31 | 显示全部楼层 |阅读模式
资料上讲,AD9850 的频率/相位控制字一共有 40 位,其中 32
位为频率控制字,5 位为相位控制字,1 位是电源休眠
控制,最后 2 位为工作方式控制,应用中将 1 位电源
休眠控制、两位工作方式控制字设置为“000”。
/********************************************
              信号发生器
*********************************************/

#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#define ad9850_w_clk PORTB_PB0
#define ad9850_fu_ud PORTB_PB1
#define ad9850_data  PORTB_PB2
#define ad9850_reset  PORTB_PB3
/*******************锁相环PLL设置***************/

void PLL_Init()   //总线时钟Fbus=60MHz
{      
  CLKSEL_PLLSEL=0;         
  PLLCTL_PLLON=1;         
  REFDV=0x40|0x03;      
  SYNR =0xc0|0x0e;      
                           
  POSTDIV=0;              
  _asm(nop);              
  _asm(nop);
  while(CRGFLG_LOCK!=1);
  CLKSEL_PLLSEL=1;         
}
/****************ad9850初始化******************/
void ad9850_init()
{
  ad9850_w_clk=0;
  ad9850_fu_ud=0;
  //rest信号
        ad9850_reset=0;
        ad9850_reset=1;
        ad9850_reset=0;
        //w_clk信号
        ad9850_w_clk=0;
        ad9850_w_clk=1;
        ad9850_w_clk=0;
        //fu_ud信号
        ad9850_fu_ud=0;
        ad9850_fu_ud=1;
        ad9850_fu_ud=0;       
}
//********************向ad9851中写命令与数据(串口)*******************************//
void ad9850_writebyte(unsigned char w0,double frequence)
{
        unsigned char i;
        long int w,y;
        double x;
        //计算频率的HEX值
        x=4294967295/125;//适合125M晶振/180为最终时钟频率
        //如果时钟频率不为125MHZ,修改该处的频率值,单位MHz  
        frequence=frequence/1000000;
        frequence=frequence*x;
        y=(long int)frequence;            
        //写w4数据
        w=y;
        for(i=0;i<8;i++)
        {
                ad9850_data=(w>>i)&0x01;
                ad9850_w_clk=1;
                ad9850_w_clk=0;
        }
        //写w3数据
        w=(y>>8);
        for(i=0;i<8;i++)
        {
                ad9850_data=(w>>i)&0x01;
                ad9850_w_clk=1;
                ad9850_w_clk=0;
        }
        //写w2数据
        w=(y>>16);
        for(i=0;i<8;i++)
        {
                ad9850_data=(w>>i)&0x01;
                ad9850_w_clk=1;
                ad9850_w_clk=0;
        }
        //写w1数据
        w=(y>>24);
        for(i=0;i<8;i++)
        {
                ad9850_data=(w>>i)&0x01;
                ad9850_w_clk=1;
                ad9850_w_clk=0;
        }
        //写w0数据
        w=w0;   
        for(i=0;i<8;i++)
        {
                ad9850_data=(w>>i)&0x01;
                ad9850_w_clk=1;
                ad9850_w_clk=0;
        }                    
        //移入始能
        ad9850_fu_ud=1;
        ad9850_fu_ud=0;
}
/****************主函数******************/
void main(void)
{
  PLL_Init();     //锁相环PLL设置  
  DDRB=0X0f;      //初始化AD9850对应的IO口
  PORTB=0X00;
  ad9850_init();        //初始化AD9850
  ad9850_writebyte(0x40,100);  //设置信号相位与频率 (想设置初相位为90度)
  DDRE_DDRE5=1;      //PE5设为输出
  PORTE_PE5  =0;     //亮LED1
  for(;;);
}
次程序频率可精确设置,但是相位无法正确输出,那位大神知道,请赐教!!!!!!!!!!!!!!

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入4汤圆

发表于 2012-10-1 12:38:58 | 显示全部楼层
不知道您怎么测试的初相位,对于单片AD9850来说相位没有意义吧,初相位的意义在于,两片AD9850若设置的初相位不同,两者输出的信号会有一个固定的相位差。我是这样理解的。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 12:21

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

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