模拟输入的过程

news/2025/9/21 10:42:02/文章来源:https://www.cnblogs.com/sly-345/p/19103270

一、ADC 是什么?

ADC 的全称是 Analog-to-Digital Converter,中文叫模数转换器

它的作用就像一位翻译官,负责将现实世界中连续模拟信号“翻译”成计算机(MCU)能够理解和处理的离散数字信号

  • 模拟信号 (Analog Signal):在时间和数值上都是连续变化的信号。比如:温度、压力、声音、光线强度。你用麦克风录下的一段声音波形就是典型的模拟信号。在电路中,它通常表现为一个连续变化的电压值(例如:0.5V, 1.234V, 3.0V)。

  • 数字信号 (Digital Signal):在时间和数值上都是离散的、不连续的信号。它只有“高电平”(通常代表数字‘1’)和“低电平”(通常代表数字‘0’)两种基本状态。计算机、STM32单片机只能处理这种0和1组成的数字信号。

所以,ADC的核心工作就是:测量一个引脚上的电压值,然后把它转换成一个数字代码(比如一个12位的二进制数)。


二、为什么模拟输入时,GPIO“无效”?

你所说的“GPIO无效”,更准确的理解是:GPIO的数字输入功能被 bypass(旁路)了,引脚被直接切换到了内部的模拟输入模式。

GPIO引脚内部的结构可以看作一个有多路开关的选择器,它可以被配置到不同的通道上:

(这是一个简化的示意图,帮助理解)

  1. 数字模式(默认或配置后)

    • 当引脚配置为数字输入时,信号会通过施密特触发器(一个信号整形电路,能将缓慢变化的模拟信号整形成清晰的数字信号0或1),然后送入输入数据寄存器。CPU读取这个寄存器就能知道引脚是“高”(1)还是“低”(0)。

    • 当配置为数字输出时,CPU通过写输出数据寄存器来控制引脚输出高电平或低电平。

  2. 模拟模式(配置为模拟输入后)

    • 当你将引脚配置为模拟输入(通常通过配置GPIOx_MODER寄存器)时,芯片内部会进行两个关键操作:

      • 断开与内部数字电路的连接(即断开施密特触发器的输入)。这就是“无效”的含义——数字部分再也“看不到”这个引脚的状态了,你读取输入数据寄存器会得到0。

      • 直接连接到内部ADC模块的输入 multiplexer(多路选择开关)上。

    • 这样,引脚上的电压信号就毫无衰减地、直接地传递给了ADC采样电路。

为什么要这样做?

  • 保证精度:施密特触发器和数字电路会产生轻微的漏电流和负载效应,会影响ADC对微小电压测量的准确性。直接连接可以避免这些干扰,获得最精确的电压值。

  • 降低功耗:断开内部数字电路的连接,这部分电路就不会因为引脚电压变化而频繁翻转,从而节省功耗。


三、整个过程是如何工作的?(STM32中的流程)

让我们把人(程序员)、GPIO和ADC想象成一个团队:

  1. 配置阶段(人下指令)

    • :通过代码,先将某个GPIO引脚(例如 PA0)配置为模拟模式GPIOA->MODER |= 0x3;)。这相当于命令:“PA0,你现在是ADC的专属通道了,数字部分你别管了。”

    • :然后配置ADC模块(例如选择分辨率12位、设置采样时间、开启ADC等)。

  2. 执行阶段(ADC干活)

    • ADC:收到启动转换的命令后,内部的多路选择开关会切换到 PA0 对应的通道上。

    • 物理世界:一个模拟电压信号(比如来自温度传感器的1.5V)加在 PA0 引脚上。

    • 信号路径:这个1.5V的电压直接进入ADC内部的采样保持电路,被“捕获”住。

    • 转换:ADC的核心——逐次逼近寄存器(SAR)开始工作,将这个1.5V的电压与一个基准电压(例如3.3V)进行比较,最终计算出一个12位的数字值。

    • 公式大致是Digital Value = (Vpin / Vref) * (2^12 - 1)
      如果 Vpin = 1.5VVref = 3.3V,那么数字值 = (1.5 / 3.3) * 4095 ≈ 1861

  3. 读取结果(人获取信息)

    • :从ADC的数据寄存器(ADC1->DR)中读取这个数字值(1861)。

    • :在你的程序里,可以把这个值直接使用,或者通过公式反向计算出实际的电压值:Voltage = (1861 / 4095.0) * 3.3V ≈ 1.5V

总结

 
 
角色 职责 在模拟输入时的状态
GPIO引脚 物理接口 通道:仅作为电压信号的物理入口,其数字功能被禁用。
ADC 翻译官/测量员 核心:负责精确测量引脚上的电压值,并将其转换为数字代码。
程序员(你) 指挥官 配置GPIO模式和ADC参数,命令ADC开始转换,并读取转换结果。

所以,你的说法非常准确:在模拟输入时,GPIO的数字功能确实“无效”了,它变成了一个纯粹的物理通道,让外部电压信号能够无损地、直接地流入内部的ADC模块进行测量。ADC才是完成从模拟世界到数字世界转换的真正主角

 

二、功能角色关系:分工明确,各司其职

 
 
特性 GPIO (通用输入/输出) ADC (模数转换器)
核心功能 数字接口:读取或输出高低电平 (0/1)。 模拟接口:测量连续变化的电压值
处理信号 数字信号(离散的,通常是0V或3.3V) 模拟信号(连续的,如1.2V, 2.78V)
它的角色 **通道/门户 **翻译官/测量员
工作方式 判断电压是否超过某个阈值(如1.8V),然后表示为0或1。 将电压值与参考电压比较,计算出精确的数字值(如12位的0-4095)。
依赖关系 可以完全不依赖ADC独立工作。(例如:读取按键、点亮LED) 必须依赖GPIO引脚。因为没有GPIO引脚,它就无法接收到外部的模拟信号。

