AD9910是ADI提供的一款DDS,由于以前项目一直使用的是AD9858,一直想用新的器件替换掉(虽然在别人眼里AD9910也算是老掉牙的器件),对于我来说没用过就是新的,也因为没用过对我来说是困难重重,由于手头参考资料少,网络大多数资源参考价值少,可能这种器件受行业范围限制,不会有那么多信息提供,本人不才,在项目中遇到好多的问题,一步步走来,我想把我工作中遇到的问题分享出来,以供大家参考,有些不对地方烦请指正,废话不多说,开始吧
硬件篇
由于PCB板面积限制没有加并行连接端口,也就是说,所以就不能实现并行数据端口调制模式。
根据图片中编号加以说明:
1.输出信号,就是你要产生的信号,官方给的原理图在这部分做了低通滤波,我这外部有滤波器就取消掉了,更具实际项目而定。
2.这部分是AD9910的参考时钟输入,也就是说你要输出的频率的参考源来自这里,也就是官方文档的第一句话
也就是说AD9910内部最高支持1G输入,根据奈奎斯特定理(我也仅仅是知道个人名,写出来装个逼),所以高达400MHz输出,我用的是外部直接输入1G,然后产生200MHz的调制信号,如果是采用我这种直接驱动方式,95管脚XTAL_SEL就得接AGND,另外一种晶体驱动没用过。
还有个比较重要的地方就是,输出信号一定要有外屏蔽,像我这种直接将输出信号搭到焊盘上,由于腔体之间的缝隙就会有输入信号串扰进来,导致输出有很大杂散,推荐接头如图3
图3 SMA接头推荐
3.这就是95管脚XTAL_SEL,我就是画原理图是没注意,在这地方弄错了,接到1.8V上了,接地就好了
4.官方这么写的,我就这么画了,其实我的理解就是,pin3管脚和别的管脚单点连接,也不知道有啥用。
5.外部环路滤波,我是直接驱动,所以没有用到。
6.电源的滤波电容,注意将数字地与模拟地单点用磁珠单点连接
注:千万不要开关电源,供电如下,我用两个LT1963分别提供AVDD和DVDD 1.8V
然后再用AMS1117分别提供AVDD和DVDD 3.3V
软件篇
这部分也是最麻烦的,问题也是最多的,网络资源也比较少,所以在此总结出来,供大家参考,有些方法也是我一点点试出来的,有些不对的地方烦请指正,AD9910共有四种模式分别是:
由我做的硬件不支持,所以就没有试过并行数据端口调制模式,在这也不做介绍,下面我会对前三种模式遇到的问题一一进行说明。
AD9910它是一个串行通信的器件(不要给我说它有并行数据端口调制模式,你要实现前三种模式就必须是串行通信),
所以这个和AD9858的并行控制方式有很大的区别,也就是说以前用到的AD9858控制方式就此无法使用,只能自己写了,哈哈哈。我用的控制器件是FPGA,看清楚就是FPGA,用FPGA实现串行控制真是一种折磨,由于没有找到有关官方的verilog写的控制代码,只能去网上找别人的作为参考,在此将时序图贴出来仅供参考,具体代码还是自己去写吧。
串口发送时序关系如下:
图4串口时序关系
如图4截图发送寄存器CFR1和CFR2,前面8bit是地址,后面32bit是数据,依次循环,将你所需要的数发送出去,这部分可以参考官方文档理解,在这里我想要说的是,AD9910串口数据是先发送8bit地址,然后数据,只有整个一组数据地址全部完成后,数据地址指针才能恢复到地址位的第一位,在这里为了确保每次一组地址数据结束后,指针能够恢复到地址起始位,所以每次一组地址数据接收,就进行io_reset,让其指针强制恢复到起始位,这要做可以保证sclk在出现干扰时,整个串口数据不会错乱,这种方式仅供参考。
去官网下个AD9910的软件,这样你就不需要自己去计算配置寄存器值了
图5寄存器配置图
如图5是1G外部输入,不需要分频,所以把DividerDisable勾勾打上。
Reg Addr(Hex) 是配置寄存器的地址,后面是数据,可以看到不同的地址,后面的数据长度是不同的。
下面将三种产生调制信号的模式分别讲下:
单频调制模式
单频调制模式也就是出个点频,配置输出点频首先要初始化,分别是三个寄存器CFR1、CFR2、CFR3,比如需要配置两个点频,配置profile0地址0x0E和profile1地址0x0F具体含义参考AD9910官方文档的说明,都有详细的解释。
图6配置点频示例
Profile0和profile1的设置如图6,注意Amplitude SF 虽然是灰色的,但是是可以设置的,这个值是幅值,在频谱仪上对应的是功率,最大值位1,满幅值输出,此时AD9910的输出功率为0dB,对应的寄存器值就是
,把这些寄存器都配置好了,还有一个关键点,就是你得io_updata,这样才能把寄存器更新到实际产生频率的寄存器内,说的有点拗口,但是也挺好理解的,你为这样就好了,可以输出漂亮的点频了,哈哈哈,还差一个,就是我举例产生两个点频,这是怎么做到的哪,那就得靠图7,看清楚不要和寄存器profile0~7混淆,AD9910支持8独立的点频,所以它就有了8个profile寄存器,而要切换这几个频点就靠这个PRFILE管脚了,比如,我现在设置的是profile0和profile1寄存器,那么我这个PRFILE管脚就在PRFILE=3‘b000时输出profile0寄存器的值;PROFILE=3’b001时输出profile1寄存器,这样就能快速的切换点频了,顺带附一张漂亮的点频图8。
图7 PROFILE管脚
图8帅气的点频频谱示意图
RAM调制模式
RAM调制模式,我觉得这个模式还是挺不错的,对于产生相对复杂的调制信号还是相当不错的,这个RAM模式的意思时这样的,
官方文档时这写的那这个1024个32bitRAM到底时干啥的,其实仔细看文档不难理解,就是可以存放1024个点频寄存器值,然后设定好间隔时间,就这样可以连续的产生这些点频,也就是说可以产生线性调频信号或者非线性调频信号,就看你RAM是怎么个设置方法了,就这么简单,说起来简单,但是做起来,还是有好多的细节问题,有时候把文档看了几遍都理解不了其中的意思,还是直接上手,一点点试,下面我就具体介绍下怎么去操作,然后对照文档就更好理解了
首先要使用RAM模式,第一步时写入RAM表,其次才能去调用RAM表里的数据,
写入RAM表,我的做法是先将RAM使能位置0,也就是CFR1 = 32‘h00000000;其实上电默认也是不使能RAM模式,也可以不用配置,接下来就是写RAM表,先看文档,1024个32bit根据据实际情况看需要写多少个,比如写500个点,用EXCEL表做一个公式,产生500个点,中心200MHz,带宽20MHz的一个线性调频信号,那么间隔点就是20/500=0.04MHz,32bit寄存器计算公式=DEC2HEX(POWER(2,32)*(输出频率/参考频率)),直接用EXCEL就能得到一组32bit的寄存器值;我在这里举例的写入一个连续的调制信号,也可以写入不连续的几段寄存器,可以将不同的数据段进行划分,最多可以划分8段,先不多说,我直接讲我怎么实现:
不管我要几段,我先将其按照一段数据直接写入,这块不太好讲,首先配置分段的寄存器,你会发现这TMD不就是刚才单频调制寄存器吗,其实就是,地址都一样,哈哈哈,那我就配置RAM profile0寄存器,因为是写入RAM表,所以最主要的是结束和起始地址,把这个写好。
图9 RAM模式地址表
图10 RAM 寄存器
还是用AD9910官方提供的软件,计算地址表,那就开始写吧,我先写了个CFR3,貌似没啥用,关键是我器件加电只写依次RAM数据表,所以器件加电后,RAM模式是不使能的,还有一个关键电,就是你在配置RAM profile0时候,PROFILE管脚必须对应到PROFILE=3’b000,这是必须的。因为我只配置profile0,所以也不用切换PROFILE管脚,ram profile0 配置完后,io_updata更新下,接下来就可以写RAM表,首先写地址0x16 然后就是你的一大堆数据了,这样整个RAM表写完。
图11写RAM
那么我只是写入了数据表,我怎么产生信号呢,那我就以官方提供的这张图12,采用上斜坡模式来实现,执行profile0,profile1,然后终止。
图12两段调制信号切换示意图
要实现图12调制信号(仅作示意),我们就得将刚才写入AD9910 ram表进行重新数据段的划分,比如已知0~300地址是RAM profile0, 301~499地址是RAM profile1,那么将地址ram profile寄存器写入,记住写入地址的时候PRFIEL管脚一定要对应于profile寄存器,如图13所示,注意写profile寄存器时候一定要将RAM使能关掉,当然都到这一步了,你应该就已经初始化了配置CFR1,CFR2,CFR3,我再强调一遍,RAM使能这个也就是CFR1[31]这一位,即使你不进行io_updata,只要这一位是1’b1,就会影响你整个配置ram profile寄存器。
图13写入两段地址
这样分配好地址段,就可以使能RAM模式了,然后再来个io_updata,就能实现profile0~profile1的调制信号了,当你高兴的看到可以产生调制信号了,你会发现,卧槽怎么驻留了,我只要脉冲内有信号怎么办?有一种办法可以解决,有点投机取巧,那就是,我再来个地址段profile2,当然这个profile2是用来放0频的,这样你profile0~profile2就能实现脉冲内的调制信号了,点到为止,就这样了,还有别的方式自己试吧(这里面其实还有好多问题,比如读取数据怎么是个反的)。还有一个问题说一下,就是产生这个信号有两种方式,一是io_updata,另一种方式是PROFILE管脚变化,具体项目,具体对待。
图14 线性调频信号频谱示意图
图15 线性调频信号时域示意图(随便找的图)
注:图8,14,15只是想说明产生信号的效果,并非实际AD9910信号
数字斜坡模式(DRG模式)
DRG模式其实就使用来实现简单的线性调频的,如果你调制信号不复杂,用这种方式也就够了,他只需要配置几个寄存器就可以实现线性调频信号,就是做正负斜率切换的时候,有点费劲。
初始化配置寄存器,CFR1,CFR2,CFR3,具体寄存器值用AD9910官提供的软件就行,其次就是DRR,DRL,DRS这三个寄存器,配置需要产生扫频的相关参数,如图16 要产生从100Mhz到200Mhz的脉宽100us线性调频信号,设置sweep frequency0,sweep frequency1和各自对应的间隔时间和频率步进量,200Mhz-100Mhz=100,脉宽100us,假设间隔时间设置位0.1us,那频率步进量就是0.1MHz,如果是时间间隔1us,那频率步进量就是1MHz,根据实际情况而定;如果需要外部OSK,可以使能外部OSK功能,此时还得配置ASF寄存器,主要就是这些寄存器,其他自己摸索去吧。
图16 DRG模式配置
如果你需要实现正负斜率切换,参考官方文档是这样描述的
看着这貌似挺简单的,DRCTL=1正斜率,DRCTL=0负斜率,哈哈哈,图样图森破,我也没太理解官方写的到底是啥意思,其实正确的使用方法是:假如你要出正斜率,那么寄存器CFR2设置No Dwell high
,此时DRCTL上升沿就会产生正斜率,要产生负斜率,那么寄存器CFR2设置No Dwell low ,
此时DRCTL下降沿就会产生负斜率,正负斜率的驱动需要靠DRCTL的沿来驱动。