DDS器件原理与应用(AD9833 AD9834)

news2025/5/18 9:19:30

1、DDS模块的主要构成

DDS模块原理框图

2、DDS器件的工作原理

直接数字合成是生成模拟信号的一种常用方法,简单意义上的DDS,主要由相位调制器、波形查找表和DAC组成。相位调制器产生一个相位信息,使用该相位信息去波形查找表中查找对应的幅值信息,将幅值送DAC,产生对应的模拟信号,这就是DDS的工作原理。相位调制器一般由相位累加器和相位偏移器组成,先说相位累加器,看图,上半部分为幅值图,下半部分为相位图。

3、DDS内部模块介绍

相位累加器:是DDS的核心组成部分,用于实现相位的累加,并输出相应的幅值。相位累加器由M位宽加法器和M位宽寄存器组成,通过时钟控制,将上一次累加结果反馈到加法器输入端实现累加功能,从而使每个时钟周期内的相位递增数为\Delta Phase,并取相位累加结果作为地址输出给ROM查找表部分。DDS的相位信息被存放在累加寄存器中,虽然幅值和相位不是线性关系,但寄存器累加值和相位可以是线性关系,很容易用寄存器的累加值表达相位信息。由于累加寄存器的位数是固定的,累加操作从0开始直至寄存器溢出,对应的相位信息是有限个数,相位对应的幅值信息也是有限个数,对于DDS而言,一种比较高效的方法是,将相位信息和幅值信息制作成查找表,根据累加寄存器的值,去波形查找表中查询对应的DAC数值,送到DAC中产生需要的电压信号。这里需要注意,为了降低系统误差,累加器的位数一般大于DAC的位数。

相位偏移器:一般情况下累加器的值是从0开始加的,输出波形的相位也是从0开始的;如果我想要输出信号的相位从90°开始,需要增加一个偏移,从相位累加器取出当前相位+相位偏移器的偏移相位,结果再送波形查找表,即可获得偏移后的幅值信息,DAC就可以输出偏移后的波形了。这个相位偏移值就是原理框图中相位字输入P_WORD。

幅值查找表:属于原理框图中的波形数据表ROM的内容,存储着每个相位对应的二进制数字幅度。在每个时钟周期内,查找表对相位累加器输出的相位地址信息进行寻址,然后输出对应的二进制幅度数字离散值。

假设查找表地址为M位,输出数据位N位,则查找表的容量大小位2^M*N。不难看出,输出信号的相位分辨率为2π/2^M。比如查找表的地址是4位,地址列表与相位列表对应关系:

DAC转换器:将数字信号转换为模拟信号。实际上DAC输出的信号并不是连续的,而是根据每位代码的权重,将每一位输入的数字量进行求和,然后以其分辨率为单位进行模拟的输出。实际输出的信号是阶梯状的模拟线型信号,所以要对其进行平滑处理,一般使用滤波器滤波。

4、DDS器件输出波形的频率

正弦波通常用其幅度来表示: a(t) = sin(ωt) ,其中ω = 2πf。

时间推进∆t,相位的改变量\Delta Phase就是:

\Delta Phase =\omega * \Delta t

因为\omega =2\pi f,所以上面的等式可以变换成如下: 

\omega =\frac{\Delta Phase }{\Delta t} =2\pi f

由于DDS是时钟驱动的,时间t以固定间隔\Delta t前进这个时间间隔\Delta t就是DDS器件的工作时钟间隔,DDS器件的工作时钟频率就是f_{MCLK},  时间与频率的关系大家应该都知道吧,

f_{MCLK} = 1/\Delta t

所以等式 \omega =\frac{\Delta Phase }{\Delta t} =2\pi f,可以写成

\omega =\Delta Phase * f_{MCLK}=2\pi f

在上式中,f就是DDS器件输出信号的频率,f_{MCLK}是DDS器件工作的时钟频率,整理等式可以得出DDS器件输出信号的频率f

f = \Delta Phase * f_{MCLK}/2\pi

DDS器件工作的时候,f_{MCLK}是确定的,只要确定\Delta Phase,就能确定DDS器件输出信号的频率。

那么问题来了,DDS器件如何确定这个\Delta Phase

拿正弦波来说,根据常识,正弦波的周期是2\pi,相位角的变换范围也是0--2\pi。假设DDS器件中存在一个28位的寄存器(好巧不巧,DDS器件里面就有那么一个28位的相位累加器),用寄存器里面的值来代表相位角,怎么个代表法?

