ADC 原理与转换模式
对应课程:7-1 ADC 模数转换器,ADC 介绍上
课堂转写:
2026-09-04 19_12 记录 ADC介绍上_原文.docx整理日期:2026-09-04
芯片:STM32F103C8T6
资料补全:教师 PPT 第 86~99 页、师兄笔记 PDF 第 70~74 页、STM32F10xxx 参考手册 ADC 章节
本节边界:本节讲 ADC 原理、内部结构、通道、转换模式、触发、对齐、转换时间、校准和外围电路;单通道、多通道程序及 DMA 实现留到后续课程。
1. 老师的整条思路
老师先用电位器和三个模拟传感器演示"连续电压如何变成数值",再从 ADC 的用途、分辨率和速度切入;接着借 ADC0809 说明逐次逼近原理,然后回到 STM32 的 ADC 框图,依次拆解规则组、注入组、触发源、ADC 时钟、模拟看门狗、输入通道、四种转换模式、数据对齐、转换时间、校准和外围分压电路。
#mermaid-svg-ktNfo1aeu6sOJgcl{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ktNfo1aeu6sOJgcl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ktNfo1aeu6sOJgcl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ktNfo1aeu6sOJgcl .error-icon{fill:#552222;}#mermaid-svg-ktNfo1aeu6sOJgcl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ktNfo1aeu6sOJgcl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ktNfo1aeu6sOJgcl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ktNfo1aeu6sOJgcl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ktNfo1aeu6sOJgcl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ktNfo1aeu6sOJgcl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ktNfo1aeu6sOJgcl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ktNfo1aeu6sOJgcl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ktNfo1aeu6sOJgcl .marker.cross{stroke:#333333;}#mermaid-svg-ktNfo1aeu6sOJgcl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ktNfo1aeu6sOJgcl p{margin:0;}#mermaid-svg-ktNfo1aeu6sOJgcl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ktNfo1aeu6sOJgcl .cluster-label text{fill:#333;}#mermaid-svg-ktNfo1aeu6sOJgcl .cluster-label span{color:#333;}#mermaid-svg-ktNfo1aeu6sOJgcl .cluster-label span p{background-color:transparent;}#mermaid-svg-ktNfo1aeu6sOJgcl .label text,#mermaid-svg-ktNfo1aeu6sOJgcl span{fill:#333;color:#333;}#mermaid-svg-ktNfo1aeu6sOJgcl .node rect,#mermaid-svg-ktNfo1aeu6sOJgcl .node circle,#mermaid-svg-ktNfo1aeu6sOJgcl .node ellipse,#mermaid-svg-ktNfo1aeu6sOJgcl .node polygon,#mermaid-svg-ktNfo1aeu6sOJgcl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ktNfo1aeu6sOJgcl .rough-node .label text,#mermaid-svg-ktNfo1aeu6sOJgcl .node .label text,#mermaid-svg-ktNfo1aeu6sOJgcl .image-shape .label,#mermaid-svg-ktNfo1aeu6sOJgcl .icon-shape .label{text-anchor:middle;}#mermaid-svg-ktNfo1aeu6sOJgcl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ktNfo1aeu6sOJgcl .rough-node .label,#mermaid-svg-ktNfo1aeu6sOJgcl .node .label,#mermaid-svg-ktNfo1aeu6sOJgcl .image-shape .label,#mermaid-svg-ktNfo1aeu6sOJgcl .icon-shape .label{text-align:center;}#mermaid-svg-ktNfo1aeu6sOJgcl .node.clickable{cursor:pointer;}#mermaid-svg-ktNfo1aeu6sOJgcl .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ktNfo1aeu6sOJgcl .arrowheadPath{fill:#333333;}#mermaid-svg-ktNfo1aeu6sOJgcl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ktNfo1aeu6sOJgcl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ktNfo1aeu6sOJgcl .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ktNfo1aeu6sOJgcl .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ktNfo1aeu6sOJgcl .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ktNfo1aeu6sOJgcl .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ktNfo1aeu6sOJgcl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ktNfo1aeu6sOJgcl .cluster text{fill:#333;}#mermaid-svg-ktNfo1aeu6sOJgcl .cluster span{color:#333;}#mermaid-svg-ktNfo1aeu6sOJgcl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ktNfo1aeu6sOJgcl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ktNfo1aeu6sOJgcl rect.text{fill:none;stroke-width:0;}#mermaid-svg-ktNfo1aeu6sOJgcl .icon-shape,#mermaid-svg-ktNfo1aeu6sOJgcl .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ktNfo1aeu6sOJgcl .icon-shape p,#mermaid-svg-ktNfo1aeu6sOJgcl .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ktNfo1aeu6sOJgcl .icon-shape .label rect,#mermaid-svg-ktNfo1aeu6sOJgcl .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ktNfo1aeu6sOJgcl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ktNfo1aeu6sOJgcl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ktNfo1aeu6sOJgcl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 电位器或传感器输出模拟电压
ADC 通道选择
采样并保持输入电压
SAR 逐次逼近量化
得到 12 位数字结果
写入数据寄存器
置位 EOC 或请求中断 DMA
软件读取并换算电压
课堂时间线:
| 时间 | 内容 |
|---|---|
| 00:06~02:02 | 单通道、多通道程序现象 |
| 02:02~06:00 | ADC 定义、分辨率、速度、通道与功能概览 |
| 06:00~10:05 | ADC0809 与逐次逼近原理 |
| 10:05~16:06 | STM32 ADC 总体框图、分组、触发、时钟和中断 |
| 16:06~19:01 | ADC 基本结构、输入通道、双 ADC 简介 |
| 19:01~21:57 | 四种规则组转换模式 |
| 22:11~26:31 | 触发、数据对齐、转换时间和校准 |
| 26:31~28:25 | 电位器、传感器分压和 5 V 电压缩放电路 |
| 28:25~31:27 | 参考手册章节与寄存器索引 |
2. ADC 到底解决什么问题
GPIO 数字输入只能把引脚判断为 0 或 1,不能直接告诉程序"现在是 1.27 V"。ADC(Analog-Digital Converter,模数转换器)把连续变化的模拟电压量化成离散数字,成为模拟世界与程序之间的桥梁。