功能关系总结:GPIO提供了ADC与外界连接的物理可能性,而ADC赋予了GPIO引脚测量模拟信号的高级能力。 它们是功能上的补充关系。

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

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

相关文章

基于Redisson和自定义注解的分布式锁实现策略

要实现基于Redisson和自定义注解的分布式锁策略,我们需首先理解Redisson。Redisson是一个基于Redis的高级Java对象映射库,其内部封装了分布式数据结构和同步服务,使得在分布式环境中操作Redis变得非常方便。 以下是…

CCPC2025网络赛 游记

队友超快砍完签到,我全场挂机没作用,3t寄了。省流 队友超快砍完签到,我全场挂机没作用,3t寄了。9.20 内含剧透,请vp后再来。 赛前 比赛开始前登录机器,发现我点不进去比赛页面,一顿查询之后发现队长机是叶神,不…

深入解析:Python进阶第三方库之Numpy

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

17.生成器和推导式 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

知行合一

都说,人赚不到认知之外的钱,这句话是真理。这些年,做生意创业的过程中,也发现了一个法则——寒门的孩子想改命,只有一条路,叫改脑,升认知。当我见到一个人时,只需要了解一下,他当下每天时间用在哪里,在跟谁在…

Manim实现水波纹特效

本文将介绍如何使用ManimCE框架实现一个水波纹特效,让你的数学动画更加生动有趣。 1. 实现原理 水波纹特效通过WaterRipple类实现,这是一个自定义的Animation子类。让我们从代码角度来分析其实现原理: 1.1. 核心数据…

CSP 2025 S1 游记

CSP 2025 S1 游记想到这可能是我最后一个赛季打 OI ,还是留下点东西记录 暑假 由于没有认真考虑过考不上XJ本部的情况,所以没有三连签,之后填的是杭高、学紫。结果tmd连杭高都没上,遂至学紫。学校举办了十天“夏令…

深入解析:解锁AI智能体:上下文工程如何成为架构落地的“魔法钥匙”

深入解析:解锁AI智能体:上下文工程如何成为架构落地的“魔法钥匙”pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

JS之使用for...of赋值失败的原因分析

原代码为for (let tab of tabList.value) {const subFormData = subOrderListMap.value[tab.subFormWebUuid];debuggerif (subFormData) {tab.formStatus = "已完成";tab = { ...subFormData, ...tab };} }这…

Linux /lib/modules/$(uname -r)/ 目录功能作用详解

Linux /lib/modules/$(uname -r)/ 目录功能作用详解Linux 系统中的 /lib/modules/$(uname -r)/目录非常重要,它承载着与当前运行内核版本严格对应的​​内核模块​​及其相关的管理文件。理解这个目录,对你高效管理…

《建筑的永恒之道》第 27 章:道之核心

从你至此所读列的看起来,仿佛建筑的生活以及它们充满生气时所具有的永恒特征可以简单地靠使用模式语言来创造。若是人们有了一种有活力的语言,仿佛其建筑行为所产生的东西都将是有生气的,仿佛城市的生活可以简单地靠…

软件工程第二次作业_个人项目

Github连接: Ender39831/3123004694: homework ](https://github.com/Ender39831/3123004694)这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23ComputerScience这个作业要求在哪里 https://e…

Linux命令大全(档案管理)

Linux命令大全(档案管理)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

小狼毫雾凇拼音安装部署

I. 资源链接 小狼毫官网:RIME | 中州韻輸入法引擎 雾凇拼音仓库:iDvel/rime-ice

Chapter 3 Resize and Cropping

img = cv2.imread(images/lambo.png) # (462, 623, 3) print(img.shape)# 先是width(x轴),然后是height(y轴),可以看出 resize 是放大或缩小并不是裁剪 imgResized = cv2.resize(img, (300, 200)) # 这里是He…

详细介绍:java中常见的几种排序算法

详细介绍:java中常见的几种排序算法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

Linux 内核VRF

Linux 内核VRFVirtual Routing and Forwarding (VRF) 由路由表+网络设备组成。 加载vrf内核模块 modprobe vrf 基本操作 # 创建并拉起vrf设备 # 自动创建路由表1 ip link add vrf1 type vrf table 1 ip link set dev v…

使用FFmpeg转换m4a

在Linux下可以使用FFmpeg将m4a文件转换为mp3文件,如下 ffmpeg -i input.m4a -vn -acodec libmp3lame -ab 320k output.mp3其中-i 是输入文件 -vn 是不包括视频 -acodec libmp3lame 是指定 LAME MP3 解编码器 -ab 320k…

提升多屏监控体验/新增辅屏预览功能/轻松实现跨屏实时监控/支持高达500路多个屏幕同时显示

一、前言说明 随着监控系统规模的不断扩大,以及用户对多屏协同操作需求的日益增长,如何高效、灵活地预览大量实时视频通道,成为提升用户体验的关键。尤其是在拥有多个显示器的环境中,用户越来越希望能够在不同屏幕…

[Java SE/文件系统/IO] 核心源码精讲:java.io.File

1 概述:java.io.File Java 流(Stream)、文件(File)和IOJava 中的流(Stream)、文件(File)和 IO(输入输出)是处理数据读取和写入的基础设施它们允许程序与外部数据(如文件、网络、系统输入等)进行交互。java.io…