16位单片机对AD9854控制的探讨

电子说

1.3w人已加入

描述

  AD9854优势和特点

  300 MHz内部时钟速率

  FSK、BPSK、PSK、线性调频、AM操作

  两个集成式12位数模转换器(DAC)

  超高速比较器,均方根抖动:3 ps

  出色的动态性能:80 dB SFDR (100 MHz ± 1 MHz AOUT)

  4×至20×可编程基准时钟乘法器

  两个48位可编程频率寄存器

  两个14位可编程相位偏移寄存器

  12位可编程振幅调制和开关输出形键控功能

  单引脚FSK和BPSK数据接口

  通过输入/输出接口提供PSK功能

  线性或非线性FM线性调频功能,具有单引脚频率保持功能

  AD9854电路图

  下面给出一种用AD9854开发高精度频率信号发生器的简易方法,开发者只需要熟悉MCS-51单片机编程即可。该系统具有开发周期短,开发成本低的特点,也可以作为探索AD9854功能的一种方法,它的电路原理图见图2。

单片机

  系统主要由DDS芯片AD9854、单片机AT89C51、看门狗定时器X25045和LED显示驱动芯片MAX7219组成。在这个系统中提供了8位七段LED显示器,其中前五位为输出频率值,显示范围为00.000~99.999MHz,后三位为幅度显示位,显示范围为0~999,表示幅值从零幅度到满幅度的变化。

  16位单片机对AD9854控制的实现

  采用对AD9854进行控制的单片机是凌阳公司的SPCE061A,它是一款16位的微处理器,CPU的时钟频率可达0.32MHz-49.152MHz,32K字的闪存,2K字的工作静态存储器,总共有32位的I/O端口,分为16位的IOA口和16位的IOB口,每个口都可以单独地进行输入输出设置。但是这款单片机不具有其他单片机的读写时序控制引脚,因此在对AD9854的控制中,需要单独拿出一个引脚作为读写时序引脚。

单片机

  由图1所示,要对其进行控制,首先要搭建好其外部电路,根据我们的实验要求,将REFCLKB脚接上电源,实行单端输入方式。再将S/PSE2LECT管脚设置为1,采用并行输入输出方式。

  搭建好外部电路后,开始对AD9854的I/Oupdate信号进行设置,对信号控制是否正确关系着AD9854是否能正常工作。I/Oupdate信号是为了将操作输入的数据从I/O口缓冲寄存器转移到DDS的核心寄存器中而产生的一个由低到高的上升沿。这个信号可以从外部提供,也可以由内部产生。当此信号由外部提供时,我们应将控制寄存器中的INT/EXTUpdateClk位设置为0,此时内部的系统时钟将会与之同步以防止程序寄存器中的数据部分的转移而造成程序执行错误。如要内部自行产生,则要将INT/EXTUpdateClk位设置为1,此时默认的I/OUpdate信号的周期为65×(SYS2TEMCLOCKPERIOD×2)。同样内部产生的I/Oupdate信号也可以由32位的UpdatedClock寄存器(地址为16-19)控制,信号的周期公式是(N+1)×(SYSTEMCLOCKPERIOD×2),其中SYS2TEMCLOCKPERIOD是1/SYSTEMCLOCK,N是需要往32位寄存器中输入的数值,它的适用范围是1至(232-1)。I/OUpdate信号的高电平的持续时间是8个时钟周期。

  接下来,对AD9854中的内部的40个寄存器进行设置。其中地址为1D-20的寄存器为32位的控制寄存器,分别对工作模式,比较器,输出幅度,系统时钟等进行了控制。

  首先,对地址为1D的寄存器进行设置,此寄存器主要控制比较器开关和各个输出通路的开关。在实验中,没有使用到比较器,而且要求各个通路都有输出,因此1D地址的控制寄存器保持默认值10h。

  地址为1E的寄存器主要控制芯片内部PLL倍乘器的开关以及倍乘器倍数。在实验中,对AD9854的外部使用20MHz的晶振作为振荡源,并将系统工作时钟设定为200MHz,因此要将1E寄存器中的PLLRange位设置为1,由于用到了AD9854的内部PLL倍乘器,所以BypassPLL位设置为0,倍乘器倍数应设置为10,因此1E地址的控制器中的内容应为4Ah。

  地址为1F的控制寄存器主要控制芯片的工作模式以及I/Oupdate的内外部方式,我们采用的仍然是single-tone模式,而且用的也是内部产生I/Oupdate信号,因此寄存器采用的是默认值01h

  地址为20的控制寄存器主要是对输出波形幅值的控制以及在串行输入输出时的一些设置。在实验中,我们采用的是并行输入输出方式,因此对串行的一些设置都默认为0。对于幅值的设置,如果是要AD9854内部产生幅值,则OSKEN位设置为0,OSKINT位设置为1。如果是通过专门的幅值寄存器对输出幅值进行调控,则OSKEN位设置为1,OSKINT位设置为0。实验中,仍然将此控制寄存器的内容设置为默认值20h,通过专门的幅值寄存器对输出幅值进行调节。

  设置完控制寄存器后,我们再对频率寄存器,幅度寄存器,相位寄存器进行设置。芯片中共有两个频率寄存器,两个相位寄存器。由于我们采用的Single-Tone模式,因此我们只用PhaseAdjust1和FrequencyTuningWord1这两个寄存器。

  PhaseAdjust寄存器是对产生的波形的相位进行控制,地址为00和01,它是一个14位的寄存器,因此产生的波形的相位具有14位的精度。

  FrequencyTuningWord寄存器是对波形的频率进行控制,地址为04至09,它的精度为48位,因此我们需要往里面输入48位的频率控制字,频率控制字的计算公式是:FTW=(DesiredOutputFrequency×2N)/SYSCLK。其中N是相位累加器的分辨率,我们在此取48,算出来的频率控制字是一个十进制数字,因此要把它转化为48位的二进制数。通过此寄存器控制的频率范围可从0至1/2的SYSCLK。SYSCLK是芯片的系统时钟。

  对幅度进行控制的寄存器是地址为21至24的OutputShapeKeyI和OutputShapeKeyQ,它们都是12位的寄存器。

  在AD9854进行读写操作时,重要的问题是要注意它的读写时序,在实验中,我们未对AD9854进行读操作,所以下面只介绍了写操作的时序。