图 1 老师 PPT 第 86 页:STM32F103 ADC 的主要能力。
以本课程的 12 位 ADC 为例:
- 输入电压范围由
VREF-和VREF+决定;当前板上近似为 0~3.3 V; - 数字结果范围为 0~4095;
- 电位器旋到最低时接近 0,旋到最高时接近 4095;
- 传感器把光线、温度、反射强度等物理量先变成电压,ADC 再把电压变成程序可处理的数值。
课堂把 ADC 比作"电压表"很直观,但要记住它测得的是相对参考电压的量化值,并非天然准确的高精度仪表。
2.1 ADC、DAC 与 PWM 的区别
| 模块 | 转换方向 | 典型用途 |
|---|---|---|
| ADC | 模拟电压 → 数字值 | 读取传感器、电池电压、电位器 |
| DAC | 数字值 → 模拟电压 | 波形发生、音频、偏置电压 |
| PWM | 数字脉冲 → 平均效果 | LED 调光、电机调速、开关电源 |
PWM 只有高、低两个瞬时电平,但通过占空比控制平均能量,效率高,所以很多功率控制场景不需要真正的 DAC。ADC 与它们的方向相反:ADC 是"读取模拟世界"。
3. 12 位分辨率和电压怎样换算
3.1 为什么最大值是 4095
12 位可以表示:
212=4096 2^{12}=4096 212=4096
个离散码,编码从 0 开始,所以最大码为:
212−1=4095 2^{12}-1=4095 212−1=4095
若 VREF+=3.3 V、VREF-=0 V,一个理想 LSB 的电压宽度约为:
VLSB=3.34096≈0.0008057 V=0.806 mV V_{LSB}=\frac{3.3}{4096}\approx0.0008057\text{ V}=0.806\text{ mV} VLSB=40963.3≈0.0008057 V=0.806 mV
3.2 由 AD 值估算电压
课程显示换算通常采用端点比例:
Vin≈AD4095×VREF V_{in}\approx\frac{AD}{4095}\times V_{REF} Vin≈4095AD×VREF
例如 AD=2048、参考电压近似 3.3 V:
Vin≈20484095×3.3≈1.65 V V_{in}\approx\frac{2048}{4095}\times3.3\approx1.65\text{ V} Vin≈40952048×3.3≈1.65 V
程序若用整数表示毫伏,可以写成数学形式:
VmV≈AD×33004095 V_{mV}\approx\frac{AD\times3300}{4095} VmV≈4095AD×3300
例如 AD=3102:
VmV≈3102×33004095≈2500 mV V_{mV}\approx\frac{3102\times3300}{4095}\approx2500\text{ mV} VmV≈40953102×3300≈2500 mV
3.3 为什么有时公式分母写 4096
VREF/4096 描述的是理想量化台阶宽度;AD/4095×VREF 是常用的端点显示换算,让 4095 显示为 VREF。两者用途略有区别,不应混为"谁绝对正确"。实际 ADC 还存在偏置、增益、非线性和参考电压误差,显示精度通常远低于 0.806 mV。
工程补充: 如果 VDDA 实际不是 3.300 V,直接乘 3.3 会产生比例误差。STM32 可读取内部 VREFINT 来估计实际 VDDA,再修正外部通道电压;本节只介绍了这个思路,代码尚未展开。
4. 逐次逼近 ADC 怎样找到未知电压

图 2 老师 PPT 第 87 页:用 ADC0809 结构帮助理解 SAR ADC。
逐次逼近 ADC 的核心模块包括:
- 模拟多路开关:从多个输入中选一路;
- 采样保持:在转换期间暂存待测电压;
- DAC:根据试探数字生成一个已知电压;
- 比较器:比较待测电压和 DAC 电压;
- SAR:从最高位到最低位逐位试探;
- 时钟、启动 START 和转换结束 EOC。
#mermaid-svg-17U0ZHigX2KIKzby{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-17U0ZHigX2KIKzby .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-17U0ZHigX2KIKzby .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-17U0ZHigX2KIKzby .error-icon{fill:#552222;}#mermaid-svg-17U0ZHigX2KIKzby .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-17U0ZHigX2KIKzby .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-17U0ZHigX2KIKzby .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-17U0ZHigX2KIKzby .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-17U0ZHigX2KIKzby .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-17U0ZHigX2KIKzby .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-17U0ZHigX2KIKzby .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-17U0ZHigX2KIKzby .marker{fill:#333333;stroke:#333333;}#mermaid-svg-17U0ZHigX2KIKzby .marker.cross{stroke:#333333;}#mermaid-svg-17U0ZHigX2KIKzby svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-17U0ZHigX2KIKzby p{margin:0;}#mermaid-svg-17U0ZHigX2KIKzby .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-17U0ZHigX2KIKzby .cluster-label text{fill:#333;}#mermaid-svg-17U0ZHigX2KIKzby .cluster-label span{color:#333;}#mermaid-svg-17U0ZHigX2KIKzby .cluster-label span p{background-color:transparent;}#mermaid-svg-17U0ZHigX2KIKzby .label text,#mermaid-svg-17U0ZHigX2KIKzby span{fill:#333;color:#333;}#mermaid-svg-17U0ZHigX2KIKzby .node rect,#mermaid-svg-17U0ZHigX2KIKzby .node circle,#mermaid-svg-17U0ZHigX2KIKzby .node ellipse,#mermaid-svg-17U0ZHigX2KIKzby .node polygon,#mermaid-svg-17U0ZHigX2KIKzby .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-17U0ZHigX2KIKzby .rough-node .label text,#mermaid-svg-17U0ZHigX2KIKzby .node .label text,#mermaid-svg-17U0ZHigX2KIKzby .image-shape .label,#mermaid-svg-17U0ZHigX2KIKzby .icon-shape .label{text-anchor:middle;}#mermaid-svg-17U0ZHigX2KIKzby .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-17U0ZHigX2KIKzby .rough-node .label,#mermaid-svg-17U0ZHigX2KIKzby .node .label,#mermaid-svg-17U0ZHigX2KIKzby .image-shape .label,#mermaid-svg-17U0ZHigX2KIKzby .icon-shape .label{text-align:center;}#mermaid-svg-17U0ZHigX2KIKzby .node.clickable{cursor:pointer;}#mermaid-svg-17U0ZHigX2KIKzby .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-17U0ZHigX2KIKzby .arrowheadPath{fill:#333333;}#mermaid-svg-17U0ZHigX2KIKzby .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-17U0ZHigX2KIKzby .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-17U0ZHigX2KIKzby .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-17U0ZHigX2KIKzby .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-17U0ZHigX2KIKzby .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-17U0ZHigX2KIKzby .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-17U0ZHigX2KIKzby .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-17U0ZHigX2KIKzby .cluster text{fill:#333;}#mermaid-svg-17U0ZHigX2KIKzby .cluster span{color:#333;}#mermaid-svg-17U0ZHigX2KIKzby div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-17U0ZHigX2KIKzby .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-17U0ZHigX2KIKzby rect.text{fill:none;stroke-width:0;}#mermaid-svg-17U0ZHigX2KIKzby .icon-shape,#mermaid-svg-17U0ZHigX2KIKzby .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-17U0ZHigX2KIKzby .icon-shape p,#mermaid-svg-17U0ZHigX2KIKzby .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-17U0ZHigX2KIKzby .icon-shape .label rect,#mermaid-svg-17U0ZHigX2KIKzby .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-17U0ZHigX2KIKzby .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-17U0ZHigX2KIKzby .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-17U0ZHigX2KIKzby :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
有
没有
选中一个模拟输入通道
采样保持获得 Vin
SAR 先尝试最高位为 1
DAC 输出试探电压
试探电压是否高于 Vin
本位清零
本位保留为 1
是否还有更低位
尝试下一位
得到最终数字码
EOC 表示转换完成
以 4 位 ADC 为简化例子,输入约为 0.70×VREF:
| 次数 | 尝试码 | 对应比例 | 比较结果 | 保留结果 |
|---|---|---|---|---|
| 1 | 1000₂=8 |
8/16=0.50 | 低于输入 | 最高位保留 |
| 2 | 1100₂=12 |
12/16=0.75 | 高于输入 | 该位清零 |
| 3 | 1010₂=10 |
10/16=0.625 | 低于输入 | 该位保留 |
| 4 | 1011₂=11 |
11/16=0.6875 | 低于输入 | 该位保留 |
最终得到约 1011₂=11。N 位 ADC 只需按位判断 N 次,而不是从 0 一直试到最大值,这就是"逐次逼近"的意义。
5. STM32 ADC 的基本结构

