学习STM32(6)-- STM32单片机ADCDAC的应用
1 引 言
深入了解并掌握STM32F103单片机在模拟数字转换(ADC)和数字模拟转换(DAC)应用方面的功能和操作。学习如何配置STM32F103的ADC模块,实现模拟信号到数字信号的精确转换;同时,探索DAC模块的工作原理和使用方法,实现数字信号到模拟信号的转换。这些技能的掌握对于未来在嵌入式系统设计、信号处理等领域的工作是非常重要的。
2 实验目的
1.掌握 STM32F103 的 ADC 的使用
2.了解 STM32F103 的 DAC 的使用
3 实验内容
3.1 ADC概念
ADC(模拟-数字转换器)是一种将连续的模拟信号转换成离散的数字信号的电子设备。在各种电子系统中,ADC扮演着重要的角色,特别是在需要将模拟世界的物理量(如温度、压力、声音等)转换为数字形式以供微处理器处理的场合。
模拟信号是连续变化的,而数字信号则是由离散的数值组成的。ADC通过几个关键的步骤将模拟信号转换成数字信号:
采样:在固定的采样率下获取模拟信号的瞬时值。
量化:将采样得到的连续幅值转换成最接近的数字级别。这个过程中通常会产生一些量化误差。
编码:将量化后的数值转换成二进制形式。
ADC的性能主要由两个参数来衡量:
分辨率:ADC的分辨率决定了它能区分的最小电压变化量,通常用位数来表示。例如,一个8位的ADC能将输入信号分成2^8(即256)个不同的电压级别。
采样率:采样率决定了ADC每秒可以采样的次数,高采样率可以更精确地追踪信号的变化。
由于数字信号更易于存储和处理,因此ADC在数字信号处理、通信系统、图像处理和其他许多需要数字化实时信号的领域中非常关键。在设计和选择ADC时,需要根据应用的需求来选择适当的分辨率和采样率。
3.2 ADC 功能框图剖析

图1 功能框图
若输入电压范围设定在:0~3.3v,因为 ADC是 12 位的(4096),满量程对应的就是3.3V;数值0 对应的就是 0V。
如果转换后的数值为 X ,X 对应的模拟电压为 Y,
那么会有这么一个等式成立:2^12 / 3.3 = X / Y
则 Y = (3.3 * X ) / 2^12
3.3 ADC编程要点

图2 ADC初始化例子
(1)初始 ADC 用到的 GPIO;

图3 ADC的GPIO例子
(2)设置 ADC 的工作参数并初始化;
(3)设置 ADC 工作时钟;
(4)设置 ADC 转换通道顺序及采样时间;
(5)配置使能 ADC 转换完成中断,在中断内读取转换完数据;
(6)使能 ADC;
(7)使能软件触发 ADC 转换。

图4 ADC工作参数配置例子
3.4 DAC概念
DAC(数字-模拟转换器)是一种将数字信号转换成连续的模拟信号的电子设备。它是许多数字电子系统中不可或缺的组件,尤其是在需要将数字数据转换为模拟信号以驱动其他硬件(如扬声器、电机等)的应用中。
DAC的工作原理与ADC相反,其主要步骤包括:
接收数字信号:DAC接收的数字信号通常是二进制形式的数据。
转换:将接收到的数字信号转换为相对应的模拟电压或电流。
输出模拟信号:输出的模拟信号通常是连续变化的,这个信号可以用来驱动其他模拟系统或设备。
DAC的关键性能参数主要有:
分辨率:DAC的分辨率是指它能输出的最小模拟信号变化的能力,通常也用位数来表示。分辨率越高,输出的模拟信号就越精确。
更新率:也称为转换率,是DAC每秒可以更新输出信号的次数。更新率越高,DAC输出的信号就越能忠实地再现输入的数字信号。
DAC广泛应用于声音播放(如音频DAC)、视频显示、信号生成和通信系统等领域。在设计这些系统时,DAC的选择和优化对于保证整个系统性能至关重要。DAC确保了数字技术能够有效地与模拟世界相互作用。
3.5 DAC功能框图

图5 DAC功能框图
“数字至模拟转换器 x”是核心部件,整个 DAC 外设都围绕它而展开。它以左边的 VREF+作为参考电源,以 DAC 的数据寄存器“DORx”的数字编码作为输入,经过它转换得的模拟信号由右侧的“DAC_OUTx”通道输出。其中各个部件中“x”是指设备的标号,在 STM32 中具有 2 个这样的 DAC 部件,每个 DAC 有 1 个对应的输出通道连接到特定的引脚,即:PA4-通道 1,PA5-通道 2,为避免干扰,使用 DAC 功能时,DAC 通道引脚需要被配置成模拟输入功能(AIN)。
3.7定时器设置分频系数和周期--计算波形的频率公式

图6 频率计算公式
4 深入分析
思考一
实验源码“31-ADC-电压采集:1-ADC-单通道(中断读取)”,查找电路图和程序,确认ADC硬件对应的引脚号; 改变ADC的采样时钟实现三种不同采样速度的 ADC数据采集。

图7 ADC IO 分配

