[技术讨论] [DDS] AD9833原理介绍及chiliDDS驱动分享(上)

article/2025/10/18 22:12:01

其实本文还有另一标题:AD9833调不通?看这篇**就够了》
总觉字里行间隐隐霸气外露,不符合作者低调的风格,于是换了个朴素标题。标题狂不狂暂且不评,作者水平有限却是个事实;看到这篇**是你我缘分,人人境遇本不同,不敢打包票能解决各位的疑惑,但希望对大家有所帮助是作者的初衷。

本文内容丰富,分上下两篇更新,主要内容如下:
1.DDS核心部分及其工作原理梳理,回答DDS是什么,怎么工作?
2.AD9833芯片介绍和上手指南,回答AD9833芯片特点,内部结构,非编程的注意事项;
3.chiliDDS驱动介绍,作者自己写的驱动,简单易用包教会,AD9833调不通?不存在的!

本帖侧重内容1和内容2,内容3稍有涉及,并将在下一篇详细讨论。**内容是作者团队实践经验的反思总结,文中图片若无标注,均为原作。驱动好不好使,先上个图大家评价评价。

写本文前我反复考虑了**结构,还是决定按照以下三步走:DDS基础,AD9833使用指南,chiliDDS驱动程序介绍。以下是正文部分:

 

DDS简要基础


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

我们知道,对于简单正弦函数,幅值A和相位φ不是线性关系,通过相位φ求幅值A,需要经过A=sin(φ)的三角运算;用MCU直接算吗?使用MCU进行三角函数计算的时间开销相对较大,对于频率较高的DDS,略显力不从心,实际DDS中也不是这么搞的。DDS的相位信息被存放在累加寄存器中,虽然幅值和相位不是线性关系,但寄存器累加值和相位可以是线性关系,很容易用寄存器的累加值表达相位信息。

由于累加寄存器的位数是固定的,累加操作从0开始直至寄存器溢出,对应的相位信息是有限个数,相位对应的幅值信息也是有限个数,对于DDS而言,一种比较高效的方法是,将相位信息和幅值信息制作成查找表,根据累加寄存器的值,去波形查找表中查询对应的DAC数值,送到DAC中产生需要的电压信号。这里需要注意,为了降低系统误差,累加器的位数一般大于DAC的位数。

相位偏移器又是什么呢?一般情况下累加器的值是从0开始加的,输出波形的相位也是从0开始的;如果我想要输出信号的相位从90°开始,需要增加一个偏移,从相位累加器取出当前相位+相位偏移器的偏移相位,结果再送波形查找表,即可获得偏移后的幅值信息,DAC就可以输出偏移后的波形啦。流程可见下图:

这里部分朋友可能会产生疑问,相位累加器的原理已经明白了,但频率如何调节?这需要一点数学工具,请看公式推导:

对于简单正弦函数,有:

f(t)=sin(ω*t)=sin(2π*f*t)

此处ω*t是三角函数的角位移,范围在0~2π可以表示为φ=ω*t=2π*f*t

由于DDS是时钟驱动的,时间t以固定间隔t前进设时钟计数为τt=∆t*τ,所以有如下等式:

φ=2π*f*t*τ

对特定的DDS系统,t由驱动时钟的频率确定,设该时钟频率为fm,则t=1/fm,于是有:

φ=2π*f/fm*τ

在上式中,f是系统输出信号的频率,fm是系统的时钟频率,我们把输出频率f放到左边,对等式进行整理:

f=fm*(φ/2π)*(1/τ)

现在考虑φ在DDS中的表示方式,假设DDS系统中存在一个28bit的寄存器,数值范围应为0~(2^28-1),为方便表述,将寄存器的最大值用max来表示,则0~max对应角度范围0~2π,因寄存器中的数值是离散的,设寄存器数值的单位增量为reg设累加次数为τ,有:φ=2π/max*reg*τ带入f的表达式,有:

f=1/max*fm*reg