图 3 老师 PPT 第 89 页:输入、分组、数据寄存器、触发、时钟、看门狗与中断的关系。
#mermaid-svg-PYzcifftuSyzCcLn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PYzcifftuSyzCcLn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PYzcifftuSyzCcLn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PYzcifftuSyzCcLn .error-icon{fill:#552222;}#mermaid-svg-PYzcifftuSyzCcLn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PYzcifftuSyzCcLn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PYzcifftuSyzCcLn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PYzcifftuSyzCcLn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PYzcifftuSyzCcLn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PYzcifftuSyzCcLn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PYzcifftuSyzCcLn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PYzcifftuSyzCcLn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PYzcifftuSyzCcLn .marker.cross{stroke:#333333;}#mermaid-svg-PYzcifftuSyzCcLn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PYzcifftuSyzCcLn p{margin:0;}#mermaid-svg-PYzcifftuSyzCcLn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PYzcifftuSyzCcLn .cluster-label text{fill:#333;}#mermaid-svg-PYzcifftuSyzCcLn .cluster-label span{color:#333;}#mermaid-svg-PYzcifftuSyzCcLn .cluster-label span p{background-color:transparent;}#mermaid-svg-PYzcifftuSyzCcLn .label text,#mermaid-svg-PYzcifftuSyzCcLn span{fill:#333;color:#333;}#mermaid-svg-PYzcifftuSyzCcLn .node rect,#mermaid-svg-PYzcifftuSyzCcLn .node circle,#mermaid-svg-PYzcifftuSyzCcLn .node ellipse,#mermaid-svg-PYzcifftuSyzCcLn .node polygon,#mermaid-svg-PYzcifftuSyzCcLn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PYzcifftuSyzCcLn .rough-node .label text,#mermaid-svg-PYzcifftuSyzCcLn .node .label text,#mermaid-svg-PYzcifftuSyzCcLn .image-shape .label,#mermaid-svg-PYzcifftuSyzCcLn .icon-shape .label{text-anchor:middle;}#mermaid-svg-PYzcifftuSyzCcLn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PYzcifftuSyzCcLn .rough-node .label,#mermaid-svg-PYzcifftuSyzCcLn .node .label,#mermaid-svg-PYzcifftuSyzCcLn .image-shape .label,#mermaid-svg-PYzcifftuSyzCcLn .icon-shape .label{text-align:center;}#mermaid-svg-PYzcifftuSyzCcLn .node.clickable{cursor:pointer;}#mermaid-svg-PYzcifftuSyzCcLn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PYzcifftuSyzCcLn .arrowheadPath{fill:#333333;}#mermaid-svg-PYzcifftuSyzCcLn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PYzcifftuSyzCcLn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PYzcifftuSyzCcLn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PYzcifftuSyzCcLn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PYzcifftuSyzCcLn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PYzcifftuSyzCcLn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PYzcifftuSyzCcLn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PYzcifftuSyzCcLn .cluster text{fill:#333;}#mermaid-svg-PYzcifftuSyzCcLn .cluster span{color:#333;}#mermaid-svg-PYzcifftuSyzCcLn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PYzcifftuSyzCcLn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PYzcifftuSyzCcLn rect.text{fill:none;stroke-width:0;}#mermaid-svg-PYzcifftuSyzCcLn .icon-shape,#mermaid-svg-PYzcifftuSyzCcLn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PYzcifftuSyzCcLn .icon-shape p,#mermaid-svg-PYzcifftuSyzCcLn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PYzcifftuSyzCcLn .icon-shape .label rect,#mermaid-svg-PYzcifftuSyzCcLn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PYzcifftuSyzCcLn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PYzcifftuSyzCcLn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PYzcifftuSyzCcLn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 外部 GPIO 模拟通道
内部温度传感器
内部 VREFINT
模拟多路开关
规则组序列 最多 16 项
注入组序列 最多 4 项
ADC 转换核心
规则数据寄存器 DR 1 个
注入数据寄存器 JDR 4 个
EOC JEOC 状态或中断
模拟看门狗阈值判断
软件 定时器 EXTI 触发
RCC 提供 ADCCLK
5.1 规则组与注入组
| 项目 | 规则组 | 注入组 |
|---|---|---|
| 课堂比喻 | 普通菜单 | 可插队的 VIP 菜单 |
| 序列长度 | 最多 16 次转换 | 最多 4 次转换 |
| 数据寄存器 | 1 个 ADC_DR |
4 个 ADC_JDRx |
| 多通道结果保存 | 常配合 DMA 及时搬运 | 各有寄存器,可分别保存 |
| 课程使用重点 | 后续单/多通道程序主要使用 | 本节了解即可 |
规则组可以排 16 个转换,但只有一个数据寄存器。若连续转换多路而软件不及时读取,前一结果会被后一结果覆盖,因此扫描多通道常与 DMA 配合。
注入组可以在规则组转换期间由更高优先级事件触发,转换完再回到规则序列。它适合突发或同步性更强的测量,本课程不作为当前重点。
5.2 模拟看门狗
模拟看门狗设置高、低阈值,自动监视指定 ADC 通道:
#mermaid-svg-LXVjtpqxgI6b9DNa{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LXVjtpqxgI6b9DNa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LXVjtpqxgI6b9DNa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LXVjtpqxgI6b9DNa .error-icon{fill:#552222;}#mermaid-svg-LXVjtpqxgI6b9DNa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LXVjtpqxgI6b9DNa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LXVjtpqxgI6b9DNa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LXVjtpqxgI6b9DNa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LXVjtpqxgI6b9DNa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LXVjtpqxgI6b9DNa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LXVjtpqxgI6b9DNa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LXVjtpqxgI6b9DNa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LXVjtpqxgI6b9DNa .marker.cross{stroke:#333333;}#mermaid-svg-LXVjtpqxgI6b9DNa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LXVjtpqxgI6b9DNa p{margin:0;}#mermaid-svg-LXVjtpqxgI6b9DNa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LXVjtpqxgI6b9DNa .cluster-label text{fill:#333;}#mermaid-svg-LXVjtpqxgI6b9DNa .cluster-label span{color:#333;}#mermaid-svg-LXVjtpqxgI6b9DNa .cluster-label span p{background-color:transparent;}#mermaid-svg-LXVjtpqxgI6b9DNa .label text,#mermaid-svg-LXVjtpqxgI6b9DNa span{fill:#333;color:#333;}#mermaid-svg-LXVjtpqxgI6b9DNa .node rect,#mermaid-svg-LXVjtpqxgI6b9DNa .node circle,#mermaid-svg-LXVjtpqxgI6b9DNa .node ellipse,#mermaid-svg-LXVjtpqxgI6b9DNa .node polygon,#mermaid-svg-LXVjtpqxgI6b9DNa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LXVjtpqxgI6b9DNa .rough-node .label text,#mermaid-svg-LXVjtpqxgI6b9DNa .node .label text,#mermaid-svg-LXVjtpqxgI6b9DNa .image-shape .label,#mermaid-svg-LXVjtpqxgI6b9DNa .icon-shape .label{text-anchor:middle;}#mermaid-svg-LXVjtpqxgI6b9DNa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LXVjtpqxgI6b9DNa .rough-node .label,#mermaid-svg-LXVjtpqxgI6b9DNa .node .label,#mermaid-svg-LXVjtpqxgI6b9DNa .image-shape .label,#mermaid-svg-LXVjtpqxgI6b9DNa .icon-shape .label{text-align:center;}#mermaid-svg-LXVjtpqxgI6b9DNa .node.clickable{cursor:pointer;}#mermaid-svg-LXVjtpqxgI6b9DNa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LXVjtpqxgI6b9DNa .arrowheadPath{fill:#333333;}#mermaid-svg-LXVjtpqxgI6b9DNa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LXVjtpqxgI6b9DNa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LXVjtpqxgI6b9DNa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LXVjtpqxgI6b9DNa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LXVjtpqxgI6b9DNa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LXVjtpqxgI6b9DNa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LXVjtpqxgI6b9DNa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LXVjtpqxgI6b9DNa .cluster text{fill:#333;}#mermaid-svg-LXVjtpqxgI6b9DNa .cluster span{color:#333;}#mermaid-svg-LXVjtpqxgI6b9DNa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LXVjtpqxgI6b9DNa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LXVjtpqxgI6b9DNa rect.text{fill:none;stroke-width:0;}#mermaid-svg-LXVjtpqxgI6b9DNa .icon-shape,#mermaid-svg-LXVjtpqxgI6b9DNa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LXVjtpqxgI6b9DNa .icon-shape p,#mermaid-svg-LXVjtpqxgI6b9DNa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LXVjtpqxgI6b9DNa .icon-shape .label rect,#mermaid-svg-LXVjtpqxgI6b9DNa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LXVjtpqxgI6b9DNa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LXVjtpqxgI6b9DNa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LXVjtpqxgI6b9DNa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
ADC 得到转换值
是否低于下阈值
是否高于上阈值
结果处于正常窗口
置位模拟看门狗标志
可向 NVIC 申请中断
它适合过温、欠压、光照越界等阈值监测,避免 CPU 在主循环里不停读取后再比较。
6. STM32F103C8T6 有哪些 ADC 通道

