AD9910模块高速DDS模块、功能性能讲解、开发调试注意事项、代码详解、电子设计大赛DDS

这篇具有很好参考价值的文章主要介绍了AD9910模块高速DDS模块、功能性能讲解、开发调试注意事项、代码详解、电子设计大赛DDS。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AD9910模块高速DDS模块+STM32 驱动代码、功能性能讲解、开发调试注意事项、代码详解、电子设计大赛DDS

1.AD9910芯片概述与模块描述

AD9910是一款内置14 bit DAC的直接数字频率合成器(DDS),支持高达1GSPS的采样速率。AD9910采用高级DDS技术,在不牺牲性能的前提下可极大降低功耗。DDS/DAC组合构成数字可编程的高频模拟输出频率合成器,能够在高达400MHz的频率下生成频率捷变正弦波形。

用户可以访同三个用于控制DDS的信号控制参数,包括:频率、相位与幅度。AD9910利用32bit累加器提供快速跳频和频率调谐分辨率,在1GSPS采样速率下,调谐辨率为0.23Hz.这款DDS还实现了快速相位与幅度切换功能。

AD9910内置1k*32位RAM,可利用该RAM,通过RAM播放,实现任意波形发生功能。

AD9910内置数字斜坡发生器,可实现微秒级快速扫频。
ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图1 芯片概述

2.AD9910模块硬件准备

使用的是康威电子的AD9910模块,淘宝店有卖的,如图
ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图2 模块概述

模块硬件接口如下

ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图3 硬件接口图

模块参数如下

ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图4 参数表

笔者使用STM32F103对AD9910进行控制,这是我所用到的STM32控制管脚:
ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图5 基于STM32F103的控制接口

3.代码讲解与测试参考

部分关键参数写在前:
相位累加器:在DDS模块中,此参数与DDS系统的主频共同决定了DDS能输出的频率分辨率。相位器累加器位数是一个非常重要的参数,所有的DDS芯片都一定会标出。
频率分辨率 = 主频 / (2^相位累加器位数),如:

AD9854,主频300M,48位相位累加器,频率分辨率 = 300M Hz / (2^48) = 1.06e-06 Hz
AD9954,主频400M,32位相位累加器,频率分辨率 = 400M Hz / (2^32) = 0.0931 Hz
AD9910,主频1G, 32位相位累加器,频率分辨率 = 1G Hz / (2^32) = 0.2328 Hz

(这就是AD9910数据手册首页频率分辨率的由来,细心的小伙伴可能发现了,板子上只有40M晶振,1G主频哪来的,其实是芯片内部倍频来的,例如AD9910板子上是40M,只需要设置25倍频,就是1G了,其他例如AD9854,AD9954等DDS模块差不多都是这样的,板载频率低的晶振,经片内PLL倍频到数百M高频)

综上,如果我让AD9910(在1G主频下),累加器每次自加1,就能输出0.23Hz频率;每次自加2,就能输出0.46Hz频率;自加10,就能输出2.3Hz频率,
以此类推,输出频率fout = 0.23Hz*自加值 简单换算一下,自加值 = 输出频率 / 0.23,结合前面0.23的由来,DDS输出频率控制字的最终算法:
自加值 = 输出频率 / (主频/(2^累加器位数)) = Fout / (1G / (2^32)) = Fout/0.2328 = Fout * 4.294967296
其中,”自加值”在AD9910官方英文数据手册中,把它叫做频率调谐字(Frequency Tuning Word,在英文手册第50页)
ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图6 频率幅度寄存器

图6

顺带一提,前面提到的25倍频,这个”25”在手册第49页,CFR3寄存器。(不一定设置成25,也可以自己设置成其他倍频数,一般什么时候需要呢?大概需要更低频率分辨率的时候吧,毕竟分辨率 = 主频 /(2^累加器位数))
ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图7 PLL倍频数设置 二进制001 1001 = 25

3.1 AD9910控幅函数+写频率函数

整个CFR3寄存器可配置为

const uchar cfr3[] = {0x05, 0x0F, 0x41, 0x32};  //cfr3控制字  25倍频  VC0=101   ICP=001;

将整个频率(及幅度,都在一个寄存器)控制寄存器定义如下:

uchar profile11[] = {0x3f, 0xff, 0x00, 0x00, 0x25, 0x09, 0x7b, 0x42};

