4724|4

22

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求问51单片机控制AD9854生成DDS正弦波信号问题 [复制链接]

我用的是普中科技的51单片机开发板,在淘宝上买了一个AD9854的模块,用杜邦线按照程序里说明的连起来。
求问这其中出现什么问题,输出的信号频率和程序中写的不一致。
  1. /*-----------------------------------------------
  2.   名称:AD9854并口驱动
  3.   编写:Lu
  4.   日期:2014.10.15
  5.   修改:无
  6.   内容:
  7. ------------------------------------------------*/
  8. #include<intrins.h>       
  9. #include <reg51.h>
  10. #define uint   unsigned int
  11. #define uchar  unsigned char
  12. #define ulong  unsigned long

  13. uchar FreqWord[6];        //6个字节频率控制字
  14.       //*********以下为系统时钟以及其相关变量的设置********
  15.           /*根据自己的需要设置系统时钟以及相关的因子,一次需要开启一个
  16.           CLK_Set为时钟倍频设置,可设置4—20倍倍频,但最大不能超过300MHZ
  17.           Freq_mult_ulong和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型
  18. */


  19. #define     CLK_Set               10           //时钟倍频数   工作在30M*10=300M
  20. const ulong  Freq_mult_ulong=938249;            //   2^48/300000000                 整数
  21. const double Freq_mult_doulle=938249.922;                                   //带有小数点


  22. //********修改硬件时要修改的部分********

  23. #define AD9854_DataBus P2
  24. #define AD9854_AdrBus  P0
  25. sbit AD9854_S_P=P1^4;   //AD9854串行和并行数据选择口
  26. sbit AD9854_RST=P1^3;   //AD9854复位端口
  27. sbit AD9854_UDCLK=P1^0;   //AD9854更新时钟
  28. sbit AD9854_WR=P1^1;   //AD9854写使能,低有效
  29. sbit AD9854_RD=P1^2;   //AD9854读使能,低有效



  30.        


  31. //=============================================================================================
  32. //函数名称:void AD9854_WR_Byte(uchar addr,uchar dat)
  33. //函数功能:AD9854并行口写入数据
  34. //入口参数:addr     6位地址
  35. //          dat      写入的数据
  36. //出口参数:无
  37. //=============================================================================================
  38. void AD9854_WR_Byte(uchar addr,uchar dat)
  39. {
  40.     AD9854_AdrBus =addr;
  41.         AD9854_DataBus=dat;
  42.         AD9854_WR     =0;
  43.         AD9854_WR     =1;
  44. }
  45. //=============================================================================================
  46. //函数名称:void AD9854_Init(void)
  47. //函数功能:AD9854初始化
  48. //入口参数:无
  49. //出口参数:无
  50. //=============================================================================================
  51. void AD9854_Init(void)
  52. {         AD9854_S_P=1;//并口数据传输

  53.      AD9854_WR=1;        //将读、写控制端口设为无效
  54.          AD9854_RD=1;
  55.          AD9854_UDCLK=0;
  56.          AD9854_RST=1;            //复位AD9854
  57.          AD9854_RST=0;
  58.          AD9854_WR_Byte(0x1d,0x00);    //开比较器
  59.      AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频
  60.      AD9854_WR_Byte(0x1f,0x00);    //设置系统为模式0,由外部更新
  61.          AD9854_WR_Byte(0x20,0x60);    //设置为可调节幅度,取消插值补偿
  62.          AD9854_UDCLK=1;               //更新AD9854输出
  63.          AD9854_UDCLK=0;
  64. }                                               

  65. //==============================================================================================
  66. //函数名称:void Freq_convert(long Freq)
  67. //函数功能:正弦信号频率数据转换
  68. //入口参数:Freq  需要转换的频率,取值从0—SYSCLK/2
  69. //出口参数:无   但是影响全局变量FreqWord[6]的值
  70. //说明:   该算法为多字节相乘算法,有公式FTW=(Desired Output Frequency *2N)/SYSCLK
  71. //得到该算法,其中N=48,Desird Output Frequency为所需的频率,即Freq,SYSCLK
  72. //为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]
  73. //==============================================================================================
  74. void Freq_convert(long Freq)
  75. {
  76.       ulong FreqBuf;
  77.           ulong Temp=Freq_mult_ulong;
  78.           uchar Array_Freq[4];            //将输入频率因子分为四个字节
  79.           Array_Freq[0]=(uchar)Freq;
  80.           Array_Freq[1]=(uchar)(Freq>>8);
  81.           Array_Freq[2]=(uchar)(Freq>>16);
  82.           Array_Freq[3]=(uchar)(Freq>>24);
  83.           FreqBuf=Temp*Array_Freq[0];
  84.           FreqWord[0]=FreqBuf;
  85.           FreqBuf>>=8;

  86.           FreqBuf+=(Temp*Array_Freq[1]);
  87.           FreqWord[1]=FreqBuf;
  88.           FreqBuf>>=8;

  89.           FreqBuf+=(Temp*Array_Freq[2]);
  90.           FreqWord[2]=FreqBuf;
  91.           FreqBuf>>=8;

  92.           FreqBuf+=(Temp*Array_Freq[3]);
  93.           FreqWord[3]=FreqBuf;
  94.           FreqBuf>>=8;

  95.           FreqWord[4]=FreqBuf;
  96.           FreqWord[5]=FreqBuf>>8;
  97. }
  98. //================================================================================================
  99. //函数名称:void AD9854_SetSine(ulong Freq,uint Shape)
  100. //函数功能:AD9854正弦波产生程序
  101. //入口参数:Freq   频率设置,取值范围0—(1/2)*SYSCLK
  102. //          Shape  幅度设置,为12Bit,取值范围为(0—4095),取值越大,幅度越大
  103. //出口参数:无
  104. //================================================================================================
  105. void AD9854_SetSine(ulong Freq,uint Shape)
  106. {
  107.      uchar count;
  108.          uchar Adress;
  109.          Adress=0x04;              //选择频率控制字地址的处值
  110.          Freq_convert(Freq);       //频率转换
  111.          for(count=6;count>0;)     //写入6字节的频率控制字
  112.          {
  113.              AD9854_WR_Byte(Adress++,FreqWord[--count]);
  114.          }
  115.          AD9854_WR_Byte(0x21,Shape>>8);     //设置I通道幅度
  116.          AD9854_WR_Byte(0x22,(uchar)(Shape&0xff));
  117.          AD9854_WR_Byte(0x23,Shape>>8);     //设置Q通道幅度
  118.          AD9854_WR_Byte(0x24,(uchar)(Shape&0xff));
  119.          AD9854_UDCLK=1;                    //更新AD9854输出
  120.          AD9854_UDCLK=0;
  121. }

  122. void main (void)
  123. {
  124.         AD9854_Init();
  125.         AD9854_SetSine(61000000,4000);           //61M输出,这下大家满足了吧。
  126.         while(1);
  127. }
复制代码
此帖出自51单片机论坛

最新回复

还想请教一下楼主:楼主知道如何使用AD9854输出三角波吗?  详情 回复 发表于 2016-8-31 21:30
点赞 关注
 

回复
举报

33

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
希望可以互相交流,不管怎样,先谢谢楼主,晚辈在此敬礼!
此帖出自51单片机论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
请问一下你这个代码是能成功输出波形的吗,我这里自己做了一个dds模块,用的是48M的晶振,按照你这个改了一些,但是好像还是不能输出波形。
此帖出自51单片机论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

4
 
楼主的问题解决了吗?我也在使用这个程序。是不是实际输出的频率是想要频率的十分之一?
  1. #define     CLK_Set               10           //时钟倍频数   工作在30M*10=300M
  2. const ulong  Freq_mult_ulong=938249;            //   2^48/300000000                 整数
  3. const double Freq_mult_doulle=938249.922;                                   //带有小数点
复制代码

恰好是这里定义的CLK_Set 。我不知道是什么原因,在计算的时候只要不除以10就好了,前提是AD9854_WR_Byte(0x1e,CLK_Set);这句没有改过。  
此帖出自51单片机论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

5
 
还想请教一下楼主:楼主知道如何使用AD9854输出三角波吗?
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表