当前位置: 首页 > news >正文

学习STM32(6)-- STM32单片机ADCDAC的应用

引 言 

        深入了解并掌握STM32F103单片机在模拟数字转换(ADC)和数字模拟转换(DAC)应用方面的功能和操作。学习如何配置STM32F103的ADC模块,实现模拟信号到数字信号的精确转换;同时,探索DAC模块的工作原理和使用方法,实现数字信号到模拟信号的转换。这些技能的掌握对于未来在嵌入式系统设计、信号处理等领域的工作是非常重要的。

实验目的

1.掌握 STM32F103 的 ADC 的使用

2.了解 STM32F103 的 DAC 的使用

实验内容

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函数是一个系统调用&#xff0c;用于等待一个子进程结束并回收其资源。当父进程调用wait函数时&#xff0c;它会暂停执行&#xff0c;直到至少有一个子进程结束。wait函数的原型如下&#xff1a; #include <sys/types.h> #include <sys/wait.h>pid_…...

C语言:字符串函数strcmp

该函数用于比较两个字符串是否一样。 使用方法如下&#xff1a; #include<stdio.h> #include<string.h>int main() {//strcmp函数返回值有三种情况&#xff0c;小于零时返回-1&#xff0c;等于零&#xff0c;大于零时返回1printf("%d\n", strcmp("…...

【数据分析---偏企业】 Excel操作

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 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

题意&#xff1a;使用 TensorFlow JS 应用 OpenAI GPT-2 模型 问题背景&#xff1a; Is that possible to generate texts from OpenAI GPT-2 using TensorFlowJS? 是否可以使用 TensorFlowJS 生成 OpenAI GPT-2 的文本&#xff1f; If not what is the limitation, like mo…...

JVM-运行数据区(堆、栈、元空间)

文章声明&#xff1a;文章图片均来自互联网&#xff0c;因为本人画的图不够生动。 运行数据区是JVM最重要的一个区域。 运行数据区由栈、堆、元空间构成。 栈&#xff1a;程序计数器、JVM虚拟机栈&#xff0c;本地方法栈 本地方法栈&#xff1a;加载native修饰的方法&#…...

超详细!!! LVS(Linux virual server)负载均衡知识及其NAT模式、DR模式、火墙标记实验

目录 前言系统性能扩展方式集群Cluster分布式集群与分布式 四层转发与七层转发的区别 LVS&#xff08;Linux virual server&#xff09;一、LVS介绍LVS相关概念 二、LVS集群结构体系1. 负载均衡层&#xff08;Load Balancer&#xff09;2. 服务器群组层&#xff08;Server Pool…...

信息学奥赛一本通1259:【例9.3】求最长不下降序列

题目&#xff1a; 1259&#xff1a;【例9.3】求最长不下降序列 时间限制: 1000 ms 内存限制: 65536 KB 提交数:51218 通过数: 20928 Special Judge 【题目描述】 设有由n(1≤n≤200)n(1≤n≤200)个不相同的整数组成的数列&#xff0c;记为:b(1)、b(2)、……、…...

星露谷模组开发教程#3 事件

首发于Enaium的个人博客 SMAPI提供了一些事件&#xff0c;比如游戏的内容、显示、输入等事件。这些事件可以让我们在游戏中添加自己的逻辑。这一节我们就来看看如何使用这些事件。 注册一个事件 在SMAPI中&#xff0c;我们可以通过IModHelper的Events属性来注册事件。比如我们…...

C语言程序设计(初识C语言后部分)

愿天下无Bug&#xff0c;秀发常驻。 3&#xff09;函数的参数 1.实际参数&#xff08;实参&#xff09;&#xff1a; 真实传给函数的参数&#xff0c;叫实参。 实参可以是&#xff1a;常量、变量、表达式、函数等。 无论实参是何类型的量&#xff0c;在进行函数调用时&#…...

驱动基础开发

1、字符设备传统开发模板 字符设备驱动框架&#xff0c;首先我们需要去用module_init这个宏去修饰整个驱动的入口函数&#xff0c;用module_exit去修饰整个驱动的出口函数&#xff0c;然后还需要用MODULE_LICENSE用于声明模块的许可证类型。 在入口函数里面我们需要注册字符设…...

从苹果AppStore看AI开发者生态