图 4 老师 PPT 第 90 页:系列通道与 GPIO 映射。具体芯片还要结合封装引脚。
STM32F10x 系列最多可有 16 个外部通道和 2 个内部通道,但 STM32F103C8T6 封装没有引出 PC0~PC5,所以实际可用外部模拟输入是 10 个:
| ADC 通道 | STM32F103C8T6 引脚 |
|---|---|
| IN0~IN7 | PA0~PA7 |
| IN8~IN9 | PB0~PB1 |
| IN10~IN15 | 当前 C8T6 常用 48 引脚封装未引出对应 PC0~PC5 |
| IN16 | 内部温度传感器,仅 ADC1 |
| IN17 | 内部参考电压 VREFINT,仅 ADC1 |
芯片有 ADC1、ADC2 两个 ADC 外设,它们的外部引脚大多重合。两个 ADC 可以独立采不同通道,也可组成双 ADC 模式提升吞吐量或同步采样;双 ADC 不是本节要求掌握的内容。
数据手册限制: 选择通道必须同时查"ADC 通道表"和目标封装的引脚表。系列手册列出 16 个外部通道,不代表每种封装都能使用全部 16 个。
7. 规则组的四种转换模式
四种模式由两个问题组合得到:
- 扫描还是非扫描:一次序列只转换一个通道,还是按菜单依次转换多个通道?
- 单次还是连续:完成一次序列后停止,还是自动重新开始?
| 扫描 | 连续 | 模式 | 一次触发后发生什么 | 典型用途 |
|---|---|---|---|---|
| 关 | 关 | 单次、非扫描 | 转换序列第 1 个通道一次后停止 | 按需读取一个通道 |
| 关 | 开 | 连续、非扫描 | 同一个通道不断重复转换 | 持续监测单路电压 |
| 开 | 关 | 单次、扫描 | 按序转换指定的多路一次后停止 | 一次采集一组多路数据 |
| 开 | 开 | 连续、扫描 | 多路序列完成后立即重新扫描 | 连续多通道采集,常配 DMA |
7.1 单次转换 非扫描