这个结论太棒了,它表明DDS的输出频率仅和系统的时钟频率fm寄存器数值的单位增量reg有关,在确定DDS的系统时钟后,通过调整reg,即可实现频率调节!但是单位增量reg看不见摸不着,怎么调它?最简单的做法是,对外暴露一个接口接收目标频率参数f,在系统内设置reg=f*max/fm,这样输出信号的频率和编程写入的频率就一致了。


 

AD9833使用指南


先盘一下AD9833的特性,
输出频率:0~12.5MHz(12.5MHz在时钟25MHz时达到);
工作电压:2.3V~5.5V(最大不超过6V);
通信方式:三线SPI(最大通信速率40MHz);
输出波形:正弦、三角、方波;也可软件控制输出复杂波形;
其他特性:睡眠模式(唤醒时间1ms)、脉冲直接输出、DAC关断等。
关于焊接:回流焊温度不应超过220℃!

使用前必知(最重要的3点!):
1.AD9833是单电源DDS,输出信号没有负电压!2.输出电压最大值为650mV,不是供电电压!3.输出电压最小值为38mV,不是0!

引脚接线方式直接上图比较清晰:

特殊引脚的作用及布线:
1.COMP         DAC的偏置引脚,用于退耦DAC的偏置电压,经10nF电容连接到VDD;
2.CAP/2.5V    内部2.5V稳压器的退耦电容,100nF到DGND;若VDD≤2.7V,将该引脚连接到VDD使内部稳压器旁路;
3.MCLK         外部时钟输入,该时钟的质量将直接影响DDS的频率精度和相位噪声;
4.FSYNC        通信同步引脚,通信开始时,需将该引脚拉低;
5.AGND         模拟地,若没有专用的模拟地,可通过一个0Ω电阻跨接数字地;
6.VOUT         模拟信号输出引脚,内部可选200Ω负载接地;

AD9833通信约定:
数据以一个16位字的形式,通过SPI传送到AD9833;通信开始前需将同步引脚拉低,且同步引脚拉低时时钟线SCLK应为高电平;
数据可一次传输一个字,传输完成后将同步引脚拉高结束通信;也可一次传输多个字,传输时保持同步引脚为低电平,直至多个字传输完成后拉高。

AD9833内部结构,先上图:

(该图截自AD9833数据手册,彩色是我后标上去的)

标记1:频率寄存器部分
AD9833拥有两个频率寄存器,分别为FREQ0和FREQ1;因此可以配置两个不同的频率,可通过设置激活其中一个;
标记2:相移寄存器部分
AD9833拥有两个相移寄存器,分别为PHASE0和PHASE1;因此可以配置两个不同的相移,可通过设置激活其中一个;
标记3:12位地址截断
图中的/12标记可能让部分新手疑惑。因为相位调制器的位数是28位,若全部对应到波形查找表中,将需要一个地址宽度为28bit的查找表ROM,这是非常惊人的。事实上,因为AD9833的DAC只有10位精度,28bit查找表无法被充分使用;通过将28bit的地址截断为12bit,可以减小查找表ROM容量,只要截断带来的误差小于DAC的分辨率,就不会影响到DDS的性能。
标记4:MSB直接输出
通过将DAC的MSB以数字直接输出的形式输出到VOUT引脚,可以得到方波,内建的2分频通道可将输出频率降低到原来的1/2。
标记5:控制寄存器
一个16位的控制寄存器,详细操作方法将结合chiliDDS在下一篇**中详细讨论。

那么chiliDDS是怎样的驱动呢?
驱动移植,仅需实现两个宏一个SPI初始化和一个SPI发送函数

/************************************************************** FSYNC_HIGH and FSYNC_LOW are used as CS signal to AD9833. ** A GPIO pin with level control can be used here.           ** This two macro must be implemented.                       **************************************************************/#define FSYNC_HIGH /* Add Code Here */#define FSYNC_LOW  /* Add Code Here *//************************************************************** @brief: The initialization of Hardware SPI,which is       **          specified by the MCU used.If software SPI        **          is used,ignore this function.                    ** @param: None                                              ** @retval: None                                             **************************************************************/static void chilis9833_SPI_Init(void){/* Add Code Here */}

