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

news2024/12/23 17:29:00

大家好,我是学电子的小白白,今天带大家了解一款波形发生器芯片——AD9833。

AD9833是AD公司出品的一款DDS波形发生器,能够产生正弦波、三角波和方波输出。

1)什么是DDS

通俗来讲,DDS是一种把波形预先存储在芯片内部的DAC,只要设置好它的工作频率,就能按这个频率来输出特定的波形。

DDS内部主要分成3部分:相位累加器、相位幅度转换、数模转换器(即DAC)。

相位累加器:

一个周期信号的波形,它的相位是均匀增加的,比如1Hz的正弦波,每1/360秒相位增加1°,增加到360°时又回到0°。相位累加器就是一个不断累加产生相位值的计数器,周期性地累加、清零。

相位累加器的位数决定了把一个周期分为多少等分,位数越高,则分得越细,一个周期内的点数也越多,输出波形在时间尺度上就会越精细。

相位幅度转换

相位幅度转换其实就是已经存储的波形表,比如我们想输出正弦波的波形时,相位累加器输出的相位是30°,则通过查表,输出sin(30°)的值,就完成了相位幅度转换。

DAC输出

有了幅度值,再通过DAC输出,就得到了当前时刻的波形值。这个就不多解释了,和通用的DAC一个意思。这里的DAC也是有位数的,位数越高,产生的波形幅度就越精细。

2)DDS芯片AD9833的特性

AD9833是AD公司出品的一款DDS波形发生器,它的主要参数如下:

能产生正弦波、三角波和方波的输出;

28位的相位累加器,也就是主频时钟为25MHz时,可实现0.1Hz的分辨率;主频时钟为1MHz时,可实现0.004Hz的分辨率;

10位的DAC输出;输出正弦波和三角波时波形幅度为38mV~650mV,输出方波时幅度最大为3.3V。

采用SPI接口,只作为SPI的从机。

这里需要说明一下,AD9833的输出波形频率,最高可达12.5MHz。这个12.5MHz是怎么来的呢?

因为AD9833的输入时钟频率最高是25MHz,由于奈奎斯特采样定律的限制,输出波形的每个周期内至少要2个点才能还原出信号,所以,25MHz/2 = 12.5MHz是这么来的。

但是,这里要特别注意一下,奈奎斯特采样定理使用的条件,它描述的是波形中所含正弦波的最高频率

因此,如果我们想让它输出12.5MHz的正弦波是可行的,一个周期内两个点的波形,再加上后端的低通滤波器就能实现;输出方波也是可行的,因为方波只有高、低电平的变化;而想要输出三角波,就不可能了,一个周期中只输出两个点,怎么都不可能形成三角波的图形,要想输出三角波,只能降低频率,让一个周期内的点数增加,才能输出类似三角波的波形。

3)使用stm32驱动AD9833输出

AD公司官方给出了一套驱动AD9833的代码,但是它的代码结构比较复杂,而且它为了兼容同系列的其他DDS芯片里面有很多冗余的部分,我们不使用官方的代码,有兴趣可以关注我的公众号找到下载地址自行研究。

这里我们自己来实现AD9833的驱动代码,使用的硬件平台是stm32单片机。

AD9833连接到SPI2接口上,使用PA8作为片选信号。

首先看AD9833的SPI接口时序:

它只有MOSI数据,所以数据只有主机到从机的,而且要注意是在时钟下降沿取数的,每次传输16bit。

在cubemx里建立工程,主要的参数设置下面几项:

使能SPI2,设置为全双工主机(半双工主机也可以);时钟初始为高、第一个跳变沿取数;

PA8设置为输出,作为AD9833的片选信号;

然后生成工程,在keil中打开后就可以编写代码了。

AD9833的寄存器比较简单,一共就三个:控制寄存器、频率寄存器、相位寄存器。

其中,控制寄存器用于设置波形、是否输出、是否低功耗等等一些控制量。频率、相位寄存器都有两个,由控制寄存器中的FSELEC、PSELECT位来选择使用哪一个。

这里我们尝试把常用的几个功能封装的函数中,其他一些细节功能的可以参见AD9833的数据手册。

首先是定义片选的拉高、拉低函数:

接着是初始化函数,由于cubemx生成的代码已经把spi接口初始化好了,所以这里我们只需要把片选线拉高就可以了:

AD9833的读写函数,我们使用HAL库的spi函数实现,由于AD9833每次传输16bit,先传高位,所以我们每次传输2字节就可以了,先传高字节;当然在传输前后,加上片选的拉低、拉高:

