二十一、STM32的ADC(一)(ADC介绍)
前言:在 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(转换结束中断)”自动处理。
⑥ 数据处理与转换
ADC 返回的是一个数字值(0~4095),你需要根据公式换算成实际电压或物理量:

思路:
在应用层代码中,把数字量转为工程量(例如温度、电流、电压等),再做后续逻辑处理。
六、ADC 校准的重要性
在正式开始采样前,STM32 的 ADC 通常需要进行校准(Calibration)。
校准的目的是消除内部偏差,让采样结果更接近真实值。
思路:
在代码中,初始化 ADC 时加一个“启动校准”的步骤,并等待校准完成标志位。
七、总结
STM32C8T6 的 ADC 模块结构灵活、精度高、速度快,是连接模拟世界与数字世界的关键外设。
只要你掌握了配置的逻辑,编写 ADC 代码就会变得非常自然:
“开时钟 → 配 GPIO → 配 ADC → 选通道 → 启动转换 → 读取结果”。
