一、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引脚内部的结构可以看作一个有多路开关的选择器,它可以被配置到不同的通道上:
(这是一个简化的示意图,帮助理解)
-
数字模式(默认或配置后):
-
当引脚配置为数字输入时,信号会通过施密特触发器(一个信号整形电路,能将缓慢变化的模拟信号整形成清晰的数字信号0或1),然后送入输入数据寄存器。CPU读取这个寄存器就能知道引脚是“高”(1)还是“低”(0)。
-
当配置为数字输出时,CPU通过写输出数据寄存器来控制引脚输出高电平或低电平。
-
-
模拟模式(配置为模拟输入后):
-
当你将引脚配置为模拟输入(通常通过配置GPIOx_MODER寄存器)时,芯片内部会进行两个关键操作:
-
断开与内部数字电路的连接(即断开施密特触发器的输入)。这就是“无效”的含义——数字部分再也“看不到”这个引脚的状态了,你读取输入数据寄存器会得到0。
-
直接连接到内部ADC模块的输入 multiplexer(多路选择开关)上。
-
-
这样,引脚上的电压信号就毫无衰减地、直接地传递给了ADC采样电路。
-
为什么要这样做?
-
保证精度:施密特触发器和数字电路会产生轻微的漏电流和负载效应,会影响ADC对微小电压测量的准确性。直接连接可以避免这些干扰,获得最精确的电压值。
-
降低功耗:断开内部数字电路的连接,这部分电路就不会因为引脚电压变化而频繁翻转,从而节省功耗。
三、整个过程是如何工作的?(STM32中的流程)
让我们把人(程序员)、GPIO和ADC想象成一个团队:
-
配置阶段(人下指令):
-
你:通过代码,先将某个GPIO引脚(例如
PA0
)配置为模拟模式(GPIOA->MODER |= 0x3;
)。这相当于命令:“PA0
,你现在是ADC的专属通道了,数字部分你别管了。” -
你:然后配置ADC模块(例如选择分辨率12位、设置采样时间、开启ADC等)。
-
-
执行阶段(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.5V
,Vref = 3.3V
,那么数字值 =(1.5 / 3.3) * 4095 ≈ 1861
。
-
-
读取结果(人获取信息):
-
你:从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引脚测量模拟信号的高级能力。 它们是功能上的补充关系。