设置AD9833控制寄存器的函数,这里只实现了常用的几个位:RESET、SLEEP、OPBITEN、MODE这几个bit的设置:

如果想实现其他bit位的改写,也很容易。

最后是设置频率的函数:

注意这个函数设置完频率之后, AD9833_Write(0x2100);这句把输出关闭了。

在主函数中写一个测试程序:

主要功能是在初始化之后,主循环之前,设置1MHz正弦波,延时10s输出:

将代码下载到单片机运行,可以简称到上电10后,AD9833的10脚out上输出1MHz正弦波。

使用模块来搭电路时,要注意避坑,我选用的模块是下面这种:

原理图如下:

在AD9833的输出增加了一个数字电位器MCP41010和运放AD8051进行输出波形幅度的调节。

但是,这个模块的设计是有问题的,主要在于MCP41010数字电位器的带宽不够!会造成输出频率较高时,波形幅度大幅减小,完全起不到调节波形幅度的作用。

如下图是MCP41010的增益随频率的变化曲线,可以看到,频率到1MHz以上时,衰减会变得很明显,频率越高衰减越大:

所以在频率比较高的时候,这种模块是不适用的。

好了,本节关于DDS波形发生器AD9833的使用就讲到这里了。

如果觉得有用,可以关注我的微 信 公众号“小白白学电子”,可以找到所有源码和参考资料:

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

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

相关文章

H5对接NSS主扫遇到的一些问题

需要对接以下这些钱包: WXPAY(微信)ALIPAY(支付宝)LINEPAY(linePay)PAY_PAY (PayPay)RAKUTEN_PAY(乐天)MER_PAY(MerPay)AU_PAY(auPay)DOCOMO_PAY(Dpay)判断钱包类型 这…

注册中心Nacos

Nacos是Spring Cloud Alibaba提供的一个软件 这个软件主要具有注册中心和配置中心(课程最后讲解)的功能 我们先学习它注册中心的功能 微服务中所有项目都必须注册到注册中心才能成为微服务的一部分 注册中心和企业中的人力资源管理部门有相似 当前微服务项目中所有的模块,在…

用户购车旅程转变下,深度运营中的难点痛点如何突破?

在数字互联的营销环境下,消费者的购车旅程和用户行为发生了极大的改变,线上决策比重逐渐增强,到店决策周期越来越短,消费者可以在线完成70%-80%的车型甄选和决策。在这种环境下,未来如何实现更高效的用户运营和快速的销…

Python基础(十八):学员管理系统应用

文章目录 学员管理系统应用 一、系统简介 二、步骤分析 三、需求实现 1、显示功能界面 2、用户输入序号,选择功能 3、根据用户选择,执行不同的功能 4、定义不同功能的函数 学员管理系统应用 一、系统简介 需求:进入系统显示系统功能…

汽车租赁小程序源码 上门取车

小程序端: 首页、订单、我的 上门取送:仅限上门取送范围、到店取还:为您推荐最近的门店 套餐1、领优惠券、签到积分、限时活动、车型推荐 订单:订单中心、短租订单、长租订单 个人中心:我的优惠、租车券、优惠券、…

Android入门第55天-在Android里使用OKHttp组件访问网络资源

简介 今天的课程开始进入高级课程类了,我们要开始接触网络协议、设备等领域编程了。在今天的课程里我们会使用OKHttp组件来访问网络资源而不是使用Android自带的URLConnection。一个是OKHttp组件更方便二个是OKHttp组件本身就带有异步回调功能。 下面就进入课程。…

《北京市数字经济促进条例》图解来了

《北京市数字经济促进条例》 2023/1/1 二十大对建设数字经济作出重要部署。党的二十大报告中指出,“加快建设网络强国、数字中国”、“加快发展数字经济,促进数字经济和实体经济深度融合,打造具有国际竞争力的数字产业集群”。习总书记强调…

【算法】P1 算法简介

算法什么是算法正确与错误的算法算法可以解决什么问题本专栏有哪些算法什么是算法 算法 (Algorithm) 取某个值或集合作为 输入,并产生某个值或集合作为 输出。算法就是把输入转换为输出的计算,描述这个计算的过程来实现输入与输出的关系。 正确与错误的…

学习Elasticsearch这一篇就够了(2)

DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试…

12_SpringMVC_拦截器