28位的寄存器,它的取值范围就是0 -- 2^28-1,最大值就是2^28-1,我们用REG_{max}代替,所对应的相位角范围就是0 -- 2\pi,这个寄存器的值怎么变化就是关键了,DDS是数字器件,需要数字时钟的驱动,每来一个时钟脉冲,这个28位的寄存器值就增加一下,增加\Delta REG,那么就可以这么理解了

\Delta Phase =\frac{2\pi }{REG_{max}} *\Delta REG

结合公式f = \Delta Phase * f_{MCLK}/2\pi,可以得出:

f = f_{MCLK} * \Delta REG/REG_{max}

DDS器件的REG_{max}是个确定的值,因为器件设计好之后,这个寄存器的位数就是确定的,这就说明DDS器件的输出信号频率,只与DDS器件的工作时钟f_{MCLK}和寄存器数值的单位增量\Delta REG相关,DDS器件在工作的时候工作时钟频率f_{MCLK}是确定的,只要改变\Delta REG的值就可以改变DDS器件输出信号的频率。

需要输出某个频率就设置\Delta REG的值,

\Delta REG=f * REG_{max}/ f_{MCLK}

这个\Delta REG也就是原理框图中要输入的频率字F_WORD。

5、重难点理解

频率控制字:也叫做频率字,简称Fword,就是每输入一个Fword,就输出对应的频率

这个Fword就是相位累加器每次加的值\Delta REG,如果一个正弦波的峰峰值可以用256个点表示,那么一个周期需要512(2^9)个点来表示,故相位累加器的位宽要大于9,我们只需要将高9位作为ROM的输入地址,低位作为累积量。

假设相位累加器是16bit位宽,因此高9位作为ROM的地址输入。如果我们要得到这个假设系统的基频,则需要每个时钟沿都对ROM的地址加1,

即16位相位累加器的第7位+1,则输入的控制字为Fword为1000_000,

产生的基频为50M/512 = 97656.25Hz,其中512是ROM的深度,也是2^16循环计数一次的个数,其取值为2^16/Fword。

所以输出频率Fout可用公式表示为Fout=50M/(2^16/Fword)。

假设系统频率为Fclk,相位累加器的位宽为N,则Fout=(Fclk*Fword)/2^N。我们可以通过设置不同频率控制字Fword大小来调节输出的正弦波频率。

相位控制字:相位控制字也叫相位字,就是输出信号的初始相位角,默认情况下相位角是从0开的,但如果我们想让相位角从90°开始,就写入一个相位偏移值,这相位偏移值就是相位字.

4、AD9833介绍

  AD9833是一个完全集成的直接数字频率合成(DDS)芯片。该芯片需要一个参考时钟、一个精密低电阻和八个去耦电容,以用数字方式产生高达37.5 MHz的正弦波。除产生这个RF信号之外,该芯片还完全能支持各种简单和复杂的调制方案。这些调制方案完全在数字域内实现,使得可以使用DSP技术精确而轻松地实现复杂的调制算法。

  AD9833的内部电路包含以下主要部分:数控振荡器(NCO)、频率和相位调制器、 SIN ROM、 DAC、比较器以及稳压器。
  

  数控振荡器和相位调制器

  该子电路由两个频率选择寄存器、一个相位累加器、两个相位偏移寄存器和一个相位偏移加法器组成。

  NCO的主要元件是一个28位相位累加器。

  连续时间信号的相位范围为0 至2 π。在此数值范围之外,正弦函数以周期方式不断重复。

  数字实现并无差别。累加器只是将相位数值范围扩大至多位数字字。

  AD9833中的相位累加器利用28位来实现。因此,在AD9833中, 2π 最多可以分成 2^28份。

  同样, \Delta REG项也会扩大至此数值范围: 0 < \Delta REG< 2^28 

  将这些代入前面的公式可得:f = f_{MCLK} * \Delta REG/2^{28}

\Delta REG的最小值是1,因为数字寄存器里面最小的增量就是1,当\Delta REG最小的时候,频率的分频率最大,为f_{MCLK} /2^{28}

如果f_{MCLK} = 1MHz,那么频率分辨率就是1M/2^28 = 0.0037Hz(手册上写的0.004Hz);

如果f_{MCLK} = 5MHz,那么频率分辨率就是5M/2^28 = 0.0186Hz;

如果f_{MCLK} = 10MHz,那么频率分辨率就是10M/2^28 = 0.0371Hz;

如果f_{MCLK} = 25MHz,那么频率分辨率就是25M/2^28 = 0.093Hz(手册上写的0.1Hz);

可见DDS器件的工作频率越高,输出信号的频率分辨率越低。

  相位累加器的输入可以从FREQ0寄存器或FREQ1寄存器进行选择并由FSELECT引脚或FSEL bit控制。

  NCO本身会产生连续相位信号,因此在频率之间切换时应避免出现任何输出不连续。