图8 ADC硬件对应的引脚号

图9 改变ADC的采样时间
将ADC_SampleTime_55Cycles5改为ADC_SampleTime_1Cycles5,ADC_SampleTime_7Cycles5,ADC_SampleTime_13Cycles5等等就可以实现实现三种不同采样速度的 ADC数据采集。

图10 可以使用的采样时间
ADC_SampleTime_1Cycles5: Sample time equal to 1.5 cycles 采样时间等于1.5个周期
ADC_SampleTime_7Cycles5: Sample time equal to 7.5 cycles 采样时间等于7.5个周期
ADC_SampleTime_13Cycles5: Sample time equal to 13.5 cycles 采样时间等于13.5个周期
ADC_SampleTime_28Cycles5: Sample time equal to 28.5 cycles 采样时间等于28.5个周期
ADC_SampleTime_41Cycles5: Sample time equal to 41.5 cycles 采样时间等于41.5个周期
ADC_SampleTime_55Cycles5: Sample time equal to 55.5 cycles 采样时间等于55.5个周期
ADC_SampleTime_71Cycles5: Sample time equal to 71.5 cycles 采样时间等于71.5个周期
ADC_SampleTime_239Cycles5: Sample time equal to 239.5 cycles 采样时间等于239.5个周期
ADC的采样时间=采样周期/ADC的时钟频率
ADC的转换时间=ADC的采样时间+12.5周期 (12.5是采集12位AD时间是固定的周期)
思考二
在 ADC 采集数据的应用中,为了提高 ADC 的分辨率,可以采用多个采样平均的方式提高其分辨率(平均值滤波), 修改程序实现 ADC采集的平均值滤波。
这里我们在ADC中断中,通过一次中断进行6次采样然后取平均值来提高 ADC 的分辨率,从而实现 ADC采集的平均值滤波。

图11 6次采样然后取平均值来提高 ADC 的分辨率

图12 main函数
思考三
实验源码“31-ADC-电压采集:5-ADC-芯片温度”采用 DMA 的方式实现 MCU 温度的采集,比较 DMA 方式与单 通道(中断读取)方式程序的异同。
DMA (Direct Memory Access)的定义与原理:DMA 是一种允许某些硬件子系统直接访问主内存的技术,无需通过CPU。在MCU温度采集中,ADC(模数转换器)通过DMA直接将采集到的数据传输到内存中。
优点:
高效:DMA 传输可以在不占用 CPU 的情况下进行,提高系统的总体效率。
连续采集:可以连续采集数据,适合需要高速或连续数据采集的场景。
程序结构:程序中需要设置DMA通道和配置其源地址(ADC数据寄存器)和目标地址(内存中的缓冲区),以及传输完成后的中断或回调函数。
单通道中断的定义与原理:在单通道中断方式中,ADC完成转换后会产生一个中断信号,CPU响应这个中断,并从ADC数据寄存器读取数据。
优点:
简单:硬件和软件配置相对简单,适用于数据采集需求不频繁的应用。
灵活:程序可以灵活处理每次采集到的数据。
程序结构:程序中主要包含中断服务例程,每次ADC完成转换后,CPU通过中断服务程序读取数据,并处理或存储。
DMA 与单通道中断方式的比较
资源利用:DMA方式不占用CPU资源,而中断方式每次采集都需要CPU介入,影响CPU执行其他任务。
数据处理:DMA适合大批量数据处理,能连续不断地采集;单通道中断方式则在每次转换后都需要CPU处理,更适合对数据即时处理的要求。
复杂性:DMA的配置和调试相对复杂,涉及到内存管理和DMA控制器配置;单通道中断方式配置简单,但在高数据率下可能会使CPU负担加重。
适用场景:DMA更适合高速、大量数据采集的场景,如音视频处理或工业控制系统;单通道中断方式适用于数据采集频率较低、单次数据处理需求更高的场景。
思考四
参照实验源码“DAC-输出正弦波”实现不同频率的波形输出,实现基于 DAC 输出方波。

图13 DAC 输出方波代码修改操作

图14 main函数

图15 DAC初始化基础构架