在之前学习JAVAWEB 的时候,我们学习了过滤器的知识。过滤器的作用是保护请求的服务器资源,在请求资源被执行之前,如果请求地址符合拦截范围,则会先执行过滤器。过滤器的执行时机,是在Servlet之前执行的。但是在使用了S…

Vue 3 技术揭秘

作者介绍 muwoo,前端技术专家。曾就职于蚂蚁集团,之前对 Vue 2.x 源码有过深层次的研究和探索,并在 Github 上开源了相关的技术文章:Vue 2.x 技术揭秘,目前已有超过 2k star 。 自 Vue 3 诞生以来,就一直关…

30 岁转行做程序员,晚了吗?

2019年,我从某大型国有企业正式辞职,告别了工作了6年的北锤小城。这时候,鄙人年芳30,曾经一批来这里奋斗的同事们,要么走上管理岗位、要么成家立业买房买车,他们是打算把一生奉献给这里的,然而也…

【Javascript基础】--零基础--超详细且简洁的Javascript笔记--Javascript基础知识(02)

Hello, world! 首先&#xff0c;让我们看看如何将脚本添加到网页上。 对于服务器端环境&#xff08;如 Node.js&#xff09;&#xff0c;你只需要使用诸如 "node my.js" 的命令行来执行它。 “script” 标签 比如&#xff1a; <!DOCTYPE HTML> <html>…

搭建Seata分布事务(基于Nacos注册+Mysql配置)

文章目录一&#xff1a;拉取Seata镜像二&#xff1a;运行Seata容器2.1. 容器内目录拷贝到宿主机2.2. 编辑 registry.conf 和 file.conf2. 2.1. 编辑注册中心相关文件2.2.2. 编辑Seata存储数据的相关配置文件2.3. 宿主机文件拷贝至容器内部三&#xff1a;Nacos注册中心相关配置操…

TikTok发布What‘s Next趋势报告,2023年有哪些增长机会?

获悉&#xff0c;近日TikTok for Business发布了《Whats Next 2023 TikTok 全球流行趋势报告》&#xff0c;帮助营销人员了解消费者的需求在来年将如何变化&#xff0c;以及这对他们在TikTok内外的策略将产生怎样的影响。这份报告将有趣与实用相结合&#xff0c;重点剖析了品牌…

阿里巴巴新产“Java架构核心宝典”,全是流行技术,限时开放

导言 什么是架构师&#xff1f;对于程序员来说&#xff0c;聊架构是一个永不过时的话题。实际上&#xff0c;每一家公司都有自己对架构师不同的定位&#xff0c;因为不同的公司&#xff0c;所处的阶段、业务模式以及应用场景都不一样&#xff0c;因此对架构师的要求不一样&…

直播带货不再独揽大旗,货架电商神秘崛起,链动2+1模式助力引流

​“WXG&#xff08;微信事业群&#xff09;最亮眼的业务是视频号&#xff0c;基本上是全场&#xff08;全公司&#xff09;的希望。”12月22日&#xff0c;在线上召开内部员工大会时&#xff0c;腾讯CEO马化腾再度把视频号推至C位。这句话昨天也一度冲上热搜。 马化腾在内部员…

后台Service限制

每次在后台运行时&#xff0c;应用都会消耗一部分有限的设备资源&#xff0c;例如 RAM。 这可能会影响用户体验&#xff0c;如果用户正在使用占用大量资源的应用&#xff08;例如玩游戏或观看视频&#xff09;&#xff0c;影响会尤为明显。 为了提升用户体验&#xff0c;Androi…

ESP8266-C开发-3串口下载固件失败方案

一、串口下载固件失败 以下是报错信息。 …………………………[2022-12-23 09:01:17,338][ESP8266Loader_spi[1]][espDownloader.pyo][line:351][ERROR]: Chip sync error: Failed to connect to ESP8266: Timed out waiting for packet header [2022-12-23 09:01:17,338][ESP…

Zookeeper 4 Zookeeper JavaAPI 操作 4.1 Curator 介绍 4.2 Curator API 常用操作【建立连接】

Zookeeper 【黑马程序员Zookeeper视频教程&#xff0c;快速入门zookeeper技术】 文章目录Zookeeper4 Zookeeper JavaAPI 操作4.1 Curator 介绍4.1.1 Curator 介绍4.2 Curator API 常用操作4.2.1 Curator API 常用操作4.2.2 建立连接4 Zookeeper JavaAPI 操作 4.1 Curator 介绍…