SIN ROM

  要使用NCO的输出,必须先将其从相位信息转换成正弦数值。  

  数字相位信息用作查找表的地址并将相位信息转换成幅度。

5、AD9833编程

本示例的目的是使用MCLK=1MHz的AD9833产生1kHz输出频率。

结合公式f = f_{MCLK} * \Delta REG/2^{28} , \Delta REG就是需要写入频率寄存器中的值FreqReg FreqReg=\Delta REG=F_{out} * 2^{28}/ f_{MCLK}

本实例DDS器件的工作频率为1MHz,要输出频率为1000Hz的正弦波:

FreqReg  = 1000Hz * 2^28 / 1MHz  = 268435.456 = 268435 = 0x41893;

用C语言实现可以是这样的:

float temp = (float)(1<<28)/FMCLK;
CurFreqReg = (u32)(Frequency * temp); //CurFreqReg就是要设置的频率寄存器的值

要想控制AD9833,就得了解他的控制寄存器CONTROL REGISTER。

AD9833可以通过SPI总线来控制,控制位是在时钟f_{MCLK}的下降沿采样,所以SPI通讯的配置要注意极性。

控制AD9833主要就是控制频率和相位。

控制寄存器介绍

AD9833的控制寄存器一共有16位,

写着0的表示这些位不能用,比如DB15、DB14、DB9、DB4、DB2、DB0都是不用的位。

BIT13:B28,与28位频率寄存器相关

BIT12:HLB,把28位频率寄存器看成两个独立的14位寄存器,HLB就是控制往哪个寄存器写数据,是低14位还是高14位

如果让B28 = 1,那么这个28位的频率寄存器的值需要两次连续的写数据,第一次把低14位(14 LSB)的数据写入,第二次把高14位(14 MSB)的数据写入;需要等两次都成功写入之后,数据才生效。

如果让B28 = 0,那么这个28位的频率寄存器可以看成两个独立的14位寄存器,可以单独的写低14位的数据,或者高14位的数据;但这个操作需要BIT12:HLB的配合才能完成,HLB = 1,表示独立写高14位的数据,HLB=0,表示独立写低14位的数据。

这里还有一个问题,不管寄存器的高14位和低14位是否独立,我们写数据都是14位的,这怎么写?一个字节8位,两个字节就是16位,多余的2bit怎么办?放心,有安排,每次写数据的时候,除了那14位的数据,前面的2bit用来表示往那个频率寄存器里面写数据,AD9833和AD9834都是有两个频率寄存器的FREQ0和FREQ1。

比如,把28位寄存器不分开,那就需要连续写两条数据,先写低14位的数据,再写高14位的数据。比如把数据0xFFFC000写到FREQ0

1、先写0x2000命令(仅仅是为了把BIT13,也就是B28设置为1);

2、再写数据0x4000(把数据0xFFFC000的低14位写到FREQ0),

        0x4000 = 0100 0000 0000 0000,共16bit,前面两个bit01表示把数据写到FREQ0,后面的14bit才是数据;

3、接着写数据0x3FFF(把数据0xFFFC000的高14位写到FREQ0),

        0x3FFF = 0111 1111 1111 1111,共16bit,前面两个bit01表示把数据写到FREQ0,后面的14bit才是数据。

BIT11:FSELECT,频率寄存器选择,选择哪个频率寄存器用于相位累加器。

BIT10:PSELECT,相位寄存器选择,选择哪个相位寄存器用于相位累加器

BIT8:RESET=1,复位,内部寄存器复位为0,模拟输出为中量程。

        复位是将某些寄存器的值设置为0;

        模拟输出设置位中量程;

        复位对相位、频率、控制寄存器不起作用;

        当AD9833上电之后,就需要复位;

        复位之后,等待8个MCLK时钟周期,DAC将有信号输出;

 

复位AD9833

void AD9833_Reset(void)
{
	write_ad9833_d16(0x0100); //复位AD9833
}

 往AD9833里写数据

void write_ad9833_d16(u16 word)
{
	u8 TempBuf[2];
	XSpiPs_SetSlaveSelect(&SpiInstance_dds, SLAVE_SELECT_1);

	TempBuf[0] = (word)>>8;
	TempBuf[1] = (word)&0xff;

	XSpiPs_Write(&SpiInstance_dds, TempBuf, RecvBuffer, 2);
}

设置输出频率