其中profile11[0]和profile11[1]控制输出信号幅度,是14位控制字(参考图3),故控幅函数可以如下写:
以下是AD9910模块由STM32F103RCT6单片机驱动的驱动代码:

/************************************************************
** 函数名称 :void AD9910_AmpWrite(void))
** 函数功能 :将幅度控制数据保存到profile11并写入芯片
** 入口参数 :幅度控制字,范围0~16383
** 出口参数 :无
** 函数说明 :14位幅度控制字,控制数据0~16383对应输出幅度0~800mV左右
**************************************************************/
void AD9910_AmpWrite(uint16_t Amp)
{
    profile11[0] = (Amp % 16384) >> 8;
    profile11[1] = (Amp % 16384) & 0xff;
    Txfrc();
}

其中profile11[4]~profile11[7]控制输出信号频率,是32位控制字(参考图3),故频率函数可以如下写:

/************************************************************
** 函数名称 :void AD9910_FreWrite(void))
** 函数功能 :将需要的频率转换为对应的控制数据,保存进profile11并发送到芯片
** 入口参数 :目标频率,单位Hz,范围0~420000000
** 出口参数 :无
** 函数说明 :无
**************************************************************/
void AD9910_FreWrite(ulong Freq)
{
    ulong Temp;
    Temp = (ulong)Freq * 4.294967296;	 //将输入频率因子分为四个字节  主频1GHz,32位相位累加器,
    //故每Hz在的控制字增量 delta =  4.294967296 = (2^32)/1000000000
    profile11[7] = (uchar)Temp;
    profile11[6] = (uchar)(Temp >> 8);
    profile11[5] = (uchar)(Temp >> 16);
    profile11[4] = (uchar)(Temp >> 24);
    Txfrc();
}

当我们定义好函数后,按如下调用即可:

//代码移植建议
//1.修改头文件AD9910.H中,自己控制板实际需要使用哪些控制引脚。如UP_DAT脚改成PC3控制,则定义"#define UP_DAT PCout(3)" 
//2.修改C文件AD9910V1.C中,AD9110_IOInit函数,所有用到管脚的GPIO输出功能初始化
//3.完成
Init_AD9910();					//AD9910控制脚及寄存器初始化
AD9910_FreWrite(1000);	//写输出频率1KHz。范围:0~420000000,对应频率0Hz~420MHz
AD9910_AmpWrite(16383);	//写输出幅度最大。范围:0~16383对应峰峰值0mv~800mv(左右)

可以在AD9910模块两SMA输出口测得输出波形如下:
ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图8.1 正弦1K双通道测试

ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图8.2 正弦300M双通道实测

ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图8.3 正弦420M双通道实测

发散一下,
前面我们控制了profile11[0],profile11[1]就控制了输出正弦的幅度,
控制profile11[4]~profile11[7],就控制了输出正弦的频率,
那么根据寄存器定义,我们控制profile11[2],profile11[3]是不是就控制了输出正弦的相位呢。

3.2 AD9910RAM播放功能、三角波方波SINC波(任意波形)如何发生

AD9910三角波方波(任意波形)发生,是利用AD9910芯片内部的RAM(共1k大小,1024个数据),通过向这块RAM写入自己定义的波形数据(如三角波),然后使能AD9910芯片开始播放这些数据,任意波形自然就产生了。
将CFR1-Control Function Register 1 (0x00)寄存器的BIT30和BIT29配置为10(二进制),告诉AD9910芯片,我写的RAM的数据是要播放到幅度上的,别放到频率相位什么其他的了。。。

ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图9 RAM播放目的地寄存器

Tablle 12 (英文数据手册第33页),详细描述了RAM播放目的地的定义:
ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图10 RAM播放目的 位码定义

如图9及图10,但我们把CFR1寄存器的BIT6和BIT5设置为1 0(RAM播放的目的地是幅度控制,而不是其他比如相位什么的)。
设置好AD9910芯片内部RAM播放目的后,并写入RAM数据后,波形就有了,然后输出任意波形,除开波形外,频率控制也是个重要功能,频率可以通过寄存器RAM_Profile0来控制。
频率计算参考如下代码注释:

/************************************************************
** 函数名称 :AD9910_RAM_WAVE_Set(AD9910_WAVE_ENUM wave)
** 函数功能 :设置AD9910,RAM功能,向AD9910芯片内部RAM写入1024个点的波形数据,使模块可输出任意波形
							目前仅定义了三角波,方波,SINC波,三种波形数组
							用户也可自定义数组数据,使波形输出自己定义的任意波形(1024个数据,每个数据范围:0~16383)
** 入口参数 :wave: TRIG_WAVE:三角波,SQUARE_WAVE:方波,SINC_WAVE:SINC波
** 出口参数 :无
** 函数说明 :RAM播放速率决定了输出波形的频率,输出频率与播放速率控制字参考以下说明
**************************************************************/
void AD9910_RAM_WAVE_Set(AD9910_WAVE_ENUM wave)
{
    int i;
    const u32 *srcWaveDta;
    u8 CFR1[] = {0x40, 0x40, 0x00, 0x00};	// RAM回放目的:幅度;;开启AD9910反Sinc滤波

//RAM_Profile0[1](高8位)  与  RAM_Profile0[2](低8位)共16位控制字M,决定了输出波形频率,
//频率 = Fsysclk / (4*M) / 输出点数 = 1000000000 / (4*M) / 1024
...
...
...
...
}

有一点需要特别注意的,如果各位小伙伴自己码代码的话,图10中最下面的一段话,数据低位是无效的(也就是32位寄存器,数据高位对齐),写得时候记得一定要移位,
简单调用代码:

Init_AD9910();					//AD9910控制脚及寄存器初始化
AD9910_RAM_WAVE_Set(TRIG_WAVE);	//设置模块输出三角波TRIG_WAVE:三角波,SQUARE_WAVE:方波,SINC_WAVE:SINC波)

测得输出波形如下:
ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图11 三角波实测

3.3 AD9910数字斜坡发生器实现快速扫频

对于DDS模块来说,扫频是一个常见的应用,AD9910芯片内部也集成了自动扫频功能,我们只需设置好参数(下限频率,上限频率,上扫频频率步进,下扫频频率步进,上扫频频点维持时间,下扫频频点维持时间),模块即可按参数自动输出。

//设置数字斜坡频率扫频,并使能自动双向扫频
AD9910_DRG_FreInit_AutoSet(ENABLE);	//ENABLE,自动扫频,无需外加控制;DISABLE,手动扫频,由DRCTL引脚控制扫频

// 设置(下限频率,上限频率,上扫频频率步进,下扫频频率步进,上扫频频点维持时间,下扫频频点维持时间)
AD9910_DRG_FrePara_Set(100000, 100000000, 100, 100, 100,100);//慢速扫频,方便观察, 约800mS,扫频时间计算参考函数注解
AD9910_DRG_FrePara_Set(400000, 300000000, 1200000, 2200000, 100,300);//高速扫频,400K~300M,约263uS,扫频时间计算参考函数注解
//上扫频每点维持100个控制字时间,下扫频每点维持300个控制字时间,
//实际可以将该参数设置到更小,可以获得极高的扫描速度

扫频效果实测:
ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图12 扫频实测

4.AD9910开发注意点

1、AD9910有两个输出通道,在3.1的最后,我们也说了AD9910可以实现调相功能,但这并不意味着两个输出通道的相对相位是可调的。实际上这两个通道相位差是固定的,180度,前面说的相位,是指正弦波开始输出时相位所在位置,比如从0度开始发生,80度开始发生等。

2、在3.2任意波形发生一节,图6 RAM播放目的地截图中可以看出,CFR1的BIT30和BIT29,设置为(二进制)10及11实际上都是可以实现幅度播放即任意波形输出的。经笔者实测,当设置为11 (二进制)Polar(phase and amplitude)模式时,相位设置得当可以得到更大的幅度输出,然而这并不好理解,
所以仅使用了10(二进制)(Amplitude)模式,这样波形数组中仅需存放14位DAC数据即可,使用和移植更便于理解。

3、上述功能都提供了比较详细的代码

ad9910,# 数字信号发生器,stm32,单片机,嵌入式硬件,AD9910,高速DDS模块

图13 资料截图

5.部分资料下载

仅供参考(百度网盘):AD9910部分资料 提取码:KVDZ文章来源地址https://www.toymoban.com/news/detail-588681.html

