纹哥--

DIY DDS AD9854扫频源心得分享(转载)

纹哥-- 在 2015-11-12 建立的討論區
最後回覆由ADI_Amy於2015-11-16提供

本文由网友hard_core发表至EEWORLD论坛,原文链接http://bbs.eeworld.com.cn/thread-469641-1-1.html

 

 

最近工作室做了一个小项目,25M-70M扫频源,拿上来秀一下,也希望有感兴趣的童鞋们多提意见,交流才有进步嘛!


这个项目看起来简单,但确是最近做的最恼火的项目之一,无他,运气实在太差,调试电脑坏了两台,重装系统,重装软件,恢复数据,再联想到因为买芯片停车被贴条,哎,不说了,说多了都是泪啊……..


转入正题,该项目是个扫频源项目,要求25M-70M扫频输出,1M步进,3MS完成转换,30dB以上的杂散,相噪无硬性要求。说到这里大家看出来了,这是个功能性的项目,对指标的要求是比较低的。


那么,直接上DDS吧,选一款DDS芯片再说,…..AD9851??


呃,这是个什么鬼呢,datasheetgeneral description部分说了,带高精度DA转换器和比较器,可用作频率综合器和时钟产生器哦亲,32bit频率控制字,0.04Hz精度,最大180M参考时钟哦亲,内部还带6倍频器哦亲,哎,真是居家旅行必备神器啊,好吧那就是你了。


控制部分就简单了,51就搞定了。直接上图吧

上面就是控制板的PCB


为什么要做成两块板子呢,因为做之前觉得单片机的12M晶振谐波可能比较大,做一块板子的话怕泄露比较厉害,落到输出带内,形成比较严重的杂散,做完之后发现,这个问题就好像小时候纠结是上北大还是上清华一样,想多了!

 

DDS核心板,主要是DDS+低通滤波器,低通滤波器怎么办呢,上ADS仿一个吧,FILTERDESIGN GUIDE还是好用的,下面是个仿真的响应,凑合着用吧

DDS板的PCB

再来一个全家福

好,大功告成。最后,看看测试结果吧,先看个25M的,这个点杂散就比较好了,但是二阶,三阶谐波就比较大

再来个41M的,杂散一片

DDS的杂散说起来还是比较复杂的,什么相位截断误差啦,DA的交调啊,量化效应啊,采样带来的镜像啊,我就不罗嗦了,这些说起来可以写一篇论文的。

 

最后再讨论下DDS的零阶保持效应带来的高频幅度压低的问题,这种效应如果是FPGA+DA的方式的话可以用预失真补偿掉,但是DDS的话怎么办?输出加均衡器,这个没试过,不知道好不好弄,或许不太要求杂散的话可以加个饱和放大推平?



AD9851的最高时钟频率是180M,在DA的零阶保持电路影响下,输出的幅频特性不好,高频段功率跌的厉害。虽说勉强满足设计要求,但是本着杀人须见血,救人须救彻的精神,又改了一次版,将DDS芯片换成了时钟频率为300M的AD9854,这次,就和坛子里的众童鞋分享下调试AD9854的酸甜苦辣。

 

首先我们来看看AD9854这个片子,不看不知道,一看吓一跳,几十元的片子,能输出PSK,FSK,LFM等各种调制信号,自带多路同步功能,IQ正交输出,功能挺全,宽带的无杂散动态能到50dB,虽说差点事,但也够用了。这个项目中,只用来出连续波,所以datasheet里很多内容都忽略了,先来张近照和测试的结果吧

 

 

带内看起来是比较平坦的,1dB以内的起伏



下面总结下调试过程中遇到的问题:

1.  AD9854打寄存器有并行和串行时序两种方式,这两种方式是通过S/P这个引脚切换的,当其为高时为并行时序,低时为串行时序,这个需注意;


2.  AD9854有个update信号,干什么用的呢?

其实当我们通过串口或并口给DDS打数时,先是送到了IO_BUFFER里面,然后靠一个update信号送给DDS的核,才完成了控制字的真正写入。


接下来的部分有点绕了,我说的啰嗦一点:这个update信号可以是外部输入的,也可以是内部生成的,这个是通过改变控制寄存器的某个控制位达到的,上电之后默认是内部生成的,内部怎么生成呢,他是让一个计数器倒计时,计时到0之后输出一个更新脉冲,这个计数器的初始值也是通过一个寄存器写入的。


一般来讲,大家喜欢自己输入UPDATE脉冲,或者至少需要调整计数器初始值让这个脉冲输出周期满足自己的时序需求。那么这就陷入了一个鸡生蛋核蛋生鸡的怪圈:我要让update信号满足我的时序要求,就要写入寄存器,要写入寄存器就需要满足我时序要求的UPDATE信号,而系统默认的内部update信号,周期是固定的,但是会在你需要的时候出现吗,不知道!


这时候有人提出了一种解决办法,不可否认逻辑上是很严谨的,那就是这个系统内部默认的update信号一定是外部提供系统时钟的时候才会按照默认周期出现的,而IO口线的串行或者并行操作是不需要系统时钟的,那么先将提供系统时钟的晶振暂停,等到IO操作完毕后再提供晶振,那么一定是满足时序的。这样就需要一个带使能开关的晶振,想来想去怎么会有如此不人性化的芯片,简直比“证明你爸是你爸”还要不人性。


经过本人的实验,这个步骤是多余的,第一次写入寄存器,不管进行调整成外部更新脉冲还是调整内部更新脉冲周期的寄存器操作,默认的内部UPDATE信号会合适的把寄存器内容打入内核的,具体内部操作原理咱不清楚,但是ADI的设计人员显然考虑到了这一点。值得注意的是,update信号是可以通过一个管脚输出的,通过改变内部计数器的数值观察update信号周期是否相应改变是一个判断AD9854芯片是否正常的一个重要手段。



3.  调试过程中遇到过这样一个问题,比如当需要输出50M信号的时候,在频谱上不止50M有输出,附近还有一片频谱。当时看到这个情况的时候第一眼是觉得这个信号是被脉冲调制了,检查程序无此可能,后又怀疑芯片虚焊,重新焊接后问题仍然存在,最终发现原来是因为芯片外部的环路滤波的电容值不对,这个芯片对输入的晶振可以倍频的,这样可以实现外部提供较低频率实现较高频率的信号输出,而这个倍频是通过锁相实现的,锁相的环路滤波需要在外部提供,当电容值不合适时,锁相环失琐,就造成了上述问题。



4.  刚才说到可以通过改变内部计数器的数值观察update信号周期是否相应改变是一个判断AD9854芯片是否正常,其实还有一个更简单粗暴的手段,就是用手摸,AD9854功耗较大,发热很厉害,看看下面的图吧,电流630ma,还没开反sinc函数滤波器,开了之后电流还会增加接近一倍。用手摸摸吧,闻到烤肉味就对了。

   

总的来说,这个芯片调试过程还是比较简单的,仔细看datasheet,应该能解决绝大多数问题,当然我没有用各种调制等复杂功能,本文就当抛砖引玉了,欢迎各位指导。

結果