使用时,仅需调用4个函数:

chilis9833_Init();    //AD9833初始化chilis9833_Write_Freq_2Bytes(REG_WRITE_FREQ0, 2500);    //设置频率chilis9833_Write_Phase(REG_WRITE_PHASE0, 0);    //设置相移chilis9833_Output_Mode(CMD_SELECT_FREQ0, CMD_SELECT_PHASE0, CMD_OUTPUT_SINUSOIDAL);    //激活频率和相移寄存器,设置输出波形

下图是上段代码的实际效果展示,输出信号已经过运算放大器放大:

结合AD9833,chiliDDS驱动将在下一篇**中开源并做详细介绍。感兴趣的朋友请留言评论,大家一起讨论吧!
---------------------
作者:Litthins
链接:https://bbs.21ic.com/icview-3131354-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 


http://chatgpt.dhexx.cn/article/4NqYSSS7.shtml

相关文章

ADC0832的使用

百度搜索ADC0832 Datasheet便可以免费获取该芯片的权威数据手册。 最重要的是查看它的时序及对应英文词组的意思。 CLK为时钟信号,需要外部输入,可直接与单片机引脚相连 Chip Select(CS):从Timing图中可以看出芯片工作期间要保持…

ADC0832的AD模数转换原理及编程

✅作者简介:嵌入式领域优质创作者,博客专家 ✨个人主页:咸鱼弟 🔥系列专栏:单片机设计专栏 目录 一、描述 二、模数转换原理: 三、模数转换的过程: 四、八位串行A/D转换器ADC0832简介&…

ADC0809的使用

一、前言介绍 使用ADC0809对一个模拟电压进行转换转换后的电压使用数码管显示出来 二、ADC0809的介绍 1、ADC0809简介 ADC0809是采用COMS工艺制造的双列直插式单片8位A/D转换器。分辨率8位,精度7位,带8个模拟量输入通道,有通道地址译码锁…

基于STM32F103RCT6的AD9833驱动开发(代码可以免费发邮箱)

基于STM32F103RCT6的AD9833驱动开发(代码可以免费发邮箱) AD9833手册分析 管脚定义: 手册就先讲到这里,不明白的欢迎评论区留言,另外我会把代码还有手册一并发送给感兴趣的朋友。 AD9833典型应用电路&#x…

AD9833数字信号发生器模块

简 介: 本文记录了使用快速制版测试AD9833这款数字信号发生器的内容。 关键词: AD9388,数字信号发生,快速制版 基于AD9833的正弦波,三角波,方波频率发生模块可以通过ZIGBEE来完成输入输出控制。其中还包括有…

STM32驱动AD9833模块

STM32驱动AD9833模块 前言软硬件准备一、本次使用的硬件二、代码 链接 前言 淘宝上买了个AD9833模块,stm32用商家的例程代码可以调频,可以调相,就是调不了幅度。换了几块不同32开发板都不行,重新以正点原子F103的工程为基础把驱动…

AD9833信号波形谐波

AD9833产生高频信号的谐波 ~ AD9833是一款AnalogDevices公司提供的数字信号可编程信号发生器芯片。它一般配有外置的主时钟信号,每次时钟信号将将内部28位的相位累加器递增一个相位数值。该相位数值由芯片SPI串口被外部的MCU设置。 相位累加器的高12位选择内部4096…

51驱动AD9833

使用51驱动AD9833模块的使用 关于AD9833相关参数程序流程代码片上传程序总结 原文链接:https://www.yourcee.com/newsinfo/2925703.html 关于AD9833 AD9833是一款低功耗、可编程波形发生器,能够产生正弦波、三角波和方波输出。各种类型的检测、信号激励…

Arduino + AD9833 波形发生器

Arduino SI5351 方波发生器_姜戈12的博客-CSDN博客SI5351 方波发生器https://blog.csdn.net/jiangge12/article/details/125815044 感觉 Si5351 只有方波还是少点意思。 看到有人做 AD9833 ,成品卖355元。https://www.bilibili.com/video/av463721457/ 上面视频…