单片机

  由2图所示,在进行写操作时,可将地址和数据同时写入,在WR引脚接收到一个高电平后,数据和地址被写入。

  具体的写程序语句如下:

  3P_IOB_Data=0x0001;

  3P_IOA_Data=0x1e4a;

  3P_IOB_Data=0x0000;

  这条指令是对地址为1e的控制寄存器进行写操作,单片机的IOB0口连接到AD9854的WR引脚。

  16位处理器对AD9854的控制程序

  为了更好的说明 16位处理器对 AD9854的控制 ,这里写了一个程序 :

  #define P_ IOA_Data ( volatile unsigned int 3 ) 0x7000

  #define P_ IOA_Buffer ( volatile unsigned int 3 ) 0x7001

  #define P_ IOA_D ir ( volatile unsigned int 3 ) 0x7002

  #define P_ IOA_A ttrib ( volatile unsigned int 3 ) 0x7003

  #define P_ IOB_Data ( volatile unsigned int 3 ) 0x7005

  #define P_ IOB_Buffer ( volatile unsigned int 3 ) 0x7006

  #define P_ IOB_D ir ( volatile unsigned int 3 ) 0x7007

  #define P_ IOB_A ttrib ( volatile unsigned int 3 ) 0x7008

  #define P_SystemClock ( volatile unsigned int 3 ) 0x7013

  #define P_WatchDog_Clear ( volatile unsigned int 3 ) 0x7012 / /对单片机 I/O地址设置

  void main ( )

  {

  3 P_ IOA_D ir = 0xffff;

  3 P_ IOA_A ttrib = 0xffff;

  3 P_ IOA_Data = 0x0000;

  3 P_ IOB_D ir = 0xffff;

  3 P_ IOB_A ttrib = 0xffff;

  3 P_ IOB_Data = 0x0000; / /对单片机 I/O口的属性进行操作

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x1600;

  3 P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x1700;

  3 P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x1807;

  3 P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x19CF;

  3 P_ IOB_Data = 0x0000; / /对 update信号周期的设置

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x1d10;

  3 P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x1e0a

  P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x1f01;

  3 P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x2020;

  3 P_ IOB_Data = 0x0000; / /对控制寄存器的设置

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x210f;

  3 P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x22ff;

  3 P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x230f;

  3 P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x24ff;

  3 P_ IOB_Data = 0x0000; / /幅度控制

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x0400;

  3 P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x05ff;

  3 P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x06ff;

  3 P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x07ff;

  3 P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x08ff;

  3 P_ IOB_Data = 0x0000;

  3 P_ IOB_Data = 0x0001;

  3 P_ IOA_Data = 0x09ff;

  3 P_ IOB_Data = 0x0000; / /频率控制

  while (1)

  {

  3 P_WatchDog_Clear = 0x0001;

  }

  程序中,将update信号的周期设置为20μs,得出的控制字为000007CF。将频率控制寄存器中写入00ffffffffff,此数字转换成十进制为1099511627775,代入到频率控制字的计算公式中得出可以得到781.25kHz的频率。用示波器进行测量观察,得到图3波形:

单片机

  由观察到的波形可以看出 , update信号的周期为 20μs,输出波形的频率为 782. 9kHz,与初始设定值相一致 ,可知 ,实验程序是正确的。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分