图 5 老师 PPT 第 91 页:一次触发只转换序列 1 指定的一个通道。
#mermaid-svg-mCZZZC7lvTfOzk5F{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mCZZZC7lvTfOzk5F .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mCZZZC7lvTfOzk5F .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mCZZZC7lvTfOzk5F .error-icon{fill:#552222;}#mermaid-svg-mCZZZC7lvTfOzk5F .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mCZZZC7lvTfOzk5F .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mCZZZC7lvTfOzk5F .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mCZZZC7lvTfOzk5F .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mCZZZC7lvTfOzk5F .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mCZZZC7lvTfOzk5F .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mCZZZC7lvTfOzk5F .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mCZZZC7lvTfOzk5F .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mCZZZC7lvTfOzk5F .marker.cross{stroke:#333333;}#mermaid-svg-mCZZZC7lvTfOzk5F svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mCZZZC7lvTfOzk5F p{margin:0;}#mermaid-svg-mCZZZC7lvTfOzk5F .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mCZZZC7lvTfOzk5F .cluster-label text{fill:#333;}#mermaid-svg-mCZZZC7lvTfOzk5F .cluster-label span{color:#333;}#mermaid-svg-mCZZZC7lvTfOzk5F .cluster-label span p{background-color:transparent;}#mermaid-svg-mCZZZC7lvTfOzk5F .label text,#mermaid-svg-mCZZZC7lvTfOzk5F span{fill:#333;color:#333;}#mermaid-svg-mCZZZC7lvTfOzk5F .node rect,#mermaid-svg-mCZZZC7lvTfOzk5F .node circle,#mermaid-svg-mCZZZC7lvTfOzk5F .node ellipse,#mermaid-svg-mCZZZC7lvTfOzk5F .node polygon,#mermaid-svg-mCZZZC7lvTfOzk5F .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mCZZZC7lvTfOzk5F .rough-node .label text,#mermaid-svg-mCZZZC7lvTfOzk5F .node .label text,#mermaid-svg-mCZZZC7lvTfOzk5F .image-shape .label,#mermaid-svg-mCZZZC7lvTfOzk5F .icon-shape .label{text-anchor:middle;}#mermaid-svg-mCZZZC7lvTfOzk5F .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-mCZZZC7lvTfOzk5F .rough-node .label,#mermaid-svg-mCZZZC7lvTfOzk5F .node .label,#mermaid-svg-mCZZZC7lvTfOzk5F .image-shape .label,#mermaid-svg-mCZZZC7lvTfOzk5F .icon-shape .label{text-align:center;}#mermaid-svg-mCZZZC7lvTfOzk5F .node.clickable{cursor:pointer;}#mermaid-svg-mCZZZC7lvTfOzk5F .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-mCZZZC7lvTfOzk5F .arrowheadPath{fill:#333333;}#mermaid-svg-mCZZZC7lvTfOzk5F .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mCZZZC7lvTfOzk5F .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mCZZZC7lvTfOzk5F .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mCZZZC7lvTfOzk5F .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-mCZZZC7lvTfOzk5F .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mCZZZC7lvTfOzk5F .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-mCZZZC7lvTfOzk5F .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mCZZZC7lvTfOzk5F .cluster text{fill:#333;}#mermaid-svg-mCZZZC7lvTfOzk5F .cluster span{color:#333;}#mermaid-svg-mCZZZC7lvTfOzk5F div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mCZZZC7lvTfOzk5F .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mCZZZC7lvTfOzk5F rect.text{fill:none;stroke-width:0;}#mermaid-svg-mCZZZC7lvTfOzk5F .icon-shape,#mermaid-svg-mCZZZC7lvTfOzk5F .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mCZZZC7lvTfOzk5F .icon-shape p,#mermaid-svg-mCZZZC7lvTfOzk5F .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-mCZZZC7lvTfOzk5F .icon-shape .label rect,#mermaid-svg-mCZZZC7lvTfOzk5F .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mCZZZC7lvTfOzk5F .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mCZZZC7lvTfOzk5F .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mCZZZC7lvTfOzk5F :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 在规则序列第 1 位选择通道
产生一次触发
采样并转换该通道
结果写入 ADC DR
置位 EOC
停止 等待下一次触发
这是后续单通道程序最容易入门的模式:触发一次、等待 EOC、读取一次。
7.2 连续转换 扫描