到了这里,关于AD9910模块高速DDS模块、功能性能讲解、开发调试注意事项、代码详解、电子设计大赛DDS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RK3568平台开发系列讲解(调试篇)Linux 性能调试工具汇总

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将汇总介绍 Linux 调试优化的工具。 我们来看 Linux 的性能工具。首先还是要推荐下面这张图,也就是 Brendan Gregg 整理的性能工具谱图。我在专栏中多次提到过,你肯定也已经参考过。 这张图从

    2023年04月15日
    浏览(83)
  • stm32+AD9910 并口驱动

    搞了好几天DAC芯片AD9910 ,找到多数资料时SPI控制内部RAM或者DDS输出波形,这里总结一下STM32 FMSC 总线输出到AD9910 ,由于AD9910 的PDCLK 为输出,这里采用PWM输入捕获模式获取 AD9910 PDCLK 的下降沿,采用捕获信号触发DMA2  ,DMA 在将数据搬移到总线上,具体代码如下: 使用方法:

    2024年02月13日
    浏览(37)
  • RK3568平台开发系列讲解(调试篇)常见的性能优化手段

    🚀返回专栏总目录 沉淀、分享、成长#

    2023年04月11日
    浏览(85)
  • 用FPGA驱动AD9910输出跳频信号

    虽然AD9910芯片老掉牙了,但是还有人在使用。前段时间一直比较忙,又赶上换工作,没时间写博文。最近才慢慢的闲下来,所以又开始分享一下自己工作中的调试经验。 AD9910是一种直接数字合成器(DDS),具有集成的14位DAC,支持高达1 Gsps的采样率。AD9910采用了先进的专有DDS技

    2024年02月02日
    浏览(43)
  • 【STM32+cubemx】0030 HAL库开发:DDS芯片AD9833实现简单的波形发生器

    大家好,我是学电子的小白白,今天带大家了解一款波形发生器芯片——AD9833。 AD9833是AD公司出品的一款DDS波形发生器,能够产生正弦波、三角波和方波输出。 通俗来讲,DDS是一种把波形预先存储在芯片内部的DAC,只要设置好它的工作频率,就能按这个频率来输出特定的波形

    2024年02月02日
    浏览(47)
  • RK3588开发板的性能参数、功耗及功能特点|飞凌动态讲解

    内容来源:飞凌嵌入式官网-www.forlinx.com 2021年12月16日第六届瑞芯微开发者大会上,瑞芯微发布了全新一代旗舰处理器——RK3588。 相较前一代产品,RK3588的性能提高20%~30%!同时采用新一代8nm制程工艺,也将大幅度降低功耗。这款处理器芯片集成60多亿晶体管,采用8核CPU,8个

    2023年04月08日
    浏览(39)
  • 基于Xilinx K7-410T的高速DAC之AD9129开发笔记(二)

    引言: 上一篇文章我们简单介绍了AD9129的基础知识,包括芯片的重要特性,外部接口相关的信号特性等。本篇我们重点介绍下项目中FPGA与AD9129互联的原理图设计,包括LVDS IO接口设计、时钟电路以、供电设计以及PCB设计。 LVDS数据接口设计 当AD9129作为FPGA外设进行互联设计时,

    2024年01月18日
    浏览(45)
  • DDS信号发生器(stm32+ad9850)

    正点原子精英板、ad9850、杜邦线 https://download.csdn.net/download/qq_45974939/87672298

    2024年02月16日
    浏览(47)
  • AD9208子卡设计资料: 2 路 2.6GSPS/3GSPS AD 采集、2 路 12.6G DA 回放、高性能时钟发生器HMC7044 -FMC 子卡模块

    板卡概述 FMC123 是一款基于 FMC 标准规范,实现 2 路 14-bit、3GSPSADC 采集功能、2 路 16-bit 12.6GSPS 回放子卡模块。该模块遵循 VITA57.1 标准,可直接与 FPGA 载卡配合使用,板卡 ADC 器件采用 ADI 公司的 AD9208 芯片,,与 ADI 公司的 AD9689 可以实现 PIN 脚 兼容。板卡DAC 器件采用 ADI 公司

    2024年02月01日
    浏览(97)
  • AD9208之8通道高速采集

    板卡概述  FMC168 是 一 款 基 于 VITA57.4 标 准 的2GSPS/2.6GSPS/3GSPS 采样率 14 位分辨率 Double FMC+子卡模 块,该模块可以实现 8 路 14-bit、2GSPS/2.6GSPS/3GSPS 采样率模 拟信号采集。该板卡 ADC 器件采用 ADI 公司的 AD9208 芯片,该芯片 与 AD9689 完全兼容,可以实现不同的采样率范围。该板卡

    2023年04月25日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包