[技术讨论][DDS] AD9833原理介绍及chiliDDS驱动分享(上)

其实本文还有另一标题:《AD9833调不通?看这篇**就够了》 总觉字里行间隐隐霸气外露,不符合作者低调的风格,于是换了个朴素标题。标题狂不狂暂且不评,作者水平有限却是个事实;看到这篇**是你我缘分&#xff…

STM32单片机TFT显示AD9833 DDS信号发生器语音播报正弦波方波三角波

实践制作DIY- GC0146---TFT显示AD9833 DDS信号发生器 基于STM32单片机设计---TFT显示AD9833 DDS信号发生器 二、功能介绍: 硬件组成:STM32F103C系列最小系统板 1.8寸TFT彩屏AD9833信号模块4*4矩阵键盘DY-SV17F语音播报模块 1.通过4*4键盘来设定频率值和…

失真很大的波形发生器AD9833

波形发生器AD9833 01 波形发生器 一、AD9833 AD9833是一款AnalogDevices公司提供的数字信号可编程信号发生器芯片。 它一般配有外置的主时钟信号,每次时钟信号将将内部28位的相位累加器递增一个相位数值。 该相位数值由芯片SPI串口被外部的MCU设置。  相位累加器…

【STM32+cubemx】0030 HAL库开发:DDS芯片AD9833实现简单的波形发生器

大家好,我是学电子的小白白,今天带大家了解一款波形发生器芯片——AD9833。 AD9833是AD公司出品的一款DDS波形发生器,能够产生正弦波、三角波和方波输出。 1)什么是DDS 通俗来讲,DDS是一种把波形预先存储在芯片内部的…

2.电赛进行时......(AD9833(DDS)模块的学习使用)

文章目录 前言一、DDS是什么(信号发生器)?二、AD9833模块介绍1.概述2.模块移植3、效果展示![在这里插入图片描述](https://img-blog.csdnimg.cn/2b0d29939275403f9248339c894965a0.png#pic_center) 前言 如果是玫瑰,它总会开花的…

AD9833介绍与应用(C语言实现)

1.特性 低功耗、可编程波形发生器,能产生正弦波、三角波和方波的输出; 主频时钟为25MHz时,可实现0.1Hz的分辨率;主频时钟为1MHz时,可实现0.004Hz的分辨率; 三线式串行接口(SDATA、SCLK、FSYNC)写入数据&a…

2021电赛预测—手把手带你玩转DDS模块AD9833

1、电赛预测 摘要:原定于7月28日才发布的器件清单,提前2天在26号就发布。感觉大家现在应该猜题预测,与其猜题,还不如静下心来做题。盲目猜题是没有必要的,熟悉相关器件倒尤为重要。不要到处去水群聊天,听风…

幻方....

c语言上机。。。。 c写的幻方。 1 /*************************************************************************2 > File Name: code/class/7.c3 > Author: 111qqz4 > Email: rkz2013126.com 5 > Created Time: 2015年11月11日 星期三 19时31分5…

Unity脚本生命周期流程图

转载自【无幻】:http://blog.csdn.net/akof1314/article/details/39323081 渲染 OnPreCull: 在相机剔除场景之前调用此函数。相机可见的对象取决于剔除。OnPreCull 函数调用发生在剔除之前。 OnBecameVisible/OnBecameInvisible: 在对象对于相机可见/不可见时调用此…

SonicUI在MFC中的使用

SonicUI是一个GUI引擎,提供了一些简单的UI组件实现高效率的UI效果,例如:自绘按钮、异形窗体、动画、超链接和图像操作方法。此项目作者开源到CodeProject,地址为:http://www.codeproject.com/KB/GDI/SonicUI.aspx。下载…

将ribbon主题应用到对话框中去(转载)

原帖地址:这里 找了N久,终于在无幻大神这里找到了将ribbon sdi主题应用到对话框程序中的方法,好像这是一个开源的项目,google code里有,地址在 这里。记录下: 1、下载网页里的资源KofPack0.1,vs里打开工程…