代码改变世界

二十一、STM32的ADC(一)(ADC介绍) - 详解

2026-01-24 14:14  tlnshuju  阅读(2)  评论(0)    收藏  举报

前言:在 STM32 系列单片机的外设中,ADC(Analog to Digital Converter,模数转换器)是最常用、也最基础的模块之一。它是 MCU 与现实世界传感器之间的桥梁。无论是温度、电压、电流,还是光照强度、声音信号,只要是模拟信号,最终都要通过 ADC 转换成数字信号,才能被 MCU 处理。

目录

什么?为什么要用它?就是一、ADC

二、STM32C8T6 的 ADC 模块概览

三、ADC 的基本结构与工作过程

四、ADC 的常见工作模式与应用场景

五、ADC 的代码编写思路

六、ADC 校准的重要性

七、总结


一、ADC 是什么?为什么要用它?

STM32 的 ADC 模块可以把0~3.3V 的连续模拟电压信号,转换成一个0~4095 的数字值(12 位精度)。
举个例子:

1.当输入电压为 0V 时,ADC 输出 0。

2.当输入电压为 3.3V 时,ADC 输出 4095。

3.当输入电压为 1.65V 时,输出大约 2048。

换句话说,ADC 就像一把把电压“刻度化”的尺子。
MCU 读到这个数字后,就能根据比例关系还原真实电压值,从而判断传感器的状态。

二、STM32C8T6 的 ADC 模块概览

STM32F103C8T6 内部集成了两路 12 位 ADC:

1.ADC1

2.ADC2

它们可以独立使用,也能够同时工作,用于同步采样或双模式采集。

主要特性如下:

三、ADC 的基本结构与工作过程

理解 ADC 的内部结构,有助于你在编写代码时更有方向感。
STM32 的 ADC 内部主要包括以下几个模块:

1.模拟多路选择器(MUX)
负责在多个通道中选择要采样的输入信号,比如 PA0(通道0)或 PA1(通道1)。

2.采样保持电路(Sample & Hold)
将瞬时电压“抓取”并保持,供后续转换使用。
采样时间越长,精度越高,但转换速度越慢。

3.逐次逼近寄存器(SAR)
通过比较器逐位确定输入信号对应的数字值,是 ADC 的核心。

4.数据寄存器(DR)
保存转换结果,CPU 或 DMA 可直接读取。

在编写代码时,我们最终的目标,就是让 MCU:

1.选择合适的通道;

2.启动采样与转换;

3.等待或中断通知;

4.从 DR 寄存器读取转换结果。

四、ADC 的常见工作模式与应用场景

1. 单次转换模式

一次启动,只转换一个通道一次。适合偶尔采样,如检测一次电池电压。

2. 连续转换模式

启动后,ADC 自动连续采样。适合实时监控信号,如温度变化。

3. 扫描模式

行依次采集多个通道的信息。常用于多传感器场景,比如采集多个电位器或电压点。

4. 触发模式

通过外部信号(如定时器、外部中断)启动采样。适合需要精准时间同步的应用。

5. DMA 模式

自动把采样结果搬运到内存,不占用 CPU。
在代码中,这通常需要配置 DMA 通道、数据长度和目标地址。

五、ADC 的代码编写思路

可以将 ADC 的编程步骤理解为 6 个阶段:

① 开启时钟

STM32 的外设必须先开启对应时钟。
在代码中,通常会为 GPIO 和 ADC 各自使能时钟。

思路:
在编写代码时,记得先打开 RCC_APB2ENR 寄存器中对应位,例如开启 ADC1 和 GPIOA。

② 配置输入引脚

ADC 通道通常对应某些特定引脚(如 PA0 → ADC1_IN0)。
这些引脚必须配备为 模拟输入模式,不能是推挽输出或浮空输入。

思路:
配备 GPIO 模式寄存器为 Analog Input,这样引脚才能正确采样模拟信号。

③ 配置 ADC 参数

接着配置 ADC 的工作模式,如:

分辨率(默认 12 位)

转换模式(单次 / 连续 / 扫描)

材料对齐方式(右对齐/左对齐)

通道采样时间(决定速度与精度)

思路:
经过设置控制寄存器 ADC_CR1、ADC_CR2 和采样时间寄存器 ADC_SMPRx 实现。

④ 选择通道并设置转换顺序

STM32 的 ADC 帮助多个通道采样。
通道选择与顺序由 ADC_SQRx 寄存器控制。

思路:
如果只采样一个通道,只需指定通道编号;
若是多通道扫描,就依次填入每个通道的序号。

⑤ 启动 ADC 并读取结果

代码中一般通过“软件启动”或“定时器触发”启动转换。
转换达成后,能够通过中断或查询状态标志来读取结果寄存器(DR)的值。

思路:
你行选择“轮询法”定期读取,或者开启“EOC(转换结束中断)”自动处理。

⑥ 数据处理与转换

一个数字值(0~4095),你应该根据公式换算成实际电压或物理量:就是ADC 返回的

思路:
在应用层代码中,把数字量转为工程量(例如温度、电流、电压等),再做后续逻辑处理。

六、ADC 校准的重要性

在正式开始采样前,STM32 的 ADC 通常要求进行校准(Calibration)。
校准的目的是消除内部偏差,让采样结果更接近真实值。

思路:
在代码中,初始化 ADC 时加一个“启动校准”的步骤,并等待校准做完标志位。

七、总结

连接模拟世界与数字世界的关键外设。就是STM32C8T6 的 ADC 模块结构灵活、精度高、速度快,
只要你掌握了配置的逻辑,编写 ADC 代码就会变得非常自然:

“开时钟 → 配 GPIO → 配 ADC → 选通道 → 启动转换 → 读取结果”。