void AD9833_SetFreqValue(float Frequency)
{
	// 通过改变频率字来改变频率
	float temp = (float)(1<<28)/FMCLK;
	CurFreqReg=(u32)(Frequency * temp);
}

把参数写进AD9833

void AD9833_SetWaveData(void)
{
	u16 FRQLW = 0;    // MSB 频率字的低14位
	u16 FRQHW = 0;    // LSB 频率字的高14位

	float temp = (float)FMCLK/(1<<28);
	float freq = (float)CurFreqReg * temp;

	printf("The Current Freq is: %.4f Hz\n",freq); //打印当前频率

	FRQHW=(int)((CurFreqReg & 0xFFFC000) >> 14); // 获取频率字的高14位数据
	FRQLW=(int)(CurFreqReg & 0x3FFF);  // 获取频率字的低14位数据
	FRQLW |= 0x4000; //14位数据前面添加两位,01,表示频率寄存器0, 10表示频率寄存器1
	FRQHW |= 0x4000;

	write_ad9833_d16(0x2000); //选择数据一次写入
	write_ad9833_d16(FRQLW); //L14,先写低14位的数据,器件就是这么规定的
	write_ad9833_d16(FRQHW); //H14,再写高14位的数据
	write_ad9833_d16(0x2000); //芯片进入工作状态,寄存器频率0输出1KHz波形
	//write_ad9833_d16(0x2028); // 输出方波
}

到这里AD9833和AD9834就可以用起来了,后面有机会再继续深入展开,也欢迎有兴趣的伙伴一起来探讨做一些小产品。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/944740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧安全3.0这两年:数智破冰 护航千行百业安全发展

数智化时代下&#xff0c;网络安全作为网络强国、数字中国的底座&#xff0c;是我国现代化产业发展中不可或缺的部分。在安全实战上&#xff0c;传统的基于边界防护&#xff0c;单次静态安全策略配置的安全措施已无法满足业务发展的安全需求&#xff0c;真正的安全防护必须是主…

如何使用敏捷开发方法管理项目

敏捷开发方法是一种灵活且高效的项目管理方法&#xff0c;旨在应对不断变化的需求和快速发展的项目环境。使用敏捷开发方法可以帮助团队更好地应对不确定性&#xff0c;提高项目的质量和效率。以下是使用敏捷开发方法管理项目的具体步骤&#xff1a; 明确项目目标和范围 在项…

2023 天府杯“ 室温超导+可再生能源应用国赛预测模拟专题赛“——参考代码答案与解析

室温超导材料在可再生能源传输中的应用研究 题目要求&#xff1a; 假设某国家有多个可再生能源发电站点&#xff0c;分布在不同的地理位置。每个发电站点产生的能量大小和时间段都有所不同。同时&#xff0c;假设已经研发出室温超导材料 LK-6&#xff0c;LK-66&#xff0c;L…

A卡崩溃有救了 AMD推出RGD专用工具:找出报错原因

现在的三大显卡GPU厂商中&#xff0c;谁家的显卡好争议不断&#xff0c;粉丝不仅争硬件性能&#xff0c;软件驱动也是容易被诟病的地方&#xff0c;AMD显卡这方面就吃过亏&#xff0c;好在AMD这次推出了一个RGD工具&#xff0c;可以找出显卡崩溃的原因。 AMD日前发布了一个Rade…

智慧高速领域数字孪生应用思考及实践

近些年&#xff0c;国家和相关部委陆续发布多项政策指导智慧公路建设&#xff0c;逐步制定相关建设标准规范&#xff0c;加快推动全国公路数字化、智能化、协同化升级。对于智慧高速的发展探索在这几年不停提出各类创新性的技术手段&#xff0c;并且进行了局部的试点和示范性应…

高等职业学校物联网实训室建设方案

一、概述 1.1专业背景 物联网&#xff08;Internet of Things&#xff09;被称为继计算机、互联网之后世界信息产业第三次浪潮&#xff0c;它并非一个全新的技术领域&#xff0c;而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升&#xff0c;是随着传感网、通…

..\SYSTEM\delay\delay.h(20): error: #18: expected a “)“

在KEIL中有时编译过程中会出现下面这样的错误。 明明代码里面并没有缺少小括号&#xff0c;但是就是找不到错误。 真正的原因是因为 在20行的地方形参 SYSCLK 与系统的中某个文件的宏名字相同导致这样的问题。 解决方案&#xff1a; 把函数的形参随便修改下就OK了。

危险的套娃:攻击者在 PDF 文件中隐藏恶意Word 文档

