ADC模数转换
ADC是模拟世界与数字世界的接口!
up的视频讲解:
1 ADC原理
1.1 ADC 简介
ADC (Analog-to-Digital Converter) 是指将连续变量的模拟信号转换为离散的数字信号的器件
-
简单地说就是将模拟电压值,转换成对应的肉眼可读的数值
-
光照警报实验中, 通过光敏电阻将光强转化为电压信号, 再通过ADC将电信号转化为具体的数值
-
温度警报实验中, 通过NTC热敏电阻将温度转化为电压信号, 再通过ADC将电压信号转化为具体的数值
STM32F103C8t6一共有2个12位ADC(数值范围:0 ~ 4095)
-
ADC1, ADC2 (该型号无ADC3)
-
18 个信号输入的通道
-
16个外部通道:芯片上有16个引脚是可以接到模拟电压上进行电压值检测的
-
2个内部信号源 : 一个是内部温度传感器,一个是内部参考电压
-
-
各通道的A/D转换可以单次、连续、扫描或间断模式执行
-
ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中
1.2 ADC 计算公式
ADC 转换精度
STM32的工作电压(0 ~ 3.3V), 它的ADC精度是12位(0 ~ 4095)
-
也就是说可以将0到3.3v分成4096个单位, 而一个单位电压就是ADC的精度
-
ADC精度 计算公式: 3.3 / 4096 = 0.0008 V
ADC值 -> 测量电压值
- 计算公式: 测量电压值 = ADC值 * (3.3/4096)
1.3 ADC 框架结构
我们先大致了解下ADC的框架结构, 它的工作流程:
信号输入通道-> ADC触发 -> ADC转换 -> ADC转换完成标志 -> CPU读取ADC数据值

- ADC 输入通道
-
外部通道:
ADCx_IN0~ADCx_IN15,对应芯片上的 GPIO 引脚 -
内部通道:片内温度传感器
TEMP Sensor、内部参考电压VREFINT,只能由 ADC1 采集 -
VDDA/VSSA给 ADC 供电,VREF+/VREF-是转换的参考电压,决定量程 -
Analog MUX(模拟多路器):像一个开关,切换选中的通道
- ADC 触发方式
-
EXTRIG规则组触发:控制常规通道的转换启动 -
JEXTRIG注入组触发:控制高优先级注入通道的转换启动,可打断规则组
- ADC 转换
-
ADCCLKDAC时钟:由预分频器提供,决定转换速度上限(最大14MHz) -
规则通道(最多 16 个):常规采集
-
注入通道(最多 4 个):高优先级采集(相当于规则通道的中断)
- ADC 转换完成标志
-
EOC:规则通道转换完成。
-
JEOC:注入通道转换完成。
-
AWD:模拟看门狗事件
- ADC 数据寄存器
-
regular Channels规则组数据寄存器:只有 1 个 16 位寄存器 -
Injected Channels注入组数据寄存器:4 个独立的 16 位寄存器 -
CPU 直接读取寄存器,通过
Address/Data BUS地址 / 数据总线获取数据 -
DMA 请求:规则组转换完成后自动触发 DMA,将数据直接搬运到内存,无需 CPU 干预
-
对齐方式:支持左对齐 / 右对齐,决定 12 位数据在 16 位寄存器中的存放位置

ADC采样周期 就是 ADC完成一次 整个采样转换 所花费的时间
T = 采样周期 + 12.5个周期(固定)
-
其中1周期为1/ADCCLK
-
采样周期可以选择: 1.5 周期 7.5 周期 13.5 周期 28.5 周期 41.5 周期 55.5 周期 71.5 周期 239.5 周期
-
采样周期越长,采集越稳,但采样速度变慢
1.3 ADC 转换模式
-
单次转换模式:ADC只执行一次转换
-
连续转换模式:转换结束之后马上开始新的转换
-
扫描模式:多通道依次轮询采集
-
间断模式:触发一次,转换一个通道,再触发,再转换
1.4 ADC 数据对齐
因为ADC是12bit的, 也就是说他将采集到的电压转换为了12bit数据, 但是数据寄存器是16位的, 所以说就有了左对齐和右对齐这两种方式

-
SEXTSign Extension(符号扩展位) 注入组的数据寄存器中, 用于区分正负 -
规则组的结果是无符号 12 位数据,范围 0~4095,直接用 0 填充高位