17_ADC原理与转换模式

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 VVREF-=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. 扫描还是非扫描:一次序列只转换一个通道,还是按菜单依次转换多个通道?
  2. 单次还是连续:完成一次序列后停止,还是自动重新开始?
扫描 连续 模式 一次触发后发生什么 典型用途
单次、非扫描 转换序列第 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 内部电容阵列和比较网络存在器件偏差。校准会计算内部校准码,用于减小这些偏差造成的误差。

课堂要求记住两点:

  1. 每次上电后执行一次校准;
  2. 按手册要求完成 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 转换结束标志
数据解析 数据左对齐
采样宝石 采样时间
负位置 复位值

还要避免以下误解:

  1. 12 位只说明有 4096 个码,不等于一定具有 12 位有效精度。
  2. 输入 3.3 V 上限应以实际 VDDA/VREF 和数据手册电气限制为准,不要输入超过电源轨的电压。
  3. 18 个通道是系列 ADC 多路选择器的能力;C8T6 外部封装只提供 10 个外部模拟输入。
  4. 连续模式不是"读取时才转换",而是启动后一直更新 DR。
  5. 规则组扫描多个通道时只有一个 DR,若不使用 DMA 或及时读取会覆盖旧数据。
  6. 采样时间不是越短越好,高源阻抗下短采样会带来建立误差。
  7. 左对齐不提高 ADC 精度,只改变数据在 16 位寄存器里的位置。

16. 本节边界和下一步

本节已经讲清:

  • ADC 的用途、12 位量化和电压换算;
  • 逐次逼近、采样保持和参考电压;
  • 规则组、注入组、触发、模拟看门狗;
  • C8T6 输入通道;
  • 四种规则组转换模式;
  • 数据对齐、ADCCLK、转换时间和校准;
  • 三类常见输入电路。

下一节才进入:GPIO 模拟输入、ADC 初始化结构体、规则通道配置、软件触发、EOC 轮询、读取 DR,以及多通道时如何选择顺序或配合 DMA。这里不把后续代码写成已学内容。

17. 复习自测

  1. 为什么 GPIO 数字输入不能替代 ADC 测量 1.2 V?
  2. 12 位 ADC 为什么输出范围是 0~4095?
  3. 3.3 V 参考下,1 LSB 大约是多少毫伏?
  4. AD 值为 2048 时,估算电压约多少?
  5. SAR 中的 DAC 和比较器分别做什么?
  6. 为什么量化前需要采样保持?
  7. 规则组能排 16 次转换,为什么仍常需要 DMA?
  8. 单次/连续与扫描/非扫描组合成哪四种模式?
  9. PCLK2=72 MHz 时,为什么 ADC 预分频不能选择 2 或 4?
  10. 右对齐和左对齐的原始 16 位读数有什么区别?
  11. ADCCLK=12 MHz、采样 13.5 周期时,总转换时间是多少?
  12. 上 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 位数字码;转换模式、触发、时钟和采样时间决定数据何时产生、按什么顺序产生以及能否可靠地产生。

相关推荐
知产xiao_xin1 小时前
C语言运算符的种类、运算优先级和结合性
笔记
传奇开心果编程1 小时前
【Rust入门知识点学与练】第5课:函数
开发语言·学习·rust
Brilliantwxx2 小时前
【STM32】 深度详解总线架构 哈佛总线结构
stm32·嵌入式硬件·架构
恶魔泡泡糖2 小时前
stm32F103C8T6标准库DWT应用DHT11温湿度传感器数据手册说明
stm32·单片机·嵌入式硬件
知产xiao_xin2 小时前
《伯尔尼公约》—— 版权保护期
经验分享·笔记·知识产权
单片机仿真设计2 小时前
【Proteus 仿真】基于 STM32 单片机鸡舍环境监控系统设计(仿真 + 源码)
stm32·单片机·嵌入式硬件·proteus·毕设
指针常量2 小时前
【RL相关笔记】RL 效率综述
人工智能·笔记·大语言模型·后训练
留白_2 小时前
【tableau入门学习】2、柱状图、折线图、饼图、散点图
学习·tableau
STQY燊桐启元(深圳)电子科技2 小时前
5G 射频光模块场景,ST‑XDP 微波吸波导热垫片应用优势,对比 DP 导热硅胶片
经验分享·笔记·5g