【STM32】江科大ADC模数转换器详解:纯知识点梳理与原理剖析

📅 2026/8/3 17:09:38 👁️ 阅读次数 📝 编程学习
【STM32】江科大ADC模数转换器详解:纯知识点梳理与原理剖析

🚀 我的STM32学习专栏:[点击直达 | 持续更新中]

前言

如果你已经跟着江科大的视频一路学到了 ADC 这一章,恭喜你——你已经摸到了 STM32 最实用的功能之一。说实话,GPIO 点灯、定时器 PWM 这些虽然重要,但总归是单片机自己在"自嗨";而ADC 才是真正让单片机"感知"外部世界的眼睛。从电位器的旋钮角度,到温度传感器的毫伏信号,再到电池电压的实时监控,几乎所有涉及"测量"的项目都离不开 ADC。

但这章的知识点也是出了名的"碎":规则组、注入组、扫描、连续、采样时间、校准、触发源……光听名字就让人头大。我第一次看视频的时候,光是"四种转换模式"就来回拖了三次进度条,还是有点懵。

所以这篇文章,我把自己的手写笔记重新梳理了一遍,不贴代码、不讲寄存器细节,纯粹从"原理"和"结构"的角度,把 ADC 的知识点串成一条线。文章会按照"是什么 → 有什么 → 怎么转 → 谁来喊 → 转多久 → 怎么接"的顺序展开,配合江科大的框图和时序图,争取让你看完一遍就能在脑子里搭起 ADC 的知识框架。

建议准备好你的笔记本,对照着《STM32F10xxx参考手册》第 11 章一起看,效果会更好。如果某个概念看完还是模糊,欢迎在评论区留言,咱们一起把它掰扯清楚。

一、ADC 到底是干啥的?

咱们学单片机,打交道最多的就是数字量:0 和 1。但现实世界是模拟的,温度、湿度、光照、电压……这些连续变化的量怎么让单片机"感知"到呢?这时候就需要ADC(Analog-to-Digital Converter,模数转换器)登场了。

1.1ADC基本概念

ADCAnalog-Digital Converter)模拟-数字转换器

ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁

12位逐次逼近型ADC1us转换时间

输入电压范围:0~3.3V,转换结果范围:0~4095

18个输入通道,可测量16个外部和2个内部信号源

规则组和注入组两个转换单元

模拟看门狗自动监测输入电压范围

STM32F103C8T6ADC资源:ADC1ADC210个外部输入通道

我的理解:你可以把 ADC 想象成一座"桥梁",它把引脚上连续变化的模拟电压(比如 0~3.3V 之间的任意值)翻译成单片机内存里能存储的数字变量(比如 0~4095 的整数)。没有这座桥,单片机就是个"数字瞎子",根本看不懂模拟世界的信号。

STM32F103 内部集成的 ADC 有几个硬核参数,面试常考,先记牢:

参数数值含义
分辨率12位数字量范围 0∼212−1 ,即0~4095
转换时间1μs最快 1 微秒就能转完一次
最快转换频率1MHz每秒最多采 100 万次
输入电压范围0~3.3V超过 3.3V 会烧芯片!负电压也不行!
通道总数18个16 个外部通道(GPIO口)+ 2 个内部信号源

⚠️ADC 引脚严禁直接接入超过 3.3V 的电压!如果你要测 5V 或更高的电压,必须先用电阻分压(后面硬件电路部分会讲)。否则轻则读数错误,重则芯片报废。


二、STM32 的 ADC "家底"有多厚?

2.1 通道分类

18 个通道里,有16 个外部通道对应 GPIO 口(PA0~PA7、PB0~PB1、PC0~PC5 等),还有2 个内部通道

  • 通道 16:内部温度传感器(可以测芯片温度,做过热保护)

  • 通道 17:内部参考电压 VREFINT​ (固定 1.2V,可做校准参考)

