配色: 字号:
AD9854中文
2017-06-02 | 阅:  转:  |  分享 
  
AD9854
特征
·300M内部时钟频率
·可进行频移键控(FSK),二元相移键控(BPSK),相移键控(PSK),脉冲调频(CHIRP),振幅调制(AM)操作
·正交的双通道12位D/A转换器
·超高速比较器,3皮秒有效抖动偏差
·外部动态特性:
80dB无杂散动态范围(SFDR)@100MHz(±1MHz)AOUT
·4倍到20倍可编程基准时钟乘法器
·两个48位可编程频率寄存器
·两个14位可编程相位补偿寄存器
·12位振幅调制和可编程的通断整形键控功能
·单引脚FSK和BPSK数据输入接口
·PSK功能可由I/O接口实现
·具有线性和非线性的脉冲调频(FMCHIRP)功能,带有引脚可控暂停功能
·具有过渡FSK功能
·在时钟发生器模式下,有小于25psRMS抖动偏差
·可自动进行双向频率扫描
·能够对信号进行sin(x)/x校正
·简易的控制接口:
可配置为10MHZ串行接口,2线或3线SPI兼容接口或100MHZ8位并行可编程接口
·3.3V单电源供电
·具有多路低功耗功能
·单输入或差分输入时钟
·小型80脚LQFP封装
应用
·便携式频率特性分析仪
·可编程时钟发生器
·应用于雷达和扫频系统的脉冲调频信号源
·测试和测量设备
·商业和业余的射频(RF)发射机
概述
AD9854数字合成器是高集成度的器件,它采用先进的DDS技术,片内整合了两路高速、高性能正交D/A转换器通过数字化编程可以输出I、Q两路合成信号。在高稳定度时钟的驱动下,AD9854将产生一高稳定的频率、相位、幅度可编程的正弦和余弦信号,作为本振用于通信,雷达等方面。AD9854的DDS核具有48位的频率分辨率(在300M系统时钟下,频率分辨率可达1uHZ)。输出17位相位截断保证了良好的无杂散动态范围指标。AD9854允许输出的信号频率高达150MHZ,而数字调制输出频率可达100MHZ。通过内部高速比较器正弦波转换为方波输出,可用作方便的时钟发生器。器件有两个14位相位寄存器和一个用作BPSK操作的引脚。对于高阶的PSK调制,可通过I/O接口改变相位控制字实现。具有改进DDS结构的12位I和Q通道D/A转换器可以提供较大的带宽并有较好的窄带无杂散动态范围(SFDR)。如果不使用Q通道的正交功能,它还可以通过配置,由用户编程控制D/A转换。当配置高速比较器时,12位D/A输出的方波可以用来做时钟发生器。它还有两个12位数字正交可编程幅度调制器,和通断整形键控功能,并有一个非常好的可控方波输出。同时脉冲调制功能在宽带扫频中也有重要应用。AD9854的300M系统时钟可以通过4X和20X可编程控制电路由较低的外部基准时钟得到。直接的300M时钟也可以通过单端或差分输入。AD9854还有单脚输入的常规FSK和改进的斜率FSK输出。AD9854采用先进的0.35微米COMS工艺在3.3V单电源供电的情况下提供强大的功能。
AD9854采用节省空间的80脚LQFP表面装配封装和改进散热的80脚LQFP封装。AD9854的引脚与AD9852的单频信号发生器模式相兼容。AD9854的特定操作允许温度是工业级范围:-40到85摄氏度。
引脚配置和功能描述

图1管脚配置
表1引脚功能描述表
引脚号记述功能描述1to8D7toD0八位并行可编程数据输入。只用于并行可编程模式。9,10,23,24,25,73,74,79,80DVDD连接数字电路电源输入。正常情况下相对于模拟地和数字地的正向电位是3.3V。11,12,26,27,28,72,75,76,77,78DGND连接数字电路的回路地。与模拟地具有相同的电位。13,35,57,58,63NC没有内部连接。
14to19
A5toA0可编程寄存器的六位地址输入。仅用于并行可编程模式。引脚17(A2),18(A1),Pin19(A0)在选择串行模式时还有第二功能,后面有具体描述。(17)A2/IORESET串行通信总线的I/O允许复位端,由于编程协议的不成熟而没有应答信号产生。在这种方式下复位及不影响以前的编程设置也不影响表7中的默认编程设置。高电平时复位有效
(18)A1/SDO单向串行数据输出端。应用于3线串行通信模式中。(19)A0/SDIO双向串行数据输入/输出端。应用于2线串行通信模式中。20I/OUDCLK双向I/O更新时钟。方向的选择在控制寄存器中设置。如果作为输入端,时钟上升沿将I/O端口缓冲器的内容传送到可编程寄存器。如果作为输出端(默认),输出一八个系统时钟周期的单脉冲(由低到高)表示内部频率更新已经发生。21WR/SCLK写并行数据到I/O端口寄存器。复用功能为SCLK时,串行时钟与串行总线相结合,数据在时钟上升沿锁存。当选择并行模式时这个管脚复用为WR功能。模式选择在第70脚(S/P选择)。22RD/CS
从可编程寄存器中读出并行数据。复用功能为CS时,片选端与串行可编程总线相结合,低电平有效。当选择并行模式时这个管脚复用为RD功能。29FSK/BPSK/HOLD多功能复用引脚。其功能操作模式由可编程控制寄存器选择。在FSK模式时,低电平选择F1,高电平选择F2。在BPSK模式时,低电平选择相位1,高电平选择相位2。在CHIRP模式时,高电平使能HOLD功能,保持当前频率和停止后的状态。将管脚电平置低可重起CHIRP功能。30SHAPEDKEYING使用此管脚必须在可编程控制寄存器设置此功能。高电平时,在预先设定的频率下I和Q通道输出从0上升到满幅的信号。低电平时,在预先设定的频率下I和Q通道输出从满幅下降到0标度的信号。31,32,37,38,44,50,54,60,65AVDD连接模拟电路的电压输入。正常情况下保持对模拟地和数字地3.3V的正向压降。33,34,39,40,41,45,46,47,53,59,62,66,67AGND连接模拟电路的回路地。与数字地具有相同的电位。36VOUT内部高速比较器同相输出引脚。该引脚在负载50?的情况下驱动功率为10dBm,其输出电平与CMOS电平兼容。42VINP电压正向输入端。内部高速比较器的同相输入端。43VINN电压反向输入端。内部高速比较器的倒相输入端。48IOUT1I通道单极性电流输出或余弦输出。(参考图3.)49_____
IOUT1补充I通道单极性电流输出或余弦输出。51_____
IOUT2补充Q通道单极性电流输出或正弦输出。52IOUT2Q通道单极性电流输出或正弦输出。这种模拟输出可以通过接收12位数据代替内部正弦数据,允许AD9854仿效AD9852的DAC功能。55DACBPI和QDAC的公共旁路电容。接一个0.01uF的电容到AVDD可以改善谐波失真和杂散性。不接也可以(会使SFDR降低)。56DACRSET设置I和Q通道满电流输出的公共端。建立电阻为39.9/IOUT(输出电流)。通常建立电阻在8K(5mA)到2K(20mA)。61PLLFILTER为基准时钟倍乘锁相环路滤波器外部零位补偿网络提供连接。零位补偿网络由一个1.3k?电阻和一个0.01μF电容组成。网络的另一端必须连接模拟电源,并尽可能靠近第60脚。为了更好的抑制相位噪声,通过在控制寄存器(1EH)设置旁路倍频位,屏蔽掉基准时钟乘法器。64DIFFCLKENABLE差分基准时钟使能。该管脚高电平使能差分时钟输入,REFCLKA和REFCLKB(管脚69和68)。68REFCLKA差分时钟补偿信号(180度相位)。当选定单端信号输入模式用户需要把该管脚连接到高电平或低电平。它的输入是和基准时钟是相同的信号电平。69REFCLKB单端基准时钟输入端(要求CMOS逻辑电平)和差分输入信号的一端。在差分时钟模式下,输入可以是CMOS逻辑电平也可以是峰峰值大于400mV,中心直流电平约1.6V的方波或正弦波。70S/PSELECT选择串行编程模式(低电平)和并行编程模式(高电平)。71MASTERRESET初始化串/并总线为用户的编程做准备。设置可编程寄存器为表7中的无操作默认状态值。操作说明
AD9854正交数字信号发生器是一款有着广泛应用的非常灵活的器件。器件包括一个48位的相位累加器,可编程基准时钟乘法器,反辛格滤波器,数字乘法器,两个12位/300HZ数模转换器,一个高速模拟比较器和内部逻辑电路。这款高度集成的器件可以用作本机震荡发生器,灵活的时钟发生器和FSK/BPSK调制器。
AnalogDevics股份有限公司的技术指南提供了关于器件功能模块的操作说明。指南包括利用DDS器件产生信号的技术描述并提供了适合多种数字化实体的基本应用。文件,《关于数字信号发生器的技术指南》在AD公司DDS网页HYPERLINK"http://www.analog.com/dds"www.analog.com/ddsDDS技术库中提供。
操作模式
AD9854有5种可编程操作模式。为了选择某一模式,必须对控制寄存器(并行操作地址:1FH)中的3个相关位进行编程设置。具体描述在下表:
表2.模式选择表
模式2模式1模式0结果000SingleTone001FSK010RampedFSK011Chirp100BPSK在每种模式下都有许多功能不被允许。
单信号模式(模式000)
这是用户复位之后的一种默认模式。也可以通过用户编程使能这种模式。相位累加器用以产生信号的频率,它有48位有效值,取自频率调整寄存器1,它的默认值为0。保留寄存器的默认值更能决定输出信号的质量。
用户复位后,默认设置配置器件,输出0HZ,0相位的信号。在上电复位时,在I和Q通道输出的是一半满幅电流的直流信号。这是默认模式的0幅度输出。选择幅度开关键控模式则需要更多细节的输出幅度控制。若输出用户定义的信号需要对28个寄存器全部或部分进行编程。
表35显示了从默认0HZ到用户定义输出频率的变化。
和所有ADDDS器件一样,频率控制字有如下定义:
FTW=(DesiredOutputFrequency×2N)/SYSCLK
式中:
N相位累加器的资源(本器件48位)。
Frequency以HZ表示。
FTW(频率调整字)是一个定义数字。
一旦定义数字选定,它必须转换为内部的权重为1或0的48位串行二进制码。建立的DAC输出信号频率范围从直流到1/2系统时钟。
改变频率时相位是连续的,这意味着新的频率的相位取样值参考之前输出频率的相位取样值。
AD9854的I和Q通道输出的信号总是保持90度的相位差。调整每个通道的输出相位两个14位相位寄存器并不是独立的。换而言之,两DAC输出通过相位补偿互相影响。
单信号模式允许用户控制以下信号参数:
·48位输出频率精度
·12位输出幅度精度
固定的,用户定义的幅度
可变的,可编程幅度控制
自动的,可编程,单引脚控制,幅度成型键控
·14位输出相位精度
这些参数可以在100MHZ并行速度下通过8位并行端口或10MHZ串行端口通过编程改变和调整。联合这些属性在单信号模式下可以实现FM,AM,PM,FSK,PSK和ASK操作。