从苹果 App Store 看 AI 开发者生态 在人工智能迅速发展的今天&#xff0c;我们不禁要问&#xff1a;未来的 AI 开发者生态将会是什么样子&#xff1f;为了回答这个问题&#xff0c;我们不妨回顾一下移动互联网时代最成功的开发者生态之一——苹果的 App Store。 通过分析 App …...

【Python学习-UI界面】PyQt5 小部件1-Label

QLabel 对象可用作显示不可编辑的文本、图像或动态GIF影片的占位符。 它还可以用作其他小部件的助记键。 标签可以显示普通文本、超链接或富文本。 1、普通文本 直接双击输入即可 2、添加超链接 选中对应Label&#xff0c;右键选择多信息文本&#xff0c;添加链接&#xff0c…...

【Linux详解】进度条实现 Linux下git 的远程上传

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; &#x1f680;前言 &#x…...

Android进阶之路 - res、raw、assets 资源解析、区别对比

那天遇到一个资源目录层级的问题&#xff0c;索性重新整理记录一下&#xff0c;希望能帮到如吾往昔之少年的你们&#xff0c;哈哈哈哈哈哈… 一脸茫然&#xff0c;越写越多&#xff0c;时间成本属实有点大&#xff0c;就当一起来基础扫盲吧 resdrawablemipmapvaluescolor asset…...

从数字化到数智化:消费零售企业如何实现门店数智化管理?

随着信息技术的飞速发展&#xff0c;数字化已成为企业转型的必经之路。然而&#xff0c;数字化本身并不是目的&#xff0c;而是通往数智化的桥梁。数智化&#xff0c;即数据智能化&#xff0c;是指企业通过数字化手段收集和分析数据&#xff0c;进而利用这些数据驱动决策和创新…...

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会话的资源限制&#xff08;软限制和硬限制&#xff09;2.4、增加虚拟内存的设置…...

Redis远程字典服务器(5) —— hash类型详解

目录 一&#xff0c;hash基本情况 二&#xff0c;hash常用命令详解 2.1 hset&#xff0c;hget&#xff0c;hexists&#xff0c;hdel 2.2 hexists&#xff0c;hdel 2.3 hkeys&#xff0c;hvals 2.4 hgetall&#xff0c;hmget 2.5 hlen&#xff0c;hsetnx 2.6 hincrby&am…...

MySQL | 行锁——记录锁、间隙锁 、临键锁、插入意向锁

1、InnoDB中的行锁 行锁&#xff08;Row Lock&#xff09; 也称为记录锁&#xff0c;顾名思义&#xff0c;就是锁住某一行&#xff08;某条记录row&#xff09;。需要注意的是&#xff0c;MySQL服务器层并没有实现行锁机制&#xff0c;行级锁只在存储引擎层实现。 优点&#x…...

【网络编程】TCP通信基础模型实现

tcpSer.c #include <myhead.h> #define SER_IP "192.168.119.143" // 设置IP地址 #define SER_PORT 6666 // 设置端口号 int main(int argc, const char *argv[]) {// 1.创建socketint serfd socket(AF_INET, SOCK_STREAM, 0);// 参数1表示ipv4// 参数2表…...

css rem之2024

话题开始前 我们都知道1rem是等于html fontSize标签的字体大小的&#xff0c;我们主要用来做移动端网页设计稿等比例在手机上面的显示。 看到的问题 这个html fontsize的大小是通过js动态计算的&#xff0c;而这个js的运行时晚于html渲染的&#xff0c;所以会导致一个问题&am…...

python自动化笔记:pytest框架

目录 一、pytest介绍二、测试用例命名规则2.1、pytest命名规则2.2、python命名规范 三、pytest运行方式3.1、主函数方式3.2、命令行方式3.3、通过pytest.ini的配置文件运行&#xff08;常用&#xff09; 四、跳过测试用例4.1 无条件跳过4.2 有条件跳过 五、用例的前后置&#x…...

wpf 路径动画 举例

先&#xff0c;我们需要在XAML中定义一个Path&#xff0c;这个Path将定义动画的路线。然后&#xff0c;我们将使用DoubleAnimationUsingPath来沿着这个路径移动一个元素&#xff08;比如一个矩形&#xff09;。 <Window x:Class"WpfApp.MainWindow" xmlns"…...

【C++】classes and object 2.8 取地址及const取地址操作符重载