但是!咱们用的C8T6(64脚小容量)资源是砍过的,它只有ADC1 和 ADC2,外部输入通道只有10 个(PA0~PA7 + PB0~PB1)。PC0~PC5 在 C8T6 上是没有的,这点要特别注意,别照着大容量芯片的引脚表去接线!

ADC基本结构与通道引脚复用关系

从上面的表格能清楚看到,C8T6 的 ADC3 那一列基本是废的,通道 10~15 直接都没有。所以做项目选型的时候,如果你需要采集 10 路以上的模拟量,C8T6 就不够用了,得换 C8T6 的大哥(比如 RCT6)。

2.2 规则组 vs 注入组

这是 ADC 里最容易让人蒙圈的概念。STM32 的 ADC 有两个转换单元:

  • 规则组(Regular Group):常规使用的通道,相当于"主线程"。你平时采集电位器、传感器电压,都走这里。

  • 注入组(Injected Group):突发事件用的通道,相当于"中断"。比如电机控制里,突然要插入一路电流检测,可以打断规则组的转换,优先执行注入组。

我的理解:你可以把规则组想象成医院的主诊室,按部就班叫号看病;注入组就是急诊室,发生重大事件(定时器触发)时直接插队。规则组最多能塞16 个通道,注入组最多塞4 个通道

单个ADC框图

从框图里能看得很清楚:18 路输入先经过"模拟多路开关"选择,然后分成两路,上面是注入通道(最多 4 路),下面是规则通道(最多 16 路),最后都进入那个"模拟至数字转换器"(核心就是逐次比较)。


三、逐次逼近型 ADC 是怎么"猜"出电压的?

STM32 用的是逐次逼近型(SAR)ADC。它的原理特别像"猜数字游戏":

  1. 内部有一个 DAC,它先输出一个参考电压(比如 1.65V,也就是量程的一半)。

  2. 比较器把这个 DAC 电压和外部输入电压做比较。

  3. 如果输入电压比 DAC 高,就把数字量的最高位记为 1;如果低,就记为 0。

  4. 然后 DAC 再调整输出(比如 3/4 量程或 1/4 量程),继续比较下一位。

  5. 重复 12 次(因为 STM32 是 12 位 ADC),就得到了 12 位的二进制结果。

ADC0809逐次逼近型框图

图中那个SAR(逐次逼近寄存器)就是负责"猜数字"的大脑,DAC负责产生比较的参考电压,比较器负责判断大小。EOC(End Of Conversion)是转换结束信号,变成高电平就说明"猜完了",可以去读数了。


四、规则组的 4 种转换模式(核心中的核心)

这是配置 ADC 时必须搞懂的!ADC 的转换模式由两个参数决定:是否扫描(Scan)是否连续(Continuous),两两组合就是 4 种模式。

4.1 单次转换 + 非扫描模式

  • 特点:只转换规则组序列 1 里的那一个通道,转完一次就停下来。

  • 怎么触发:每次转换都需要手动触发一次(软件触发或硬件触发)。

  • 适用场景:只需要偶尔采一次样的情况,比如按一下按键测一次电压。

我的理解:就像你手动按一次快门拍一张照片,拍完相机就待机了,想再拍必须再按一次。

4.2 连续转换 + 非扫描模式

  • 特点:只转换序列 1 的那个通道,但触发一次后就会一直连续不断地转,不需要你再手动触发。

  • 适用场景:需要实时监控单一信号,比如一直盯着电池电压。

我的理解:这次你把相机调成了录像模式,按一次录制键,它就一直在拍,直到你喊停。

4.3 单次转换 + 扫描模式

  • 特点:一次触发,会把规则组序列里配置的所有通道按顺序扫一遍,全部转完后产生一个 EOC 信号,然后停下来。

  • 注意:通道数目(Channel Count)必须配置正确,比如配置了 7 个通道,它就会从序列 1 走到序列 7。

  • 适用场景:一次性批量采集多路信号。

我的理解:就像去饭店吃饭,你只用点一次餐(触发一次),老板就会把你所有的菜(通道1、2、3……)全部做完,最后上完拿到菜单(EOC)就结束。