图 6 老师 PPT 第 94 页:规则序列完成后自动从头继续,适合 DMA 连续搬运。
连续扫描时,ADC 会反复按 序列1 → 序列2 → ... → 序列N 转换。规则组只有一个 DR,因此 DMA 应在每次结果出现时把数据搬到内存数组,否则只读取 DR 很可能只看到最后一次或最近一次结果。
本节边界: 间断模式可以把长扫描序列切成若干小段,每次触发执行一段;课堂只要求了解,暂不作为主线。
8. ADC 怎样开始转换
ADC 的触发可分为软件与硬件两类:
- 软件触发:程序写控制位,适合按需读取;
- 定时器触发:定时器比较事件或 TRGO 直接启动 ADC,适合精确等间隔采样;
- 外部事件触发:由特定 EXTI 线路等外部事件启动。
例如要每 1 ms 采样一次,不一定要每 1 ms 进入定时中断再调用 ADC。可以让 TIM3 更新事件输出 TRGO,并让 ADC 选择该 TRGO 作为外部触发源:
#mermaid-svg-iPAldCLm19p5gjfa{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-iPAldCLm19p5gjfa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-iPAldCLm19p5gjfa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-iPAldCLm19p5gjfa .error-icon{fill:#552222;}#mermaid-svg-iPAldCLm19p5gjfa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-iPAldCLm19p5gjfa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-iPAldCLm19p5gjfa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-iPAldCLm19p5gjfa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-iPAldCLm19p5gjfa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-iPAldCLm19p5gjfa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-iPAldCLm19p5gjfa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-iPAldCLm19p5gjfa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-iPAldCLm19p5gjfa .marker.cross{stroke:#333333;}#mermaid-svg-iPAldCLm19p5gjfa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-iPAldCLm19p5gjfa p{margin:0;}#mermaid-svg-iPAldCLm19p5gjfa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-iPAldCLm19p5gjfa .cluster-label text{fill:#333;}#mermaid-svg-iPAldCLm19p5gjfa .cluster-label span{color:#333;}#mermaid-svg-iPAldCLm19p5gjfa .cluster-label span p{background-color:transparent;}#mermaid-svg-iPAldCLm19p5gjfa .label text,#mermaid-svg-iPAldCLm19p5gjfa span{fill:#333;color:#333;}#mermaid-svg-iPAldCLm19p5gjfa .node rect,#mermaid-svg-iPAldCLm19p5gjfa .node circle,#mermaid-svg-iPAldCLm19p5gjfa .node ellipse,#mermaid-svg-iPAldCLm19p5gjfa .node polygon,#mermaid-svg-iPAldCLm19p5gjfa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-iPAldCLm19p5gjfa .rough-node .label text,#mermaid-svg-iPAldCLm19p5gjfa .node .label text,#mermaid-svg-iPAldCLm19p5gjfa .image-shape .label,#mermaid-svg-iPAldCLm19p5gjfa .icon-shape .label{text-anchor:middle;}#mermaid-svg-iPAldCLm19p5gjfa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-iPAldCLm19p5gjfa .rough-node .label,#mermaid-svg-iPAldCLm19p5gjfa .node .label,#mermaid-svg-iPAldCLm19p5gjfa .image-shape .label,#mermaid-svg-iPAldCLm19p5gjfa .icon-shape .label{text-align:center;}#mermaid-svg-iPAldCLm19p5gjfa .node.clickable{cursor:pointer;}#mermaid-svg-iPAldCLm19p5gjfa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-iPAldCLm19p5gjfa .arrowheadPath{fill:#333333;}#mermaid-svg-iPAldCLm19p5gjfa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-iPAldCLm19p5gjfa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-iPAldCLm19p5gjfa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iPAldCLm19p5gjfa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-iPAldCLm19p5gjfa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iPAldCLm19p5gjfa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-iPAldCLm19p5gjfa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-iPAldCLm19p5gjfa .cluster text{fill:#333;}#mermaid-svg-iPAldCLm19p5gjfa .cluster span{color:#333;}#mermaid-svg-iPAldCLm19p5gjfa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-iPAldCLm19p5gjfa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-iPAldCLm19p5gjfa rect.text{fill:none;stroke-width:0;}#mermaid-svg-iPAldCLm19p5gjfa .icon-shape,#mermaid-svg-iPAldCLm19p5gjfa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-iPAldCLm19p5gjfa .icon-shape p,#mermaid-svg-iPAldCLm19p5gjfa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-iPAldCLm19p5gjfa .icon-shape .label rect,#mermaid-svg-iPAldCLm19p5gjfa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-iPAldCLm19p5gjfa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-iPAldCLm19p5gjfa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-iPAldCLm19p5gjfa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} TIM3 每 1 ms 产生更新事件
TRGO 输出硬件触发
ADC 自动开始采样转换
结果进入 DR
DMA 自动搬到内存
CPU 处理一批采样结果
这样采样时刻由硬件确定,不受中断优先级和主程序忙碌影响,也减少 CPU 中断负担。DMA 具体配置属于下一章。
9. ADC 时钟为什么只能选 6 或 8 分频
STM32F103 的 ADC 时钟来自 APB2 时钟 PCLK2,通过 RCC 的 ADC 预分频器得到:
fADCCLK=fPCLK2Prescaler f_{ADCCLK}=\frac{f_{PCLK2}}{Prescaler} fADCCLK=PrescalerfPCLK2
可选分频为 2、4、6、8。当前系统 PCLK2=72 MHz,而 ADC 时钟上限为 14 MHz:
| 分频 | ADCCLK | 是否满足 ≤14 MHz |
|---|---|---|
| 2 | 36 MHz | 否,严重超频 |
| 4 | 18 MHz | 否 |
| 6 | 12 MHz | 是 |
| 8 | 9 MHz | 是 |
所以本工程只能选择 6 分频或 8 分频。超出 14 MHz 可能看似能运行,但精度和稳定性不再有保证,不能把"转换更快"当作合理优化。
10. 数据左对齐和右对齐
ADC 结果是 12 位,而数据寄存器是 16 位,所以要决定 12 位放在什么位置。

图 7 老师 PPT 第 96 页:12 位结果在 16 位寄存器中的左右对齐方式。
| 对齐方式 | 结果位于 | 直接读取的意义 | 适合情况 |
|---|---|---|---|
| 右对齐 | D11~D0 |
直接得到 0~4095 | 常规计算,课程默认选择 |
| 左对齐 | D15~D4 |
数值相当于原码左移 4 位 | 方便直接取高 8 位,快速降为 8 位数据 |
左对齐后若直接把 16 位寄存器当普通数读取,数值会是原始 12 位结果的 16 倍。它不是测量结果突然变大,而是位位置发生了变化。
11. 采样时间和总转换时间