这两个默认成员函数一般不用重新定义 &#xff0c;编译器默认会生成。 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; class Date { public:Date* operator&(){return this;}const Date* operator&()const{return this;} privat…...

milvus helm k8s开启监控

https://milvus.io/docs/monitor.md 文章写的很清晰 &#xff0c;我这边做一下个人补充&#xff0c;初版可能只是配置&#xff0c;具体的grafana 监控报表后期补一下。 架构如下&#xff1a; values.yaml 配置 enabled: true 改为true metrics:enabled: trueserviceMonitor:…...

牛奶饮用学习笔记

1. 常见牛奶类型 1.1 蒙牛-每日鲜语-0脂肪鲜牛奶 项目每100mL NRV%能量146kJ 能量计算 250 mL 146 kJ / 100 mL 365 kJ 250\text{mL}\times146\text{kJ}/100\text{mL} 365\text{kJ} 250mL146kJ/100mL365kJ 1.2 伊利-舒化-高钙型无乳糖牛奶 项目每100mL NRV%能量269kJ …...

php防止页面重复刷新或者重复提交

2.核心代码 显示的逻辑&#xff1a; //获取防止刷新的唯一标识符,start $intFlag substr(md5(time()),6); $strFlag BAOXIAOSS_.$my_user_id.$intFlag; $smarty->assign(check_is_agin_post, $strFlag); //获取防止刷新的唯一标识符,end注意&#xff1a;前端页面提交加入…...

Springboot3 配置sql打印到控制台

一、pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId><version>3.1.2</version></dependency> 二、application.yml com.lingyang.system # log4j2配…...

深入理解 GO 语言并发

1. 使用并发 在深入了解 Go 如何处理并发之前,先查看并发的概念。在计算机发展的早期阶段,计算机系统只有一个处理器负责执行所有指令。由于这种体系结构,计算机程序被编写成以串行的方式运行,在这种方式下,程序按照预定义的顺序逐个指令地执行。 随着计算机程序变得越来越…...

林州网站制作/百度一下你就知道官网百度

本文转自&#xff1a;http://www.cnblogs.com/ganqiyin/p/3680771.html 原址&#xff1a;http://www.nopcommerce.com/docs/77/how-to-write-a-nopcommerce-plugin.aspx plug-in (或 plugin)是一个为更大的软件应用程序添加特定的能力的组件(Wikipedia) 插件是用来扩展nopComme…...

wordpress 做的商城/东莞做网站的公司吗

前言 &#xff1a; 1、 Git是目前世界上最先进的分布式版本控制系统 Git是一个分布式版本控制系统&#xff0c;简单来说就是一个软件用于记录一个或若干文件内容变化&#xff0c;以便于将来查阅特定版本修订情况的软件 2、 Github是一个为用户提供git服务的网站&#xff0c;简单…...

八大处做双眼预约网站/app开发公司排名

你还在为了Word、Excel、PDF、CAD等文档格式转换而发愁吗&#xff1f; 你是否在寻找一款能够在应用程序中文档管理的工具呢&#xff1f; Aspose——支持100多种文件格式创建、编辑、转换和打印&#xff01; 往下看&#xff0c;找一找哪款产品满足您的开发需求~ ▼▼▼▼▼ ★…...

电商网站分析报告怎么做/去了外包简历就毁了吗

Nginx 升级版本或者重新编译增加参数这里我们重新编译下&#xff0c;增加nginx用户和组先创建用户#useradd nginx 开始编译#cd /usr/local/nginx-1.6.1#./configure --usernginx --groupnginx --prefix/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module…...

自己做网站要买服务器吗/seo哪家强

编写帮助文档除了内容之外&#xff0c;如何呈现给用户也很重要&#xff0c;专业的形象有助于帮助用户更快的上手使用&#xff0c;并且建立专业形象&#xff0c;可能你的帮助文档内容来源各个地方&#xff0c;但最终&#xff0c;每个知识库都需要自己的样式指南&#xff0c;你可…...

休闲食品网站模板/媒体发稿推广

Demo详见GitHub&#xff1a;JXTMarkLabel 镂空文字 - JXTHollowOutLabel 镂空文字效果的实现基于drawRect重绘&#xff0c;具体参考了两篇帖子&#xff1a; Drawing a path with subtracted text using Core GraphicsdrawRect drawing ‘transparent’ text? 想了解原理的可以…...