4.4 连续转换 + 扫描模式

  • 特点:触发一次,把所有通道扫一遍,扫完后不停车,立刻从头再来,无限循环。

  • 适用场景:多通道实时监控,比如同时采集温度、湿度、光照。

  • 注意:这种模式如果不用 DMA,CPU 会被中断频繁打断,效率极低。所以实际项目中,扫描模式通常配合 DMA 使用(DMA 自动搬运数据,不用 CPU 操心)。

我的理解:这就是直播间的多机位轮播,摄像机 1、2、3、4 轮流切画面,切完一轮再来一轮,永不停歇。


五、谁来"喊开始"?——触发控制

ADC 不会自己无缘无故开始转换,必须有个"发令枪"。这个发令枪可以是软件触发,也可以是硬件触发

触发控制与转换时间

5.1 软件触发

在程序里手动置位 SWSTART 控制位,这就是软件触发。简单直接,适合初学者做实验。

5.2 硬件触发

硬件触发源非常多,包括:

  • 定时器触发:TIM1、TIM2、TIM3、TIM4 的 TRGO 或捕获比较事件。这是最常用的!比如你想每 10ms 采集一次,不用 CPU 定时去喊,让 TIM2 每 10ms 自动触发一次 ADC,多省心。

  • 外部中断触发:EXTI_11(规则组)、EXTI_15(注入组)。

  • 外部引脚触发:ADCx_ETRG 引脚。

注意:ADC3 的触发源和 ADC1/ADC2 是不一样的(大容量产品才有 ADC3),C8T6 不用管这个。


六、转换一次要花多久?

ADC 转换不是瞬间完成的,它分为几步:采样 → 保持 → 量化 → 编码

总转换时间的公式:

Tconv​=采样时间+12.5 个 ADC 周期

  • 12.5 个周期:逐次逼近比较固定要花的"硬时间",12位精度对应 12 个周期,加上额外的 0.5 个周期是内部开销。

  • 采样时间:可配置,STM32 提供了 1.5、7.5、13.5、28.5、41.5、55.5、71.5、239.5 个周期这 8 档。

举个例子(江科大经典例题):

如果 ADCCLK = 14MHz,采样时间选 1.5 个周期:

Tconv​=1.5+12.5=14 个 ADC 周期=14MHz14​=1μs

我的理解:采样时间就像你用杯子接水,接得越久(采样时间越长),水面的波动越平稳(信号越稳定),但总的转换时间就越长。如果你测的信号源内阻很大(比如传感器输出能力弱),就必须把采样时间设长一点,否则精度会很差。

⚠️ADCCLK 不能超过 14MHz!系统主频 72MHz 进来,RCC 只能给 ADC 预分频器选6 分频(72/6=12MHz)或8 分频(72/8=9MHz)。选 4 分频就超频了,STM32 不保证能正常工作!


七、校准:让 ADC 更"准"一点

STM32 的 ADC 内部有自校准电路。芯片内部的电容阵列在生产制造时会有微小偏差,校准的作用就是测量并补偿这些偏差。

关键点

  • 建议每次上电后执行一次校准

  • 根据手册,启动校准前 ADC 必须处于关电状态超过至少两个 ADC 时钟周期(实际配置中,通常先使能 ADC,等待稳定后再执行校准流程)。


八、硬件电路怎么接?

ADC 测电压,可不是直接把线怼到引脚上就完事了。江科大课程里讲了三种经典电路:

硬件电路

8.1 电位器电路(最常用)

一个 10K 电位器,两端分别接 3.3V 和 GND,中间抽头接 PA0。拧电位器,PA0 的电压就在 0~3.3V 之间线性变化,ADC 读数就在 0~4095 之间变化。这是初学者做实验的首选电路。

8.2 传感器输出电压电路

比如 NTC 热敏电阻分压电路。固定电阻和热敏电阻串联,中间接 PA1。温度变化 → 热敏电阻阻值变化 → PA1 电压变化 → ADC 读数变化。这种电路在温度采集项目中非常常见。