图 8 老师 PPT 第 97 页:总转换时间由采样阶段和固定的 12.5 个 ADC 周期组成。
STM32F1 ADC 的总转换时间:
TCONV=Tsample+12.5fADCCLK T_{CONV}=\frac{T_{sample}+12.5}{f_{ADCCLK}} TCONV=fADCCLKTsample+12.5
其中 Tsample 的单位是 ADC 周期。若 ADCCLK=14 MHz、采样时间为 1.5 周期:
TCONV=1.5+12.514 MHz=1 μs T_{CONV}=\frac{1.5+12.5}{14\text{ MHz}}=1\ \mu s TCONV=14 MHz1.5+12.5=1 μs
这就是"最快约 1 μs、约 1 MSPS"的来源。
当前工程更可能使用 6 分频得到 ADCCLK=12 MHz,同样采用 1.5 周期采样时:
TCONV=1412 MHz≈1.167 μs T_{CONV}=\frac{14}{12\text{ MHz}}\approx1.167\ \mu s TCONV=12 MHz14≈1.167 μs
11.1 为什么需要采样保持
逐次比较需要时间。如果转换期间输入仍在变化,比较器每一步面对的电压都不同,最终码将失去明确含义。采样阶段先让内部小电容充到接近输入电压,随后断开输入并保持这份电压,再进行量化。
11.2 采样时间长短怎样选
- 信号源阻抗低、驱动能力强:采样电容充电快,可用较短采样时间;
- 电阻分压很大、传感器输出阻抗高:需要更长采样时间,否则读数可能偏低或不稳定;
- 采样时间越长,总转换速度越低。
课堂提到"采样时间长可以避免毛刺干扰",这可以作为直观效果理解;更核心的硬件原因是给内部采样电容足够的建立时间。若输入噪声很大,还应使用 RC 滤波、合理布线、稳定参考电源以及软件平均。
12. 校准为什么要在上电后做一次
ADC 内部电容阵列和比较网络存在器件偏差。校准会计算内部校准码,用于减小这些偏差造成的误差。
课堂要求记住两点:
- 每次上电后执行一次校准;
- 按手册要求完成 ADC 上电稳定、复位校准和启动校准的固定流程。
参考手册校准说明见 PDF 第 161 页。校准能改善 ADC 内部误差,但不能修复不准确的 VDDA、错误分压比例、过高源阻抗或 PCB 噪声。
13. ADC 外围电路怎样设计