无斜率FSK(模式001)
当这种模式被选中,输出的DDS频率是一个选择频率控制寄存器1和2的函数,它的输出取决于29脚逻辑电平的高低。29脚为逻辑低电平时选择F1(频率控制字1,并行地址为04H到09H),29脚为逻辑高电平时选择F2(频率控制字2,并行地址为0AH到0FH)。改变频率相位连续,并且和FSK数据引脚内部一致。但是,FSK数据信号和DAC输出存在线性时延。
无斜率FSK,是传统FSK,它传输的是数字信号,它在数字通信中有着重要作用。但是它会影响RF发射机的使用带宽,因此用斜率FSK来改善使用带宽。
斜率FSK(模式010)
这种FSK模式下,频率从F1到F2不是直接变化,而是通过扫频和斜率形成。线性扫频和斜率形成可以很容易的自动完成,不过这都是许多设置中的一项。其它频率传输的设置,用户可以配置增量控制寄存器,来编程控制扫频间隔和扫频速度。


频率斜率变化不管是线性还是非线性都会输出许多介于F1和F2之间的频率,而不仅是这两个基本输出。图37和38描述了一线性斜率FSK信号的频率输出与时间的关系。
需要注意,在斜率FSK模式下,频率步进字是要求编程设置的,它被用作双作用的补足值。须要注意的另一个问题是,最低频率一定要放在频率控制寄存器1中。
斜率FSK通过同缓慢的、用户定义变化率的实时频率来改善传统FSK对带宽的限制。输出信号在F1和F2频率点保持时间与其它实时点相同或稍大。与传统FSK不同,斜率FSK要求:F1和F2分别存储低频率和高频率,而不能任意。
用户必须通过编程来设定DDSd的中间频率变化的步进量ofC48位)和每一步所持续的时间△T(20位)。另外,如果要想让频率输出从0开始变化必须先给CLRACC1位送一个正脉冲。对于分段的非线性频率传输,必须对影响输出的寄存器进行编程设置。
并行寄存器1AHex~1CHex构成一个20位的斜率时钟寄存器。它是一个减计数器,当计数值为0时输出一个脉冲信号。在29脚的输入电平没有变化时计数器一直有效。这个计数器在系统时钟下运行,最大频率是300MHZ。每两个脉冲之间的时间周期用下式表示:
(N+1)(SystemClockPeriod)
此处N是用户编程设置的20位斜率变化率。
N的允许范围是1到(2^20-1)。斜率变化时钟决定频率F1和F2之间的实时频率持续时间。当频率达到目标频率时计数器自动停止,而F1和F2两频率点的持续时间由29脚输入的电平决定,电平的高低决定到达的频率点的状态。

图39FSK功能模块图
并行寄存器10Hex~15Hex构成一个48位的双作用的斜率步进寄存器。当接收到斜率变化时钟时,这个48位控制字被累加。此控制字被用来加或减到控制正弦或余弦输出的相位步进的频率控制字寄存器F1或F2。在这种模式下,29脚的电平状态决定输出的频率是增量或减量斜率。其频率变化率是20位斜率变化寄存器的功能,一旦目标频率到达,计数器将停止计数即频率累加过程停止。
一般来说,频率步进字与频率控制字相比是一个比较小的值,举个例子,如果F1和F2分别是1KHZ和13MHZ,那么步进频率字只有25HZ。