8.3 电压转换电路(0~5V → 0~3.3V)

如果你要测一个 0~5V 的信号,不能直接怼到 STM32 引脚上!必须用电阻分压,比如 R1=17K、R2=33K,把 5V 按比例压缩到 3.3V 以内,再接到 PA2。

⚠️再次强调,任何情况下 ADC 引脚电压都不能超过 3.3V!如果你不确定外部信号电压范围,建议在输入端加钳位保护电路(TVS 管或肖特基二极管)。


九、个人理解 / 心得板块

说实话,ADC 这一章是我学 STM32 以来笔记记得最多的一章。刚开始看到"规则组"、"注入组"、"扫描"、"连续"这几个词的时候,脑子里是一团浆糊,一个头两个大,完全不知道该怎么组合。后来我把江科大的视频暂停了不下十遍,对着框图一笔一画地理,突然发现——其实 ADC 就两个核心问题:①你要采几个通道?②采完一次是停还是继续?

四个模式的名字虽然拗口,但你只要问自己这两个问题,答案就出来了。比如我只采一个电位器,偶尔看一下电压,那就是"单次+非扫描";我要一直监控电池电压,那就是"连续+非扫描";我要同时采温度和光照两个传感器,那就是"单次+扫描"(或者配合 DMA 的"连续+扫描")。

还有那个采样时间,我以前以为设得越短越好,这样转换快。直到我把采样时间从 239.5 改成 1.5 之后,发现电位器拧到中间时读数跳变很厉害,才明白采样时间不够,电容没充满,读出来当然不准。速度和精度永远是矛盾的,这句话在 ADC 这里体现得淋漓尽致。


十、踩坑记录

踩坑现象原因分析解决方法
ADC 读数始终是 4095,拧电位器没反应PA0 引脚没有配置成模拟输入模式(AIN),而是配成了浮空输入或复用推挽,数字电路干扰了模拟信号把 GPIO 模式改成GPIO_Mode_AIN
读数在 0~几百之间跳动,很不稳定电位器质量差,或者电源纹波太大,也可能是采样时间设太短换质量好一点的电位器;在 PA0 和 GND 之间并联一个 100nF 瓷片电容滤波;适当加大采样时间
校准函数卡死,程序死在等待循环里校准时 ADC 没有正确使能,或者时钟没开检查 RCC 是否使能了 ADC1 时钟;确保 ADC 使能命令在校准之前已经执行

十一、总结表格

最后,用一张表格把 ADC 的核心知识点打包带走,建议收藏:

知识点关键内容备注
分辨率12位结果范围 0~4095
量程0~3.3V严禁超压!5V 信号需分压
通道数18路(16外部+2内部)C8T6 只有 10 个外部通道
转换单元规则组(16通道)、注入组(4通道)规则组常规用,注入组应急用
触发方式软件触发 / 硬件触发(定时器、外部中断)定时器触发可实现定时采样
4种模式单次/连续 × 扫描/非扫描核心中的核心,必须理解
数据对齐左对齐 / 右对齐一般选右对齐,直接读就是有效值
转换时间采样时间 + 12.5 个 ADC 周期ADCCLK ≤ 14MHz
校准每次上电执行一次消除内部电容偏差
DMA 配合扫描模式建议配合 DMA减轻 CPU 负担,提高效率

写这篇文章的时候,我把江科大的视频又回顾了一遍,发现之前很多模棱两可的概念,现在理解得更透彻了。STM32 的 ADC 虽然寄存器很多,但只要抓住规则组/注入组、扫描/非扫描、单次/连续这三对核心概念,再配合框图去理解,其实一点都不难。建议大家一定要对着笔记图自己画一遍框图,理一理数据流向,这样印象才会深刻。

📌开发环境:Keil5 + STM32F103C8T6最小系统板 + ST-Link
📌参考资料:江科大STM32入门教程、《STM32F10xxx参考手册》

如果本文对你有帮助,欢迎点赞 👍 收藏 ⭐ !有任何问题欢迎在评论区交流,一起学习进步!