据BleepingComputer消息&#xff0c;日本计算机紧急响应小组 (JPCERT) 日前分享了在2023 年 7 月检测到的利用PDF文档的新型攻击——PDF MalDoc攻击&#xff0c;能将恶意 Word 文件嵌入 PDF 来绕过安全检测。 JPCERT采样了一种多格式文件&#xff0c;能被大多数扫描引擎和工具识…

详解JS 和CSS 代码利用率统计利器Coverage以及高版本chrome中coverage的一个致命问题

在做前端性能测试时较大的文件需要更多时间来下载&#xff0c;并可能导致我们的网站加载缓慢&#xff0c;从而导致用户体验欠佳。因此删除JS和CSS中未被使用的代码就很有必要了&#xff01;Coverage工具就可以非常方便的实现这一需求。 Coverage使用方法 Coverage 是chrome开…

已知两地经纬度,计算两地直线距离

文章目录 1 原理公式2 代码实现2.1 JavaScript2.2 C2.3 Python2.4 MATLAB 1 原理公式 在地球上&#xff0c;计算两点之间的直线距离通常使用地理坐标系&#xff08;例如WGS84&#xff09;。计算两地直线距离的公式是根据经纬度之间的大圆距离&#xff08;Great Circle Distanc…

C语言练习题解析:挑战与突破,开启编程新篇章!(1)

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言刷题专栏&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅C语言进阶之路&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐&a…

正则表达式 之 断言详解

正则表达式的先行断言和后行断言一共有 4 种形式&#xff1a; (?pattern) 零宽正向先行断言(zero-width positive lookahead assertion)(?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion)(?<pattern) 零宽正向后行断言(zero-width positive lookb…

QML Book 学习基础5(An Image Viewer)

目录 桌面版&#xff08;win端&#xff09; 移动端 下面我们用更有挑战性例子来使用Qt控件&#xff0c;将创建一个简单的图像查看器。 桌面版&#xff08;win端&#xff09; 程序主要由四个主要区域组成&#xff0c;如下所示。菜单栏、工具栏和状态栏&#xff0c;通常由控件…

ApiPost软件会对数据进行预处理,有可能会导致数据报错

文章目录 测试数据正确的请求方式当URL有数据被修改之后&#xff08;数据就不一致了&#xff09; 测试数据 %257B%2522pageNum%2522:1,%2522pageSize%2522:10,%2522param%2522:%257B%2522flowType%2522:1,%2522workcardType%2522:%2522作者的请求方便大家一键复制 localhost:…

记录windows7无权安装

项目场景&#xff1a; electron 安装程序 windows上的C盘 progrom files 、 问题描述 安装过程中出现 不能打开写入文件 提示如上。 { "name": "intergeOM-goldwind","version": "1.0.0","author": "weile",&q…

事业单位D类 — — 理论攻坚-主题班会

一、书写模版 &#xff08;一&#xff09;活动主题 1.书写模板 &#xff08;1&#xff09;&#xff08;主动学习&#xff09;&#xff0c;从我做起/我能行&#xff1b;做&#xff08;环保、诚信&#xff09;卫士/标兵&#xff1b;&#xff08;网络安全、诚信&#xff09;伴…

RealVNC配置自定义分辨率(AlmaLinux 8)

RealVNC 配置自定义分辨率&#xff08;AlmaLinux8&#xff09; 参考RealVNC官网 how to set up resolution https://help.realvnc.com/hc/en-us/articles/360016058212-How-do-I-adjust-the-screen-resolution-of-a-virtual-desktop-under-Linux-#standard-dummy-driver-0-2 …

Linux操作系统的基本配置操作

Linux操作系统的基本操作 一、和网络有关的Linux操作二、网络如果修改完成&#xff0c;需要重启Linux的网卡服务三、在Linux上还有一个网络服务NetworkManagaer四、Linux上还有一个服务叫做firewalld&#xff08;防火墙的服务&#xff09;五、Linux安装的节点服务器我们一般都是…

数据结构体--5.0图

目录 一、定义 二、图的顶点与边之间的关系 三、图的顶点与边之间的关系 四、连通图 五、连通图的生成树定义 一、定义 图&#xff08;Graph&#xff09;是由顶点的又穷非空集合合顶点之间边的集合组成&#xff0c;通常表示为&#xff1a;G&#xff08;V&#xff0c;E&…

中国知网账号包月多少钱?怎样知网包月最划算

中国知网是我们在查找下载论文资料时常用的中文数据库&#xff0c;也是全球最大的中文数据库之一。那么&#xff0c;中国知网是否可以包月使用呢&#xff1f;包月费用又是多少呢&#xff1f;如何包月最划算呢&#xff1f;下面本文将为您一一解答。 一、中国知网可包月使用吗&a…