本科毕设-基于AD9851的信号发生器的设计与开发(带程序).docVIP

本科毕设-基于AD9851的信号发生器的设计与开发(带程序).doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于AD9851的信号发生器 最近几年的电子设计大赛,差不多每年都考了DDS的设计。本人曾经也调试过DDS,但走了一些弯路,在这里写下一些心得,希望能对初调者有点帮助。下面将有电路图,以及详细的代码。 ? 学过FPGA的同仁们,应该对DDS的原理就会有很好的理解了。用FPGA是很容易把一个简单型的ad8952烧出来的!其实原理相当的简单,无非就是由相位累加器,相位调制器,正弦查找ROM,DAC构成。通过改变相位累加的增量就很容易的改变的输出的频率了。 ? 如果相位累加器(频率控制子)的位宽为N位(ad9851的N=32位)这就意味着把一个周期的正弦波形离散成了2的N次方个点,把这些点的幅值存在一个ROM中就构成了正弦查找ROM。如果系统时钟为Fclk,即把Fclk分成了2的N次方份。如果此时的相位累加增量为(频率控制字)为B,那么此时的输出频率应为Fout=(B*Fclk)/ N。显然B=1时其最小值为Fclk/ N。B的值也不能太大,否则会输出失真波形。Fout的最大值理论上应该至少小于Fclk/4。所以要想提高输出频率的最大值,就得靠提高系统的外部时钟Fclk。 ?? 下面结合本人的代码来具体讲讲AD9851的应用。 AD9851的一些具体介绍这里就不说了。其DATASHEET上都说的很清楚。若看不懂E文,可以发E_M给我,我有中文资料。AD9851要写40位的控制子。其中前面32位就是频率控制子了。后面是有1个6倍频使能位,1个logic0位,1个POWER_DOWN位,还有5位相位模式字。这里我们只解决频率控制问题。也就是说在代码中本人只写了,32位的频率控制子,还有一个6倍频使能。其余的剩下几位由于没用到也就默认写为0了。AD9851可以用并和串俩中方式写入控制子。 其串行发送方式的控制子表如下: 本人主要将用串写控制子的时序与代码。其并的方式的代码也会给出。硬件电路图网上有很多资源,自己去找找! 主要看看代码吧: /************************************************************* ?ad9851串口驱动程序 ?2007-8-28water ************************************************************/ #include reg52.h #include intrins.h #include ABSACC.H? //定义管脚 sbit???? D7=P3^3;???????????????? ?????? //控制子串传送位 sbit???? DDS_FQUD=P3^4;???????? //更新发送频率 sbit???? DDS_CLK=P3^5;???? //接外部晶振时钟 这里为30M unsigned long control_word(float? freq); void send_control( unsigned long? bytedata);?? ? void AD9851Init(void)???????????????????? //DDS初始化函数,包括DDS复位和初始化为串行发送 { ????? DDS_CLK=0; ??? DDS_FQUD=0; ??? DDS_CLK=1; ??? DDS_CLK=0; ??? DDS_FQUD=1; ????? DDS_FQUD=0; } ? main() { ????? unsigned long? x; ????? DDS_FQUD=0; ????? AD9851Init(); ????? x=control_word(500000); ????? ????? while(1) ????? send_control(x); } ? //计算9851控制字,freq为你要输出的频率 unsigned long control_word(float freq)?????????? ??????????? { unsigned long? water; water=23.86115*freq;//外部晶振为30M,6倍频后180M,其关系由公式算出。 //water=143.456*freq;????? //若不用6倍频,则其关系 ????? return(water); } ? //发送控制字 void send_control( unsigned long? bytedata) {? ???? int i; ????? ?unsigned char model=0x01;//模式选择为六倍频 ???? DDS_FQUD=0; ???? _nop_();_nop_();_nop_();_nop_

您可能关注的文档

文档评论(0)

hong8910aiyan + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档