恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
【STM32】江科大ADC模数转换器详解:纯知识点梳理与原理剖析
首页
资讯中心
/
【STM32】江科大ADC模数转换器详解:纯知识点梳理与原理剖析
【STM32】江科大ADC模数转换器详解:纯知识点梳理与原理剖析
发布时间:2026/8/3 17:03:48
我的STM32学习专栏[点击直达 | 持续更新中]前言如果你已经跟着江科大的视频一路学到了 ADC 这一章恭喜你——你已经摸到了 STM32 最实用的功能之一。说实话GPIO 点灯、定时器 PWM 这些虽然重要但总归是单片机自己在自嗨而ADC 才是真正让单片机感知外部世界的眼睛。从电位器的旋钮角度到温度传感器的毫伏信号再到电池电压的实时监控几乎所有涉及测量的项目都离不开 ADC。但这章的知识点也是出了名的碎规则组、注入组、扫描、连续、采样时间、校准、触发源……光听名字就让人头大。我第一次看视频的时候光是四种转换模式就来回拖了三次进度条还是有点懵。所以这篇文章我把自己的手写笔记重新梳理了一遍不贴代码、不讲寄存器细节纯粹从原理和结构的角度把 ADC 的知识点串成一条线。文章会按照是什么 → 有什么 → 怎么转 → 谁来喊 → 转多久 → 怎么接的顺序展开配合江科大的框图和时序图争取让你看完一遍就能在脑子里搭起 ADC 的知识框架。建议准备好你的笔记本对照着《STM32F10xxx参考手册》第 11 章一起看效果会更好。如果某个概念看完还是模糊欢迎在评论区留言咱们一起把它掰扯清楚。一、ADC 到底是干啥的咱们学单片机打交道最多的就是数字量0 和 1。但现实世界是模拟的温度、湿度、光照、电压……这些连续变化的量怎么让单片机感知到呢这时候就需要ADCAnalog-to-Digital Converter模数转换器登场了。1.1ADC基本概念•ADCAnalog-Digital Converter模拟-数字转换器•ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量建立模拟电路到数字电路的桥梁•12位逐次逼近型ADC1us转换时间•输入电压范围0~3.3V转换结果范围0~4095•18个输入通道可测量16个外部和2个内部信号源•规则组和注入组两个转换单元•模拟看门狗自动监测输入电压范围•STM32F103C8T6ADC资源ADC1、ADC210个外部输入通道我的理解你可以把 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可做校准参考但是咱们用的C8T664脚小容量资源是砍过的它只有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 用的是逐次逼近型SARADC。它的原理特别像猜数字游戏内部有一个 DAC它先输出一个参考电压比如 1.65V也就是量程的一半。比较器把这个 DAC 电压和外部输入电压做比较。如果输入电压比 DAC 高就把数字量的最高位记为 1如果低就记为 0。然后 DAC 再调整输出比如 3/4 量程或 1/4 量程继续比较下一位。重复 12 次因为 STM32 是 12 位 ADC就得到了 12 位的二进制结果。ADC0809逐次逼近型框图图中那个SAR逐次逼近寄存器就是负责猜数字的大脑DAC负责产生比较的参考电压比较器负责判断大小。EOCEnd 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 连续转换 扫描模式特点触发一次把所有通道扫一遍扫完后不停车立刻从头再来无限循环。适用场景多通道实时监控比如同时采集温度、湿度、光照。注意这种模式如果不用 DMACPU 会被中断频繁打断效率极低。所以实际项目中扫描模式通常配合 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 是不一样的大容量产品才有 ADC3C8T6 不用管这个。六、转换一次要花多久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 个周期Tconv1.512.514 个 ADC 周期14MHz141μs我的理解采样时间就像你用杯子接水接得越久采样时间越长水面的波动越平稳信号越稳定但总的转换时间就越长。如果你测的信号源内阻很大比如传感器输出能力弱就必须把采样时间设长一点否则精度会很差。⚠️ADCCLK 不能超过 14MHz系统主频 72MHz 进来RCC 只能给 ADC 预分频器选6 分频72/612MHz或8 分频72/89MHz。选 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 引脚上必须用电阻分压比如 R117K、R233K把 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参考手册》如果本文对你有帮助欢迎点赞 收藏 ⭐ 有任何问题欢迎在评论区交流一起学习进步