图41显示了,电平过早的变化使频率的斜率变化翻转,并且以相同的变化率返回原状态。控制寄存器(1FHex)中含有一个“三角形”位。在010模式下设置此位为高电平将会再频率F1和F2之间进行三角形自动扫频,而不会受29脚电平变化的影响,如图40。一旦这个位设置为1,29脚的状态将不会起作用。这一功能需要设置频率变化率和频率步进字来保证F1和F2之间的连续线性扫频具有相同的持续时间。使用此功能,可以对直流到最大输出频率之间的自动扫频。
在斜率FSK模式下29脚的电平和“三角形”位的上升沿决定扫频是从F1或F2开始(如图42)。如果29脚电平是高电平而不是低电平,扫频则从F2开始而不是F1。在F1和F2之间的斜率变化时,通过改变20位频率变化控制字和频率步进控制字,可增加斜率FSK模式的灵活性。结合多个线性斜率变化和各分段的不同斜率设置,可实现非线性的频率变化。在不同的设置下,DDS的输出频率在Fl和F2之间以不同的方式变化,实现多种方式扫频。

脉冲调频(模式011)
“Chirp”也称为“脉冲调频”(PulsedFM)。该模式下,输出信号的频率在指定的范围和精度上发生线性或非线性的变化,扫描方向可以编程控制。该模式需要用户通过“HOLD”状态(29管脚高电平)控制停止频率点,并控制频扫停止后的状态。
Chirp模式是在指定的频率范围和频率精度上,频率可以是线性或非线性变化输出,而
且扫频方向可控。在此模式中,大多数Chirp系统采用FM扫描方式,即FMChirp模式,
分线性和非线性脉冲调频两种方式。先设置频率控制字F1,然后设置频率变化的步进量
OF和每一步所持续的时间△T,最后使能更新实现脉冲调频。如果OF为正(最高位为0),
频率从F1向正方向扫描;4F为负(最高位为1),则频率从F1向负方向扫描。与Ramped
FSK模式相比,该模式需要用户自己通过‘`HOLD"(P29高电平)控制停止频率点,同时控
制停止后的状态。一些复杂的跳频功能在这个模式下可以实现。

图44脉冲FM模块
当AD9854工作在Chirp模式下时,基本编程步骤如下:
(1)将初始频率控制字WFc写入48位FTWI(FrequencyTuningWord1)中。
(2)将频率步进量写入48位DFW(DeltaFrequencyWord)中。
(3)将时间步进量写入20位RRC(RampRateClock)中。
(4)更新脉冲,将数据送入DDS核进行合成,输出信号。
在两个互补DWT中定义FMChirp跳动的方向是有必要的。若果48位是DWT负的(MSB是高),则频率增量将会从FTW1向负方向改变。若果48位DWT字是正的(MSB是低),则频率增量将会向正方向改变。
值得注意的是FTW1仅仅是FMChirp的开始点。这里没有约束返回FTW1的要求,一旦FMChirp产生,它将会在奈奎斯特带宽(直流到系统时钟1/2速率)自由跳动(在编程控制范围下)。
在FMChirp模式中有两个控制位可以利用,将会使能够返回开始频率FTW1,或返回到0HZ。首先,当CLRACC1位(寄存器地址1FHEX)设置为高,48位频率累加(ACC1)的输出被清除,在一个持续一个系统时钟周期的retriggerable短脉冲后。输入到累加器的48位DWT字不影响CLRACC1位。若果CLRACC1位保持为高,单一短脉冲将会被释放到频率累加器(ACC1),在每一个I/O更新时钟的上升沿,其作用是干扰当前的调频,设置频率回到FTW1,以先前编程写好的速率和变化的方向继续该调频。在该调频模式中,清除频率累加器的输出如图19所示。如图中所示的I/O更新时钟,可以是使用者提供的或内部产生的。在该数据库中到处可以见到讨论I/O更新的描述。
另外,CLRACC2控制位(寄存器地址1FHEX)是用于清除频率累加器和相位累加器的。当该位设置为高,相位累加器的输出将会从DDS中输出0HZ。只要该位设置为高,频率和相位累加器将会被清除。从0HZ从新输出。要从新回到先前的DDS操作,CLRACC2必需设置为逻辑低,该位在脉冲产生FM中是非常之有用的。
图20表示作用于CLRACC2位上的DDS输出频率。注意到寄存器被编程,当CLRACC2位是高允许新的FTW1频率和斜升速率被生成。
另一种功能,只用于调频模式中,它就是HOLD引脚,引脚29。该功能是停止进入斜升速率计数器的时钟信号。因此阻止任何更高时钟脉冲进入频率累加器,ACC1。其作用是保持调频跳动在目前的频率上面,在HOLD被拉高之前。当HOLD引脚回到底电平,始终重新使用和调频继续进行。在HOLD条件期间,使用者可以改变寄存器的编程,然而,斜升速率计数器必需重新操作在原来的速率直到计数器计数为0,也包含在以各新的斜升速率技术产生。图21表示来HOLD功能在DDS输出频率的作用。

32位自动I/O更新计数器可以用于复杂结构的调频或斜升FSK序列。由于该内部计数器是以AD9854系统时钟合成的。它允许精确的时间编程改变被要求。在该情况下,仅仅要求使用者编写想要的仅存器早于更新时钟被产生。
在调频模式中,中心频率不是直接具体指定的,若用户不能控制调频,DDS将会在DC(直流频率)到奈奎斯特范围中自己选择。除非被用户终止,否则调频将会持续到系统能有能力(也就是系统没有电提供)。
当调频的中心频率达到后,有几个问题自然的会产生:
⊙在中心频率停止使用HOLD引脚,或者写全0入频率累加器DWT寄存器中。
⊙使用HOLD引脚功能停止调频的跳动,用数字相乘器和ShapedKeying引脚,引脚30,或经过可编程寄存器控制(地址21-24HEX)。
⊙使用CLRACC2位控制突发中断传输。
⊙使用反方向,返回先前的频率或另一个频率点,中频以线性或用户直接方法继续调频。如果其与下行频率有关,一个负极性的48位DWT位(MSB设置为高’1’)必须寄存入寄存器地址10-15HEX。DWT字的频率减少步进要求MSB设置为逻辑高电平。
⊙连续调频由立刻返回到起点频率(F1)锯齿时期和重覆先前的调频过程。这是CLRACC1控制位被使用的地方。自动,重覆调频可能被设定使用32位更新时钟发出CLRACC1指令在精确时间间隔时间。调整间隔时间或改变DWT频率字将改变调频的范围。这是新任在用户平衡调频期间和频率决议达到适当的频率范围。

二进制相移键控(模式100)
BPSK模式:与FSK模式的控制方式相同,只是F1为载波频率,29管脚选择相位控制字P1(低电平)和P2(高电平)中的相位作为信号的相位输出。此外,还要通过频率寄存器对输出信号的频率进行控制。实现过程为:先将载波频率送频率控制寄存器1,然后将相位控制字送至相位控制寄存器1和2,再将BPSK的调制数据加载到BPSK端口,最后使能更新。
当AD9854工作在BPSK模式下时,基本编程步骤如下:
(1)将初始频率控制字WFC写入48位FTWI(FrequencyTuningWord1)中。
(2)将两个14位相位控制字分别送入相位调节寄存器P1和P2中。
(3)将时间步进量写入20位RRC(RampRateClock)中。
(4)更新脉冲,将数据送入DDS核进行合成,输出信号。



AD9854的使用
内部和外部更新时钟
这种更新时钟功能占用一个I/O引脚(20脚)和一个32位可编程减计数器。为使I/O寄存器的编程对DDS操作有效必须在20脚送外部时钟信号(由低电平到高电平变化)或使能内部的32位更新时钟。
当用户选择外部更新时钟,它的内部系统时钟会防止局部的寄存器的编程变化影响数据的建立和有效时间。这种模式可以让用户实现对编程信息使能的控制。系统默认更新时钟是内部更新,为了切换为外部更新用户必须将更新时钟位设置为逻辑高电平。内部更新模式时钟自动产生,更新脉冲的时间由用户来设置。
内部更新时钟的建立通过用户对32位更新时钟寄存器和时钟更新位的逻辑电平来设置。更新时钟减计数器的操作是在系统时钟的一半速率下进行的(最大为150MHZ),并且它是从32位二进制值开始减计数的。当计数值为0时,会在IO更新脚自动产生一个输出,更新功能实现。在20脚的内部和外部的更新时钟,允许用户通过设置更新时钟速率来同步编程信息。更新脉冲的输出时间为
(N+1)×(SystemClockPeriod×2)
其中,N是用户编程设置的32位有效值。N的范围是从1到(232?1)的值。内部更新时钟输出的脉冲会在20脚固定的持续8个时钟周期的高电平时间。
对更新时钟寄存器的值设置为小于5个时钟周期会让IO更新脚持续输出高电平,时钟更新功能仍然有效,但是用户不能利用该信号来指示数据的传输。这是IO更新时钟输出时的最低高电平持续时间。
通断整形键控
这一特征允许用户对I和Q通道输出的信号进行时间——幅度设置。这一功能在数据的突变传输中用来减小对频谱的限制,改善数据的传输。用户必须在控制寄存器中将OSKEN位置逻辑高电平来使能数字乘法器。否则如果OSKEN位为低电平,I和Q通道的输出为满幅的信号,数字乘法器的控制将被旁路掉。除了设置OSKEN位以外,第二功能位,OSKINT必须设置为高电平。逻辑高电平将选中内部的线性斜率增减控制功能。OSKINT设置为低电平控制开关将由原来的数字乘法器切换到12位可编程幅度寄存器,输出的幅度在任何模式下都可以动态的变化。最大输出幅度是由RSET电阻和OSKINT使能不可编程时决定的。

图49通断整形键控
输出从零幅到满幅的传输时间由用户通过编程设置。传输时间由两个固定成员和一个变量成员决定。变量是一个8位斜率计数器。这是一个减计数器,它的最大时钟是系统的最大时钟(300MHZ),在计数值为零时,输出一个脉冲。在脉冲的有效期间,将会发送一个12位计数值,它连接到一个12位数字乘法器。当数字乘法器的输入值是0时,输入信号与0相乘,产生一个零幅信号。当数字乘法器的输入值是1时,输入信号与4095/4096相乘,产生一个接近满幅的信号。还有4094个分段的乘数,输出的幅度由二进制数值决定。
如果减计数值小于3,则斜率计数器无效,因此数字乘法器输出一个固定幅度的信号。这个停止条件可被用户利用,来产生OOK信号。
最后,当OSKINT位设置为高电平时,改变30脚的逻辑电平,实现整形键控,通过变成可自动完成线性功能。30脚的逻辑高电平会有一个到满幅的线性输出并且一直保持直到逻辑电平变为低,输出会斜降至零幅。
I和Q通道输出
正弦和余弦输出分别由I和Q通道输出。它们的最大输出值由56脚的电阻决定,最大输出电流为20毫安。但是一般都设置为10毫安输出,这样可以有较好的无杂散动态比。设置输出电阻为
RSET=39.93/IOUT
模数输出的最大电压范围是-0.5V到+1.0V。电压超出这个范围会使波形失真,甚至损坏器件。
模数输出控制
12位的Q通道输出可重新配置为控制和辅助的模数输出。模数控制输出可给外部电路提供直流控制电平,也可输出交流信号以及控制比较器输出方波的占空比。当控制寄存器(并行地址为:1FH)中的SRCQDAC位设置为逻辑高电平时,Q通道的模数输入由内部的12位数据切换到外部输入,输入的是用户设定的两个12位比较数据。数据以最大100MHZ的速率通过并行或串行接口送入寄存器。此模数转换的时钟是系统时钟,每秒最多比较300M次,并且它和I通道具有相同的电流输出能力。
反SINC功能
由正弦查询表输出的数据将直接输入到逆sinc函数(InverseSINCFunction)滤波器。AD9854具有两个逆sinc函数滤波器,能够对信号进行sin(x)/x校正,补偿DAC输出频谱中固有的sin(x)/x滚降(roll2off)效应,这种校正能够保证宽带信号如QPSK(四相制移相键控信号),在从DAC输出时,幅度不会随着频率变化而产生突变。由逆sinc函数滤波器输出的信号将会乘上1个衰减因子,然后再送入到D/A的转换器。通过配置I、Q支路AM调整寄存器,用户可以设置这个衰减因子的大小,该寄存器为12Bit,衰减因子的数值范围是0~4095/4096。例如,当AM调整寄存器设置为200时,衰减因子则为:200/4096。此外,当开/关成形键控管脚(见图2)被设置为1时,AM调整寄存器还可设定信号幅度由0到峰值的转换时间。在数据突变传输情况下,该功能会有效缓解频谱冲击和数据突变给信号生成带来的不利影响。数字信号经过生成、查表、滤波、衰减,最终送入到D/A转换器。
基准时钟乘法器
基准时钟乘法器是一个允许用户编程的,内置基于锁相环(PLL)的可编程参考时钟倍乘器,倍乘范围为4倍到20倍。使用该功能允许用户仅仅输入15MHZ的参考时钟产生300MHZ的内部系统时钟。如表2所示,在控制寄存器中1EHEX的5位数据控制倍频器的值。
AD9854的参考时钟功能能允许从外部时钟源输入的直接时钟。AD9854的系统时钟可以是参考时钟倍频器的输出(如果被允许的前提下),也可以是参考时钟输入,REFCLK可以是single-ended或differented输入,由引脚64DIFFCLKENABLE的设置确定,分别是低或高电平控制。

图51反辛格滤波器效果图
倍频范围位
倍频范围位决定通过倍频之后的时钟范围。当倍频位设定为高电平操作时钟从200MHZ到300MHZ(内部系统时钟速率)。当倍频位设定为低电平操作时钟为200M以下。倍频范围位改变锁相环的参数来改善频率范围内的最佳相位噪声。
61脚,倍频滤波
该引脚提供连接到PLL环路滤波器的外部0补偿网络。0补偿网络由1.3的电阻和0.01uF的电容串联组成。网络的另一端应该尽可能近地连接到引脚60,AVDD。为了达到最佳的噪声效果,始终倍频器应该被分路,通过在控制寄存器IE地址中设置旁路倍频位。
差分时钟使能
这是一个可编程PLL-based参考时钟倍频器,其允许用户从4倍到20倍间选择整数倍的时钟。使用该功能允许用户仅仅输入15MHZ的参考时钟产生300MHZ的内部系统时钟。如表Ⅲ所示,在控制寄存器中1EHEX的5位数据控制倍频器的值。
AD9854的参考时钟功能能允许从外部时钟源输入的直接时钟。AD9854的系统时钟可以是参考时钟倍频器的输出(如果被允许的前提下),也可以是参考时钟输入,REFCLK可以是single-ended或differented输入,由引脚64DIFFCLKENABLE的设置确定。分别是低或高电平控制。
对于信号单端输入方式,REFCLKB管脚接HYPERLINK"http://zhuanti.rongsheng.net/List_1.html"电源或地;对于差分输入方式,输入端信号可以是方波或正弦波,直流电平大约为1.6V,峰峰值大于0.4V。???
高速比较器——最优化的最高速速度大于300MHZ的反复速率,低抖动,灵敏的输入,built-in滞后,输出最小为1皮法的电平,连接到50欧姆的负载或CMOS逻辑电平,连接到高阻抗负载。比较起能从节电模式到受保护电压之间分离。比较器使用于“时钟发生器”的应用,把DDS产生的滤波后的正弦波形变成方波。
AD9854的编程
AD9854的各寄存器列出在下表,包含各各功能的片内编程信息。很多应用要求很小的编程规模去装配AD9854,就可以使用了,实现功能了。但有一些要求用户使用所有的12个寄存器入口地址。AD9854支持8位并行I/O操作或一位SPI-compatible串行I/O操作。所有入口寄存器能读和写,在每个I/O操作模式下。S/P选择,引脚70,用于I/O模式选择。若系统使用并行I/O模式,必须连接S/P选择引脚到VDD。若系统操作在串行模式,必须连接S/P选择引脚到GND。
不使用模式,I/O口数据写入缓冲寄存器,不影响该部分操作直到缓冲寄存器传输数据到寄存器数据库。信息传输同时产生在系统时钟,两种产生方式:
(1)内部控制在某一由用户编程产生的速率
(2)由用户外部控制,I/O操作能在没有REFCLK情况下进行,但数据从缓冲期传输到存储器,没有REFCLK是不行的。能从该文献更新时钟章节中了解到更多的详细信息。
复位管理——逻辑高电平有效,必须保证电平不小于10个系统时钟周期的持续时间。复位主要引起通信总线的初始化并载入默认值到内部或外部的时钟更新段。



表4-1AD9854并行接口寄存器功能
Table4-1AD9854parallelinterfaceregistersfunction
并行地址寄存器功能默认值0x00
0x01相位寄存器#1<13:8>(15,14位无效)
相位寄存器#1<7:0>0x00
0x000x02
0x03相位寄存器#2<13:8>(15,14位无效)
相位寄存器#2<7:0>0x00
0x000x04
0x05
0x06
0x07
0x08
0x09频率转换字#1<47:40>
频率转换字#1<39:32>
频率转换字#1<31:24>
频率转换字#1<23:16>
频率转换字#1<15:8>
频率转换字#1<7:0>0x00
0x00
0x00
0x00
0x00
0x000x0A
0x0B
0x0C
0x0D
0x0E
0x0F频率转换字#1<47:40>
频率转换字#1<39:32>
频率转换字#1<31:24>
频率转换字#1<23:16>
频率转换字#1<15:8>
频率转换字#1<7:0>0x00
0x00
0x00
0x00
0x00
0x000x10
0x11
0x12
0x13
0x14
0x15三角频率字<47:40>
三角频率字<39:32>
三角频率字<31:24>
三角频率字<23:16>
三角频率字<15:8>
三角频率字<7:0>0x00
0x00
0x00
0x00
0x00
0x000x16
0x17
0x18
0x19更新时钟计数器<31:24>
更新时钟计数器<23:16>
更新时钟计数器<15:8>
更新时钟计数器<7:0>0x00
0x00
0x00
0x400x1A
0x1B
0x1C边沿速率计数器<19:16>(23,22,21,20不起作用)
边沿速率计数器<15:8>
边沿速率计数器<7:0>0x00
0x00
0x000x1D
0x1E
0x1F
0x20节电控制
时钟倍频控制器
DDS模式控制与累加器清零控制
传输模式,和OSK控制0x00
0x64
0x20
0x200x21
0x22输出幅度乘法器I<11:8>(15,14,13,12不起作用)
输出幅度乘法器I<7:0>0x00
0x000x23
0x24输出幅度乘法器Q<11:8>(15,14,13,12不起作用)
输出幅度乘法器Q<7:0>0x00
0x000x25输出边沿变化率控制器<7:0>0x800x26
0x27QDAC,Q通道D/A输入<11:8>
QDAC,Q通道D/A输入<7:0>0x00
0x00表3寄存器分布表
寄存器地址Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit01DH无关无关无关关闭比较器保留位关闭Q
路数模转换器关闭
数模转换器关闭数字模块1EH无关参考时钟范围控制字旁路参考时钟
倍频器参考时钟倍频控制字4参考时钟倍频控制字3参考时钟倍频控制字2参考时钟倍频控制字1参考时钟倍频控制字01FH清除累加器控制字1清除累加器控制字2三角波扫频控制位Q路数模转换器输入控制位调制模式选择位2调制模式选择位1调制模式选择位0内部更新时钟20H无关旁路反SINC函数滤波器“通断整形键控”使能“通断整形键控”内部控制无关无关低位传输优先串行输出使能21H
22H输出整形键控I通道复用<11:8>(位15,14,13,12没有使用)
输出整形键控I通道复用<7:0>23H
24H输出整形键控Q通道复用<11:8>(位15,14,13,12没有使用)
输出整形键控Q通道复用<7:0>25H输出整形键控的斜率控制<7:0>26H
27HQ通道模数输出<11:8>(位15,14,13,12没有使用)
Q通道模数输出<7:0>
并行输入输出操作
在S/P选择引脚被拉为高电平时,并行输入输出模式被激活。这种输入输出口与标准工业DSPs和microcontrollers相兼容。6个地址位,8个双向数据位,和分离的写/读控制输入来补足这输入输出口引脚。
并行输入输出操作模式允许到1/10.5纳秒对每个寄存器进行单字节操作。对寄存的回读操作主要用来优化对AD9854的设计(读寄存器不能保证100MHz的操作速度,这一点他们为只是软件调试准备的)。
并行输入输出操作时序图如图52和图53所示。














图52并行操作读时序图











图53并行操作写时序图







AD9854应用原理与方法
多路相位可控信号源的设计关键是实现多路DDS模块的相位的同步控制。要实现多路DDS相位同步,只需要在各DDS设置完成相位偏置后,提供一个使各路DDS同步工作的外部更新信号。根据这样的工作原理,以AD9854为例,给出多路相位可控信号源的基本结构。
图4-4多路DDS组成相位可控信号原理图
chart4-4mult-DDSconstitutionandprincipium
图4-4中左半部分是一个正确多路DDS的结构,由一个统一时钟源提供参考时钟,相位偏置通过并行或串行总线设置,其值保存于各路AD9854的缓冲寄存器中。通过统一的外部更新信号启动各路DDS同步工作,从而实现了各路DDS信号之间以固定的相位差同步工作。
参考时钟的连线方式很重要,图4-4右半部分给出了种错误的连接方式。参考时钟到各DDS的距离不等,这就会引起各路DDS的参考时钟不同步,从而也无法保证各路DDS的同步。
此外外部更新信号Update虽然没有必要严格的等长,但最好要与参考时钟保证正确的时序,因为Update信号送入AD9854后会在内部系统时钟(由外部时钟倍频和锁相得到)的上升沿触发更新。各路DDS的Update信号与内部系统时钟有可能出现一个时钟周期的抖动,在这个系统时钟的前后两个时间点产生更新。Update信号与系统时钟的时序要求如下:

图4-5a单端外部参考时钟输入模式下更新信号时序
chart4-5aUpdateschedulinginsinglereferclockmode

图4.5b差分外部参考时钟输入模式时序更新信号时序
chart4-5aUpdateschedulingindiffernecereferclockmode
对于AD9854而言,其真正的相位值,是相位偏置值和相位累加器的输出值的和,在对相位偏置值更新时,一定要保证相位累加器的值是确定的。最简单的方法是在设置相位前,将所有AD9854通过MasterReset信号重置,此时AD9854的寄存器恢复到默认值(见表4-1)。
下面步骤可完成对多个AD9854实现相位可控同步输出:
1,上电后给所有AD9854的复位信号管脚MasterRest提供一个长达10个系统时钟的复位信号,此时所有AD9854的程序寄存器都恢复为默认值。
2,使用并行总线设置AD9854的特殊功能寄存器:
a,更新模式设置为外部信号更新模式,且DDS工作在Single模式下,即寄存器0x1F=0x00;
b,参考时钟为30MHz,这里要获得210MHz的系统时钟,所以倍频数设置为7,由于超过200MHz,要开PLL低通,即寄存器0x1e=0x3d;
c,电源只打开I通道DAC和数字部分,寄存器0x1D=0x14;
d,开输出滤波,不用OSK功能,寄存器0x20=0x40;设置内部更新时钟,也可以不设置。
3,所有的AD9854完成模式设置后,内部更新时钟寄存器计数到0时,步骤2的设置才真正更新。此时由于频率控制字为0,因此相位累加器不工作,始终为0。
4,按以上步骤完成所有AD9854的初始设置后,使用并行传输向各AD9854写入频率转换字#1和相位偏置寄存器#1。
5,完成所有AD9854的频率和相位设置后,给一个全局的外部更新信号Update,此时各路AD9854就开始同步工作。注意Update信号的时序要求非常严格,最好满足图4.5的时序。
完成各路AD9854的初次同步输出后,若改变频率控制字,就不能在保证相位的正确设置了,此时可以设置特殊寄存器位ACC0(0x1F的6,7位)强制清零,然后再同步恢复的方式实现相位累加器输出的同步。




STM32驱动程序

#include"config.h"
#include"bsp_pin.h"

#ifdefAD9854
#include"bsp_ad9854.h"


uint8_tFreqWord1[6]; //通道一6个字节频率控制字
uint8_tFreqWord2[6];//通道二6个字节频率控制字

#defineCLK_Set12//倍频系数
constdoubleFreq_convert_word=1172812.402961067;//频率控制字系数


//引脚列表,如有改动,只需更改此列表
structpin_indexpins[]=
{
{Data_0,RCC_APB2Periph_GPIOB,GPIOB,GPIO_Pin_14,GPIO_Mode_Out_PP},
{Data_1,RCC_APB2Periph_GPIOB,GPIOB,GPIO_Pin_11,GPIO_Mode_Out_PP},
{Data_2,RCC_APB2Periph_GPIOC,GPIOC,GPIO_Pin_5,GPIO_Mode_Out_PP},
{Data_3,RCC_APB2Periph_GPIOB,GPIOB,GPIO_Pin_7,GPIO_Mode_Out_PP},
{Data_4,RCC_APB2Periph_GPIOC,GPIOC,GPIO_Pin_4,GPIO_Mode_Out_PP},
{Data_5,RCC_APB2Periph_GPIOE,GPIOE,GPIO_Pin_6,GPIO_Mode_Out_PP},
{Data_6,RCC_APB2Periph_GPIOA,GPIOA,GPIO_Pin_7,GPIO_Mode_Out_PP},
{Data_7,RCC_APB2Periph_GPIOA,GPIOA,GPIO_Pin_5,GPIO_Mode_Out_PP},

{Addr_0,RCC_APB2Periph_GPIOB,GPIOB,GPIO_Pin_6,GPIO_Mode_Out_PP},
{Addr_1,RCC_APB2Periph_GPIOC,GPIOC,GPIO_Pin_13,GPIO_Mode_Out_PP},
{Addr_2,RCC_APB2Periph_GPIOE,GPIOE,GPIO_Pin_5,GPIO_Mode_Out_PP},
{Addr_3,RCC_APB2Periph_GPIOA,GPIOA,GPIO_Pin_6,GPIO_Mode_Out_PP},
{Addr_4,RCC_APB2Periph_GPIOA,GPIOA,GPIO_Pin_4,GPIO_Mode_Out_PP},
{Addr_5,RCC_APB2Periph_GPIOB,GPIOB,GPIO_Pin_8,GPIO_Mode_Out_PP},

{Rset_0,RCC_APB2Periph_GPIOB,GPIOB,GPIO_Pin_9,GPIO_Mode_Out_PP},

{Uclk_0,RCC_APB2Periph_GPIOB,GPIOB,GPIO_Pin_5,GPIO_Mode_Out_PP},

{Wdat_0,RCC_APB2Periph_GPIOB,GPIOB,GPIO_Pin_10,GPIO_Mode_Out_PP},
{Rdat_0,RCC_APB2Periph_GPIOB,GPIOB,GPIO_Pin_13,GPIO_Mode_Out_PP},

{OSK__0,RCC_APB2Periph_GPIOA,GPIOA,GPIO_Pin_1,GPIO_Mode_Out_PP},
{FSK__0,RCC_APB2Periph_GPIOA,GPIOA,GPIO_Pin_3,GPIO_Mode_Out_PP},
};



staticuint8_tGet_Pins_Num(void)
{
uint8_ti=0;
i=sizeof(pins)/sizeof(pins[0]);//获取引脚数量
returni;
}

/
Name:AD9854_GPIO_Init
Author:JESSE
Date:17/04/18
Description:初始化连接AD9854芯片的相关引脚
/
voidAD9854_GPIO_Init(void)
{
uint8_ti,temp;

GPIO_InitTypeDefGPIO_InitStructure;

i=Get_Pins_Num();//获取总引脚数量

for(temp=0;temp RCC_APB2PeriphClockCmd(pins[temp].rcc,ENABLE);

for(temp=0;temp {
GPIO_InitStructure.GPIO_Pin=pins[temp].pin;
GPIO_InitStructure.GPIO_Mode=pins[temp].pin_mode;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(pins[temp].gpio,&GPIO_InitStructure);
}
}

/
Name:Write_a_Data
Author:JESSE
Date:17/04/18
Description:往指定寄存器写入一个字节数据
/
staticvoidWrite_a_Data(uint8_tAdr,uint8_tdat)
{
uint8_ti=0,Data=0,Addr=0;

for(i=0;i<6;i++)
{
Addr=Adr&(0x01< Write_Pin(pins,(Addr_0+i),(Addr>>i));
}

for(i=0;i<8;i++)
{
Data=dat&(0x01< Write_Pin(pins,(Data_0+i),(Data>>i));
}

Write_Pin(pins,Wdat_0,0);
Write_Pin(pins,Wdat_0,1);
}




uint8_tfreq_init_set[][3]=
{
{0x00,0x00,0x60},//SineTone
{0x00,0x02,0x60},//FSK
{0x00,0x08,0x60},//BPSK
{0x00,0x00,0x70},//OSK
{0x00,0x00,0x60},//AM
{0x00,0x24,0x60},//RFSK
};
/
Name:AD9854_Init()
Author:JESSE
Date:17/04/20
Description:初始化AD9854
/
voidAD9854_Init(uint8_t(mode_arr)[3],uint8_tmode)
{
AD9854_GPIO_Init();

Write_Pin(pins,Wdat_0,1);
Write_Pin(pins,Rdat_0,1);
Write_Pin(pins,Uclk_0,0);
Write_Pin(pins,Rset_0,1);
Write_Pin(pins,Rset_0,0);

Write_a_Data(0x1d,mode_arr[mode][0]); //关闭比较器
Write_a_Data(0x1e,CLK_Set); //设置系统时钟倍频
Write_a_Data(0x1f,mode_arr[mode][1]); //设置系统为模式0,由外部更新
Write_a_Data(0x20,mode_arr[mode][2]); //设置为可调节幅度,取消插值补偿

Write_Pin(pins,Uclk_0,1);//更新AD9854输出
Write_Pin(pins,Uclk_0,0);
}


/
Name:Freq_double_Convert()
Author:JESSE
Date:17/04/20
Description:将频率值转换成频率控制字
公式FTW=(DesiredOutputFrequency×2N)/SYSCLK得到该函数,
其中N=48,DesiredOutputFrequency为所需要的频率,即Freq,SYSCLK
为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]
该函数与上面函数的区别为该函数的入口参数为double,可使信号的频率更精确
建议在100HZ以下用本函数,在高于100HZ的情况下用函数voidFreq_ulong_Convert(longFreq)
/
voidFreq_Convert(doubleFreq,uint8_tFreq_Word)
{
uint32_tLow32;
uint32_tHigh16;
doubleTemp=Freq_convert_word; //23ca99为2的48次方除以120M
Freq=(double)(Temp);//转换为频率控制字
//100000000000000000000000000000000=4294967295
High16=(uint32_t)(Freq/4294967295);//2^32=4294967295
Freq-=(double)High164294967295;
Low32=(uint32_t)Freq;

Freq_Word[0]=Low32;
Freq_Word[1]=Low32>>8;
Freq_Word[2]=Low32>>16;
Freq_Word[3]=Low32>>24;
Freq_Word[4]=High16;
Freq_Word[5]=High16>>8;
}

/
Name:AD9854_SetSine_double()
Author:JESSE
Date:17/04/20
Description:将正弦信号频率控制字写入寄存器,并设置输出幅值
频率取值范围为0~1/2SYSCLK
幅度设置.为12Bit,取值范围为(0~4095)
/
voidAD9854_SetSine(Parameterparameter)
{
uint8_tcount=0;
uint8_tAdress1=0x04,Adress2=0x0A;


Freq_Convert(parameter->Freq1,parameter->FreqWord1); //频率转换为6字节

for(count=6;count>0;) //写入6字节的频率控制字
{
Write_a_Data(Adress1++,parameter->FreqWord1[--count]);
Write_a_Data(Adress2++,parameter->FreqWord1[--count]);
}

Write_a_Data(0x21,(uint8_t)(parameter->I_Shape>>8)); //设置I通道幅度
Write_a_Data(0x22,(uint8_t)(parameter->I_Shape&0xff));

Write_a_Data(0x23,(uint8_t)(parameter->Q_Shape>>8)); //设置Q通道幅度
Write_a_Data(0x24,(uint8_t)(parameter->Q_Shape&0xff));

Write_Pin(pins,Uclk_0,1); //更新AD9854输出
Write_Pin(pins,Uclk_0,0);
}


/
Name:AD9854_SetFSK()
Author:JESSE
Date:17/04/20
Description:AD9854的FSK设置
Freq1FSK频率1
Freq2FSK频率2
/
voidAD9854_SetFSK(Parameterparameter)
{
uint8_tcount=6;
uint8_tAdress1,Adress2;

Adress1=0x04; //选择频率控制字1地址的初值
Adress2=0x0a; //选择频率控制字2地址的初值

Freq_Convert(parameter->Freq1,parameter->FreqWord1);//频率转换1

for(count=6;count>0;) //写入6字节的频率控制字
{
Write_a_Data(Adress1++,parameter->FreqWord1[--count]);
}

Freq_Convert(parameter->Freq2,parameter->FreqWord2);//频率转换2

for(count=6;count>0;) //写入6字节的频率控制字
{
Write_a_Data(Adress2++,parameter->FreqWord2[--count]);
}

Write_a_Data(0x21,(uint8_t)(parameter->I_Shape>>8)); //设置I通道幅度
Write_a_Data(0x22,(uint8_t)(parameter->I_Shape&0xff));

Write_a_Data(0x23,(uint8_t)(parameter->Q_Shape>>8)); //设置Q通道幅度
Write_a_Data(0x24,(uint8_t)(parameter->Q_Shape&0xff));

Write_Pin(pins,Uclk_0,1);
Write_Pin(pins,Uclk_0,0);
}

/
Name:AD9854_SetBPSK(uint32_tPhase1,uint32_tPhase2)
Author:JESSE
Date:17/04/20
Description:AD9854的BPSK设置
Phase1调制相位1
Phase2 调制相位2
相位为14Bit,取值从0~16383,建议在用本函数的时候将Phase1设置为0,
将Phase1设置为8192,180°相位
/
voidAD9854_SetBPSK(Parameterparameter)
{
uint8_tcount;

constuint32_tFreq=60000;

uint8_tAdress=0x04; //选择频率控制字1地址的初值


Write_a_Data(0x00,(uint8_t)(parameter->Phase1>>8)); //设置相位1
Write_a_Data(0x01,(uint8_t)((parameter->Phase1)&0xff));

Write_a_Data(0x02,(uint8_t)(parameter->Phase2>>8)); //设置相位2
Write_a_Data(0x03,(uint8_t)((parameter->Phase2)&0xff));

Freq_Convert(Freq,parameter->FreqWord1);//频率转换

for(count=6;count>0;) //写入6字节的频率控制字
{
Write_a_Data(Adress++,parameter->FreqWord1[--count]);
}

Write_a_Data(0x21,(uint8_t)(parameter->I_Shape>>8)); //设置I通道幅度
Write_a_Data(0x22,(uint8_t)(parameter->I_Shape&0xff));

Write_a_Data(0x23,(uint8_t)(parameter->Q_Shape>>8)); //设置Q通道幅度
Write_a_Data(0x24,(uint8_t)(parameter->Q_Shape&0xff));

Write_Pin(pins,Uclk_0,1);
Write_Pin(pins,Uclk_0,0);
}


/
Name:AD9854_SetOSK(uint8_tRateShape)
Author:JESSE
Date:17/04/20
Description:AD9854的OSK设置
RateShapeOSK斜率,取值为4~255,小于4则无效
/
voidAD9854_SetOSK(Parameterparameter)
{
uint8_tcount;

constuint32_tFreq=60000; //设置载频

uint8_tAdress=0x04; //选择频率控制字地址的初值

Freq_Convert(Freq,parameter->FreqWord1);//频率转换

for(count=6;count>0;) //写入6字节的频率控制字
{
Write_a_Data(Adress++,parameter->FreqWord1[--count]);
}

Write_a_Data(0x21,(uint8_t)(parameter->I_Shape>>8)); //设置I通道幅度
Write_a_Data(0x22,(uint8_t)(parameter->I_Shape&0xff));

Write_a_Data(0x23,(uint8_t)(parameter->Q_Shape>>8)); //设置Q通道幅度
Write_a_Data(0x24,(uint8_t)(parameter->Q_Shape&0xff));

Write_a_Data(0x25,parameter->OSK_RateShape); //设置OSK斜率

Write_Pin(pins,Uclk_0,1);
Write_Pin(pins,Uclk_0,0);
}


/
Name:AD9854_SetAM(uint32_tShape)
Author:JESSE
Date:17/04/20
Description:AD9854的AM设置
Shape12Bit幅度,取值从0~4095
/
voidAD9854_SetAM(Parameterparameter)
{

uint8_tcount;
constuint32_tFreq=60000; //设置载频

uint8_tAdress=0x04; //选择频率控制字地址的初值

Freq_Convert(Freq,parameter->FreqWord1);//频率转换

for(count=6;count>0;) //写入6字节的频率控制字
{
Write_a_Data(Adress++,parameter->FreqWord1[--count]);
}

Write_a_Data(0x21,(uint8_t)(parameter->I_Shape>>8)); //设置I通道幅度
Write_a_Data(0x22,(uint8_t)(parameter->I_Shape&0xff));

Write_a_Data(0x23,(uint8_t)(parameter->Q_Shape>>8)); //设置Q通道幅度
Write_a_Data(0x24,(uint8_t)(parameter->Q_Shape&0xff));

Write_Pin(pins,Uclk_0,1);
Write_Pin(pins,Uclk_0,0);
}


/
Name:AD9854_SetRFSK
Author:JESSE
Date:17/04/20
Description:Freq_LowRFSK低频率 48Bit
Freq_HighRFSK高频率 48Bit
Freq_Up_Down 步进频率 48Bit
每两个脉冲之间的时间周期用下式表示(FreRate+1)(SystemClock),一个脉冲,
频率上升或者下降一个步进频率
/
voidAD9854_SetRFSK(Parameterparameter)
{
uint8_tcount=6;
uint8_tAdress1,Adress2,Adress3;

Adress1=0x04; //选择频率控制字地址的初值
Adress2=0x0a;
Adress3=0x10;

Freq_Convert(parameter->RFSK_Freq_Low,parameter->FreqWord1);//频率1转换

for(count=6;count>0;) //写入6字节的频率控制字
{
Write_a_Data(Adress1++,parameter->FreqWord1[--count]);
}

Freq_Convert(parameter->RFSK_Freq_High,parameter->FreqWord2);//频率2转换

for(count=6;count>0;) //写入6字节的频率控制字
{
Write_a_Data(Adress2++,parameter->FreqWord2[--count]);
}

Freq_Convert(parameter->RFSK_Freq_Up_Down,parameter->FreqWord1);//步进频率转换

for(count=6;count>0;) //写入6字节的频率控制字
{
Write_a_Data(Adress3++,parameter->FreqWord1[--count]);
}

Write_a_Data(0x1a,(uint8_t)(((parameter->RFSK_FreRate)>>16)&0x0f));//设置斜升速率
Write_a_Data(0x1b,(uint8_t)((parameter->RFSK_FreRate)>>8));
Write_a_Data(0x1c,(uint8_t)(parameter->RFSK_FreRate));

Write_a_Data(0x21,(uint8_t)(parameter->I_Shape>>8)); //设置I通道幅度
Write_a_Data(0x22,(uint8_t)(parameter->I_Shape&0xff));

Write_a_Data(0x23,(uint8_t)(parameter->Q_Shape>>8)); //设置Q通道幅度
Write_a_Data(0x24,(uint8_t)(parameter->Q_Shape&0xff));

Write_Pin(pins,Uclk_0,1);
Write_Pin(pins,Uclk_0,0);
}


//各模式的相关函数列表

staticstructfreq_mode_setmode_set[7]=
{
{AD9854_Init,AD9854_SetSine},
{AD9854_Init,AD9854_SetFSK},
{AD9854_Init,AD9854_SetBPSK},
{AD9854_Init,AD9854_SetOSK},
{AD9854_Init,AD9854_SetAM},
{AD9854_Init,AD9854_SetRFSK},
};


externstructfreq_opfreq_opp[freq_channels];
int8_told_mode=-1;
/
Name:AD9854_Start
Author:JESSE
Date:17/04/28
Description:只需修改结构体中的相应模式及参数,便可选择相应输出模式及输出参数
/
voidAD9854_Start(structfreq_opfreq_para)
{
Parameterparameter1;

parameter1.Order=Freq1;//输出通道选择
parameter1.Freq_mode=Sine;//输出模式
parameter1.FreqWord1 =FreqWord1;//频率控制字存储空间1
parameter1.FreqWord2 =FreqWord2;//频率控制字存储空间2
parameter1.Phase1 =freq_para[0].phase1;//相位1
parameter1.Phase2 =freq_para[0].phase2;//相位2
parameter1.Freq1 =freq_para[0].freq1_num;//输出频率选择
parameter1.Freq2 =freq_para[0].freq2_num;//FSK模式频率2
parameter1.I_Shape=freq_para[0].shape1;//I通道输出幅度0~4095
parameter1.Q_Shape=freq_para[0].shape2;//Q通道输出幅度
parameter1.OSK_RateShape =0;//OSK模式RateShape
parameter1.RFSK_Freq_High =0;
parameter1.RFSK_Freq_Low =0;
parameter1.RFSK_Freq_Up_Down=0;
parameter1.RFSK_FreRate=0;

if(old_mode!=parameter1.Freq_mode)
mode_set[parameter1.Freq_mode].mode_init(freq_init_set,parameter1.Freq_mode);//初识化相关模式
mode_set[parameter1.Freq_mode].mode_set(¶meter1);//进行设置
}

#endif/AD9854/

头文件
bsp_pin.h
#ifndef__PIN_H_
#define__PIN_H_

#include

typedefenum
{
IN=1,
OUT=2
}PIN_Mode;

typedefenum
{
PIN_LOW=0,
PIN_HIGH=1
}PIN_Status;

structpin_index
{
intindex;
uint32_trcc;
GPIO_TypeDefgpio;
uint32_tpin;
GPIOMode_TypeDefpin_mode;
};

voidWrite_Pin(structpin_indexpins,uint8_tpin,uint8_tdat);
voidPin_Mode_Change(structpin_indexpins,uint8_tpin_name,uint8_tmode);

#endif/__PIN_H_/

Bsp_ad9854.h
#ifndef__AD9854_H_
#define__AD9854_H_

#include"stm32f10x.h"
#include
#include"lcd_show.h"


typedefenum
{
Data_0=0,
Data_1=1,
Data_2=2,
Data_3=3,
Data_4=4,
Data_5=5,
Data_6=6,
Data_7=7,

Addr_0=8,
Addr_1=9,
Addr_2=10,
Addr_3=11,
Addr_4=12,
Addr_5=13,

Rset_0=14,
Uclk_0=15,
Wdat_0=16,
Rdat_0=17,
OSK__0=18,
FSK__0=19
}pin_name;


typedefenum
{
Sine=0,
FSK=1,
BPSK=2,
OSK=3,
AM=4,
RFSK=5
}mode_select;


typedefenum
{
Channel1=0,
Channel2=1
}Channels;

typedefenum
{
Freq1=0,
Freq2=1
}Freqs;


typedefstruct
{
uint8_tFreq_mode;
uint8_tOrder;//SetSine

uint8_tOSK_RateShape;//SetOSK

uint8_tFreqWord1;//如果只需要一个频率控制字,默认为FreqWord1
uint8_tFreqWord2;

uint32_tPhase1;//SetPBSK
uint32_tPhase2;//SetPBSK

uint32_tFreq1;//SetFSK
uint32_tFreq2;//SetFSK

uint16_tI_Shape;
uint16_tQ_Shape;

uint32_tRFSK_Freq_Low;//SetRFSK
uint32_tRFSK_Freq_High;//SetRFSK
uint32_tRFSK_Freq_Up_Down;//SetRFSK
uint32_tRFSK_FreRate;//SetRFSK

}Parameter;



structfreq_mode_set
{
void(mode_init)(uint8_t(mode_arr)[3],uint8_tmode);
void(mode_set)(Parameterparameter);
};


voidAD9854_Start(structfreq_opfreq_para);
voidAD9854_GPIO_Init(void);
voidAD9854_InitFSK(void);
voidAD9854_SetSine_double(Parameterparameter);
voidAD9854_SetFSK(Parameterparameter);

#endif/__AD9854_H_/
献花(0)
+1
(本文系JESSE_Libra...首藏)