图 9 老师 PPT 第 99 页:电位器、阻性传感器分压和 0~5 V 缩放至 0~3.3 V。
13.1 电位器产生 0~3.3 V
电位器两个固定端接 3.3 V 和 GND,滑动端接 ADC。滑动端电压随位置连续变化。
课程使用约 10 kΩ,既不会在电源两端造成过大电流,又不会让输出阻抗过高。阻值太小会耗电、发热;阻值过大又会增加 ADC 采样建立时间和抗干扰难度。
13.2 阻性传感器通过分压变成电压
ADC 不能直接"测电阻",可将传感器电阻与固定电阻串联:
Vout=VCC×RdownRup+Rdown V_{out}=V_{CC}\times\frac{R_{down}}{R_{up}+R_{down}} Vout=VCC×Rup+RdownRdown
若传感器位于下方,传感器电阻变化会按公式改变输出电压。把传感器放在上方则变化方向相反。固定电阻通常选在传感器常用阻值附近,以便工作点落在 ADC 中间量程并获得较好的灵敏度。
读取模块时应接 AO 模拟输出,而不是经过比较器后的 DO 数字输出。
13.3 将 0~5 V 缩放为 0~3.3 V
PPT 使用上方 17 kΩ、下方 33 kΩ:
Vout=Vin×3317+33=0.66Vin V_{out}=V_{in}\times\frac{33}{17+33}=0.66V_{in} Vout=Vin×17+3333=0.66Vin
当 Vin=5 V:
Vout=5×0.66=3.3 V V_{out}=5\times0.66=3.3\text{ V} Vout=5×0.66=3.3 V
这种电阻分压只适合低压、信号源允许分压且已评估输入阻抗的场景。更高电压、负电压、工业信号或可能浪涌的输入,应增加保护、运放缓冲或隔离采集方案,不能仅凭两个电阻直接接 MCU。
14. 本节需要认识的寄存器功能
本节还没有进入代码,但老师最后带着浏览了寄存器表。先建立功能地图,后续写代码时就知道每个库函数最终在配置什么。
| 寄存器 | 主要作用 | 参考手册 PDF 页码 |
|---|---|---|
ADC_SR |
EOC、JEOC、模拟看门狗等状态标志 | 170 |
ADC_CR1 |
扫描模式、模拟看门狗、间断模式、中断允许 | 171~172 |
ADC_CR2 |
ADC 开关、连续模式、数据对齐、触发选择、软件启动、DMA | 173~174 |
ADC_SMPR1/2 |
为各通道选择采样时间 | 175 |
ADC_HTR/LTR |
模拟看门狗高、低阈值 | 176 |
ADC_SQR1/2/3 |
规则组序列长度与转换顺序 | 177~178 |
ADC_JSQR |
注入组序列 | 178 |
ADC_JDR1~4 |
注入组转换结果 | 179 |
ADC_DR |
规则组转换结果;双 ADC 时也有组合用途 | 179 |
RCC ADCPRE |
设置 PCLK2 到 ADCCLK 的 2/4/6/8 分频 | 参考手册 RCC 章节及 ADC 第 157 页 |
最重要的前后关系:
#mermaid-svg-qj47VZmyeUKSpEWW{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qj47VZmyeUKSpEWW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qj47VZmyeUKSpEWW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qj47VZmyeUKSpEWW .error-icon{fill:#552222;}#mermaid-svg-qj47VZmyeUKSpEWW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qj47VZmyeUKSpEWW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qj47VZmyeUKSpEWW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qj47VZmyeUKSpEWW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qj47VZmyeUKSpEWW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qj47VZmyeUKSpEWW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qj47VZmyeUKSpEWW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qj47VZmyeUKSpEWW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qj47VZmyeUKSpEWW .marker.cross{stroke:#333333;}#mermaid-svg-qj47VZmyeUKSpEWW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qj47VZmyeUKSpEWW p{margin:0;}#mermaid-svg-qj47VZmyeUKSpEWW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qj47VZmyeUKSpEWW .cluster-label text{fill:#333;}#mermaid-svg-qj47VZmyeUKSpEWW .cluster-label span{color:#333;}#mermaid-svg-qj47VZmyeUKSpEWW .cluster-label span p{background-color:transparent;}#mermaid-svg-qj47VZmyeUKSpEWW .label text,#mermaid-svg-qj47VZmyeUKSpEWW span{fill:#333;color:#333;}#mermaid-svg-qj47VZmyeUKSpEWW .node rect,#mermaid-svg-qj47VZmyeUKSpEWW .node circle,#mermaid-svg-qj47VZmyeUKSpEWW .node ellipse,#mermaid-svg-qj47VZmyeUKSpEWW .node polygon,#mermaid-svg-qj47VZmyeUKSpEWW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qj47VZmyeUKSpEWW .rough-node .label text,#mermaid-svg-qj47VZmyeUKSpEWW .node .label text,#mermaid-svg-qj47VZmyeUKSpEWW .image-shape .label,#mermaid-svg-qj47VZmyeUKSpEWW .icon-shape .label{text-anchor:middle;}#mermaid-svg-qj47VZmyeUKSpEWW .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qj47VZmyeUKSpEWW .rough-node .label,#mermaid-svg-qj47VZmyeUKSpEWW .node .label,#mermaid-svg-qj47VZmyeUKSpEWW .image-shape .label,#mermaid-svg-qj47VZmyeUKSpEWW .icon-shape .label{text-align:center;}#mermaid-svg-qj47VZmyeUKSpEWW .node.clickable{cursor:pointer;}#mermaid-svg-qj47VZmyeUKSpEWW .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qj47VZmyeUKSpEWW .arrowheadPath{fill:#333333;}#mermaid-svg-qj47VZmyeUKSpEWW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qj47VZmyeUKSpEWW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qj47VZmyeUKSpEWW .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qj47VZmyeUKSpEWW .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qj47VZmyeUKSpEWW .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qj47VZmyeUKSpEWW .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qj47VZmyeUKSpEWW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qj47VZmyeUKSpEWW .cluster text{fill:#333;}#mermaid-svg-qj47VZmyeUKSpEWW .cluster span{color:#333;}#mermaid-svg-qj47VZmyeUKSpEWW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qj47VZmyeUKSpEWW .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qj47VZmyeUKSpEWW rect.text{fill:none;stroke-width:0;}#mermaid-svg-qj47VZmyeUKSpEWW .icon-shape,#mermaid-svg-qj47VZmyeUKSpEWW .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qj47VZmyeUKSpEWW .icon-shape p,#mermaid-svg-qj47VZmyeUKSpEWW .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qj47VZmyeUKSpEWW .icon-shape .label rect,#mermaid-svg-qj47VZmyeUKSpEWW .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qj47VZmyeUKSpEWW .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qj47VZmyeUKSpEWW .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qj47VZmyeUKSpEWW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} RCC ADCPRE 决定 ADCCLK
SMPR 决定采样周期数
CR1 决定扫描等模式
SQR 决定规则序列
CR2 决定触发 连续 对齐 DMA 和启动
ADC 执行转换
结果写入 DR
SR 置位状态
CPU DMA 或中断取走数据
15. 易错点和转写校正
| 转写内容 | 正确术语 |
|---|---|
| ABC、ABCD | ADC |
| LOGPOD digital converter | Analog-Digital Converter |
| 滑动变速器、电源器 | 电位器、滑动变阻器 |
| 12 秒、1 秒转换 | 12 位、约 1 μs 转换 |
| 模拟开门狗 | 模拟看门狗 |
| 规则组和购物组/租户组 | 规则组和注入组 |
| 数据计算器 | 数据寄存器 |
| RTC 分频 | RCC 的 ADC 预分频 |
| EOC 柜体航行信号 | EOC 转换结束标志 |
| 数据解析 | 数据左对齐 |
| 采样宝石 | 采样时间 |
| 负位置 | 复位值 |
还要避免以下误解:
- 12 位只说明有 4096 个码,不等于一定具有 12 位有效精度。
- 输入 3.3 V 上限应以实际 VDDA/VREF 和数据手册电气限制为准,不要输入超过电源轨的电压。
- 18 个通道是系列 ADC 多路选择器的能力;C8T6 外部封装只提供 10 个外部模拟输入。
- 连续模式不是"读取时才转换",而是启动后一直更新 DR。
- 规则组扫描多个通道时只有一个 DR,若不使用 DMA 或及时读取会覆盖旧数据。
- 采样时间不是越短越好,高源阻抗下短采样会带来建立误差。
- 左对齐不提高 ADC 精度,只改变数据在 16 位寄存器里的位置。
16. 本节边界和下一步
本节已经讲清:
- ADC 的用途、12 位量化和电压换算;
- 逐次逼近、采样保持和参考电压;
- 规则组、注入组、触发、模拟看门狗;
- C8T6 输入通道;
- 四种规则组转换模式;
- 数据对齐、ADCCLK、转换时间和校准;
- 三类常见输入电路。
下一节才进入:GPIO 模拟输入、ADC 初始化结构体、规则通道配置、软件触发、EOC 轮询、读取 DR,以及多通道时如何选择顺序或配合 DMA。这里不把后续代码写成已学内容。
17. 复习自测
- 为什么 GPIO 数字输入不能替代 ADC 测量 1.2 V?
- 12 位 ADC 为什么输出范围是 0~4095?
- 3.3 V 参考下,1 LSB 大约是多少毫伏?
- AD 值为 2048 时,估算电压约多少?
- SAR 中的 DAC 和比较器分别做什么?
- 为什么量化前需要采样保持?
- 规则组能排 16 次转换,为什么仍常需要 DMA?
- 单次/连续与扫描/非扫描组合成哪四种模式?
- PCLK2=72 MHz 时,为什么 ADC 预分频不能选择 2 或 4?
- 右对齐和左对齐的原始 16 位读数有什么区别?
ADCCLK=12 MHz、采样 13.5 周期时,总转换时间是多少?- 上 17 kΩ、下 33 kΩ 的分压器为什么能把 5 V 变成 3.3 V?
18. 参考资料与页码索引
- 课堂转写:00:06~06:00 ADC 现象与简介;06:00~10:05 逐次逼近;10:05~19:01 STM32 ADC 结构和通道;19:01~21:57 转换模式;22:11~28:25 触发、对齐、时间、校准和电路;28:25~31:27 手册索引。
- 教师 PPT《STM32入门教程》:第 86~99 页。
- 师兄笔记《STM32笔记》:PDF 第 70~74 页。
- 《STM32F10xxx参考手册(中文)》:PDF 第 155~180 页;其中工作结构 156~160 页,校准/对齐/采样/触发 161~163 页,寄存器 170~180 页。
- 《STM32F103x8B数据手册(中文)》:PDF 第 10~11 页 ADC 资源概览,第 17~18 页 ADC 通道引脚,第 47~49 页 ADC 电气特性。
19. 一句话总结
ADC 先按序列选中模拟通道,用采样保持锁住瞬时电压,再由 SAR 按参考电压逐位逼近得到 12 位数字码;转换模式、触发、时钟和采样时间决定数据何时产生、按什么顺序产生以及能否可靠地产生。