图16 示波器显示方波验证图
相关文章:
学习STM32(6)-- STM32单片机ADCDAC的应用
1 引 言 深入了解并掌握STM32F103单片机在模拟数字转换(ADC)和数字模拟转换(DAC)应用方面的功能和操作。学习如何配置STM32F103的ADC模块,实现模拟信号到数字信号的精确转换;同时,探索DAC模块…...
学习记录第二十五天
wait函数 wait函数是一个系统调用,用于等待一个子进程结束并回收其资源。当父进程调用wait函数时,它会暂停执行,直到至少有一个子进程结束。wait函数的原型如下: #include <sys/types.h> #include <sys/wait.h>pid_…...
C语言:字符串函数strcmp
该函数用于比较两个字符串是否一样。 使用方法如下: #include<stdio.h> #include<string.h>int main() {//strcmp函数返回值有三种情况,小于零时返回-1,等于零,大于零时返回1printf("%d\n", strcmp("…...
【数据分析---偏企业】 Excel操作
各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 Excel操作前 必看 Python 初阶 Python—语言基础与…...
Ajax-01.原生方式
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Ajax-原生方式</title> </head> <!-…...
OpenAI GPT-2 model use with TensorFlow JS
题意:使用 TensorFlow JS 应用 OpenAI GPT-2 模型 问题背景: Is that possible to generate texts from OpenAI GPT-2 using TensorFlowJS? 是否可以使用 TensorFlowJS 生成 OpenAI GPT-2 的文本? If not what is the limitation, like mo…...
JVM-运行数据区(堆、栈、元空间)
文章声明:文章图片均来自互联网,因为本人画的图不够生动。 运行数据区是JVM最重要的一个区域。 运行数据区由栈、堆、元空间构成。 栈:程序计数器、JVM虚拟机栈,本地方法栈 本地方法栈:加载native修饰的方法&#…...
超详细!!! LVS(Linux virual server)负载均衡知识及其NAT模式、DR模式、火墙标记实验
目录 前言系统性能扩展方式集群Cluster分布式集群与分布式 四层转发与七层转发的区别 LVS(Linux virual server)一、LVS介绍LVS相关概念 二、LVS集群结构体系1. 负载均衡层(Load Balancer)2. 服务器群组层(Server Pool…...
信息学奥赛一本通1259:【例9.3】求最长不下降序列
题目: 1259:【例9.3】求最长不下降序列 时间限制: 1000 ms 内存限制: 65536 KB 提交数:51218 通过数: 20928 Special Judge 【题目描述】 设有由n(1≤n≤200)n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、…...
星露谷模组开发教程#3 事件
首发于Enaium的个人博客 SMAPI提供了一些事件,比如游戏的内容、显示、输入等事件。这些事件可以让我们在游戏中添加自己的逻辑。这一节我们就来看看如何使用这些事件。 注册一个事件 在SMAPI中,我们可以通过IModHelper的Events属性来注册事件。比如我们…...
C语言程序设计(初识C语言后部分)
愿天下无Bug,秀发常驻。 3)函数的参数 1.实际参数(实参): 真实传给函数的参数,叫实参。 实参可以是:常量、变量、表达式、函数等。 无论实参是何类型的量,在进行函数调用时&#…...
驱动基础开发
1、字符设备传统开发模板 字符设备驱动框架,首先我们需要去用module_init这个宏去修饰整个驱动的入口函数,用module_exit去修饰整个驱动的出口函数,然后还需要用MODULE_LICENSE用于声明模块的许可证类型。 在入口函数里面我们需要注册字符设…...
从苹果AppStore看AI开发者生态
从苹果 App Store 看 AI 开发者生态 在人工智能迅速发展的今天,我们不禁要问:未来的 AI 开发者生态将会是什么样子?为了回答这个问题,我们不妨回顾一下移动互联网时代最成功的开发者生态之一——苹果的 App Store。 通过分析 App …...
【Python学习-UI界面】PyQt5 小部件1-Label
QLabel 对象可用作显示不可编辑的文本、图像或动态GIF影片的占位符。 它还可以用作其他小部件的助记键。 标签可以显示普通文本、超链接或富文本。 1、普通文本 直接双击输入即可 2、添加超链接 选中对应Label,右键选择多信息文本,添加链接,…...
【Linux详解】进度条实现 Linux下git 的远程上传
📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 🚀前言 &#x…...
Android进阶之路 - res、raw、assets 资源解析、区别对比
那天遇到一个资源目录层级的问题,索性重新整理记录一下,希望能帮到如吾往昔之少年的你们,哈哈哈哈哈哈… 一脸茫然,越写越多,时间成本属实有点大,就当一起来基础扫盲吧 resdrawablemipmapvaluescolor asset…...
从数字化到数智化:消费零售企业如何实现门店数智化管理?
随着信息技术的飞速发展,数字化已成为企业转型的必经之路。然而,数字化本身并不是目的,而是通往数智化的桥梁。数智化,即数据智能化,是指企业通过数字化手段收集和分析数据,进而利用这些数据驱动决策和创新…...
Linux中ES的安装
文章目录 一、ES是什么1.1、ES概念介绍1.2、技术架构1.2.1、Lucene介绍 1.3、ES的工作原理1.4、ES的适用场景 二、安装前的配置2.1、创建普通用户2.2、调整文件描述符数量和虚拟内存2.3、设置shell会话的资源限制(软限制和硬限制)2.4、增加虚拟内存的设置…...
Redis远程字典服务器(5) —— hash类型详解
目录 一,hash基本情况 二,hash常用命令详解 2.1 hset,hget,hexists,hdel 2.2 hexists,hdel 2.3 hkeys,hvals 2.4 hgetall,hmget 2.5 hlen,hsetnx 2.6 hincrby&am…...
MySQL | 行锁——记录锁、间隙锁 、临键锁、插入意向锁
1、InnoDB中的行锁 行锁(Row Lock) 也称为记录锁,顾名思义,就是锁住某一行(某条记录row)。需要注意的是,MySQL服务器层并没有实现行锁机制,行级锁只在存储引擎层实现。 优点&#x…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
