大家好,欢迎来到IT知识分享网。
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播放,实现任意波形发生功能。
图1 芯片概述
2.AD9910模块硬件准备
图2 模块概述
模块硬件接口如下
图3 硬件接口图
模块参数如下
图4 参数表
图5 基于STM32F103的控制接口
3.代码讲解与测试参考
(这就是AD9910数据手册首页频率分辨率的由来,细心的小伙伴可能发现了,板子上只有40M晶振,1G主频哪来的,其实是芯片内部倍频来的,例如AD9910板子上是40M,只需要设置25倍频,就是1G了,其他例如AD9854,AD9954等DDS模块差不多都是这样的,板载频率低的晶振,经片内PLL倍频到数百M高频)
图6 频率幅度寄存器
图6
图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};
/ 函数名称 :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~ 出口参数 :无 函数说明 :无 / void AD9910_FreWrite(ulong Freq) {
ulong Temp; Temp = (ulong)Freq * 4.; //将输入频率因子分为四个字节 主频1GHz,32位相位累加器, //故每Hz在的控制字增量 delta = 4. = (2^32)/ 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~,对应频率0Hz~420MHz AD9910_AmpWrite(16383); //写输出幅度最大。范围:0~16383对应峰峰值0mv~800mv(左右)
图8.1 正弦1K双通道测试
图8.2 正弦300M双通道实测
图8.3 正弦420M双通道实测
3.2 AD9910RAM播放功能、三角波方波SINC波(任意波形)如何发生
图9 RAM播放目的地寄存器
图10 RAM播放目的 位码定义
/ 函数名称 :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) / 输出点数 = / (4*M) / 1024 ... ... ... ... }
Init_AD9910(); //AD9910控制脚及寄存器初始化 AD9910_RAM_WAVE_Set(TRIG_WAVE); //设置模块输出三角波TRIG_WAVE:三角波,SQUARE_WAVE:方波,SINC_WAVE:SINC波)
图11 三角波实测
3.3 AD9910数字斜坡发生器实现快速扫频
对于DDS模块来说,扫频是一个常见的应用,AD9910芯片内部也集成了自动扫频功能,我们只需设置好参数(下限频率,上限频率,上扫频频率步进,下扫频频率步进,上扫频频点维持时间,下扫频频点维持时间),模块即可按参数自动输出。
//设置数字斜坡频率扫频,并使能自动双向扫频 AD9910_DRG_FreInit_AutoSet(ENABLE); //ENABLE,自动扫频,无需外加控制;DISABLE,手动扫频,由DRCTL引脚控制扫频 // 设置(下限频率,上限频率,上扫频频率步进,下扫频频率步进,上扫频频点维持时间,下扫频频点维持时间) AD9910_DRG_FrePara_Set(, , 100, 100, 100,100);//慢速扫频,方便观察, 约800mS,扫频时间计算参考函数注解 AD9910_DRG_FrePara_Set(, , , , 100,300);//高速扫频,400K~300M,约263uS,扫频时间计算参考函数注解 //上扫频每点维持100个控制字时间,下扫频每点维持300个控制字时间, //实际可以将该参数设置到更小,可以获得极高的扫描速度
图12 扫频实测
4.AD9910开发注意点
1、AD9910有两个输出通道,在3.1的最后,我们也说了AD9910可以实现调相功能,但这并不意味着两个输出通道的相对相位是可调的。实际上这两个通道相位差是固定的,180度,前面说的相位,是指正弦波开始输出时相位所在位置,比如从0度开始发生,80度开始发生等。
3、上述功能都提供了比较详细的代码
图13 资料截图
5.部分资料下载
仅供参考(百度网盘):AD9910部分资料 提取码:KVDZ
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/111836.html





