文章目录
ADC
ADC简介
ADC(Analog-Digital Converter)模拟-数字转换器
ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
12位逐次逼近型ADC,1us转换时间
输入电压范围:03.3V,转换结果范围:04095
18个输入通道,可测量16个外部和2个内部信号源
规则组和注入组两个转换单元
模拟看门狗自动监测输入电压范围
STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道
ADC 基础定义
全称:Analog to Digital Converter(模拟数字转换器)。
功能:将连续变化的模拟电压(如 0~3.3V)转换为离散的数字信号(如 0~4095 的整数),实现模拟电路与数字电路的交互。
对比 GPIO
- GPIO 仅能识别高电平(3.3V)或低电平(0V),无法测量中间电压。
- ADC 可量化中间电压,例如 1.65V 对应原始数据 2048(即 3.31.65×4095=2047.5≈2048)。
STM32 ADC 关键参数
参数 说明 分辨率 12 位,可表示 2^12=4096 个量化等级,精度为 3.3V / 4095 ≈ 0.805mV。 转换时间 最快 1μs(当 ADC 时钟为 14MHz 且采样时间最短时)。 输入范围 0~3.3V(由参考电压 VREF+ 决定,通常与 VDDA 3.3V 绑定)。 通道数量 18 个(16 个外部 GPIO 通道 + 2 个内部通道:温度传感器、参考电压)。 转换单元 - 规则组:处理常规转换(最多 16 个通道,需配合 DMA 防止数据覆盖)。 - 注入组:处理紧急中断转换(最多 4 个通道,独立数据寄存器)。
逐次逼近型ADC
逐次逼近型 ADC 工作原理
核心逻辑:通过二分法逐次比较,从最高位到最低位确定每一位的二进制值。
- 示例(8 位 ADC)
- 初始猜测中间值 128(0x80),比较 DAC 输出电压与输入电压。
- 若输入电压更高,保留最高位 1,下次猜测 192(0xC0,128+64);若更低,最高位 0,下次猜测 64(0x40)。
- 重复 8 次,确定所有位,最终得到 8 位二进制编码。
- 示例(8 位 ADC)
STM32 内部实现
集成 12 位逐次逼近寄存器(SAR),配合模拟多路开关选择通道。
转换结果存储在 16 位数据寄存器中,支持右对齐(低 12 位有效)和左对齐(高 12 位有效)。
ADC0809工作流程
- 输入通道选择
- 通道结构:具备 8 路输入通道(IN0-IN7),可通过 3 位地址线(A、B、C)选择具体通道。
- 地址锁存:地址信号经 “地址锁存与译码电路” 锁存,控制 “通道选择开关” 接通对应输入通道,将模拟信号送至电压比较器。
- 逐次逼近转换
- 核心部件:由 “逐次逼近寄存器(SAR)”、“数模转换器(DAC)” 和 “电压比较器” 构成闭环反馈系统。
- 二分法比较
- 转换开始时,SAR 从最高位(D7)开始逐位试探,先置 D7=1,其余位 = 0,经 DAC 输出半满量程电压(如 5V 参考电压下为 2.5V),与输入电压比较。
- 若输入电压≥DAC 输出电压,保留该位(D7=1);否则清零(D7=0)。
- 依次对 D6-D0 重复上述过程,经 8 次比较后确定 8 位二进制编码。
- 时钟与控制信号
- 时钟(CLK):驱动内部逻辑电路,典型频率为 500kHz,决定转换速度(约 100μs / 次)。
- 启动信号(START):脉冲触发转换,上升沿复位 SAR,下降沿启动转换。
- 转换结束信号(EOC):转换完成时变为高电平,可作为中断请求或查询信号。
- 数据输出
- 转换结果存入 8 位数据寄存器,通过三态输出缓冲器与单片机数据总线连接,可直接读取数字信号(D7-D0)。
- 参考电压(VREF)
- 决定输入电压范围,通常接 5V,此时输入范围为 0-5V;也可外接可调参考电压,灵活调整量程。
总结:ADC0809 通过 “地址选择→逐次比较→时钟驱动→数据输出” 的流程,实现模拟信号到数字信号的转换,其逐次逼近原理和多通道选择能力使其在早期单片机系统中广泛应用,尤其适合低速、多通道数据采集场景。
- 输入通道选择
ADC框图
ADC框图的工作流程(以规则组为例)
1. 输入通道选择与信号接入
- 通道类型
- 外部通道:16 个 GPIO 引脚(如 PA0-PA15),可直接接入模拟电压信号(0~3.3V)。
- 内部通道:2 个(温度传感器、内部参考电压 VREFINT),无需外部接线。
- 选择逻辑
- 通过 模拟多路开关(Analog Multiplexer) 选中目标通道(如规则组序列中的通道)。
- 扫描模式下:按序列依次切换通道(如序列 1 到序列 16),非扫描模式仅固定选择单个通道。
2. 触发转换:软件或硬件触发
- 触发源
- 软件触发:程序调用函数(如
ADC_SoftwareStartConv()
)发送START
信号。 - 硬件触发:来自定时器(如 TIM3 的 TRGO 事件)或外部中断引脚,通过配置
ADC_CR2
寄存器选择。
- 软件触发:程序调用函数(如
- 触发流程
- 触发信号激活后,ADC 进入 采样阶段,通过采样保持电路对输入电压进行采样。
3. 采样保持与量化编码
- 采样阶段
- 采样开关闭合:采样电路,就记录此时的输入电压,防止电压的不断变化造成后期量化的不准确,电容充电至输入电压值,持续时间由 采样时间寄存器(ADC_SMPR) 配置(如 1.5~239.5 个 ADC 周期)。
- 抗干扰作用:较长采样时间可抑制高频噪声,但会延长转换周期。
- 量化编码阶段
- 逐次逼近寄存器(SAR):从最高位(第 11 位)开始,通过二分法逐位确定每一位的二进制值。
- 数模转换器(DAC):根据 SAR 的当前值生成参考电压,与采样保持的电压在 电压比较器 中对比。
- 比较反馈:若输入电压 ≥ DAC 电压,该位保留为 1;否则为 0,直至最低位(第 0 位)确定,完成 12 位编码。
4. 转换结果处理与存储
- 数据寄存器
- 规则组:仅 1 个数据寄存器(ADC_DR),扫描模式下若未使用 DMA,仅保留最后一个通道的结果。如果不进行处理就出现数据覆盖。
- 存储格式:支持 右对齐(默认) 或 左对齐,右对齐时低 12 位为有效数据,左对齐时高 12 位为有效数据。
- DMA 搬运(可选)
- 在扫描模式下,通过 DMA 请求 将转换结果自动搬运至内存,避免数据覆盖(需提前配置 DMA 通道)。
5. 状态标志与中断
- 转换完成标志(EOC)
- 转换结束后,状态寄存器(ADC_SR)中的
EOC
位自动置 1,可通过轮询或中断方式检测。转化完成后就可以读取数据,或者使能中断,申请中断。
- 转换结束后,状态寄存器(ADC_SR)中的
- 中断响应
- 若使能 中断功能(配置
ADC_IT_EOC
),EOC
信号会触发 NVIC 中断,在中断服务函数中读取结果。
- 若使能 中断功能(配置
6. 参考电压与时钟驱动
- 参考电压(VREF+)
- 决定输入电压范围(通常为 0~VREF+),STM32 内部默认与 VDDA(3.3V)绑定,无需外接。
- 校准作用:通过内部参考电压通道(VREFINT)可校准外部供电偏差。
- 时钟(ADC_CLK)
- 来源:由系统时钟(APB2,72MHz)经预分频器分频得到,最大允许频率为 14MHz(需配置 RCC 寄存器)。
- 转换时间计算:Tconvert=采样时间+12.5×TADC_CLK
例如:ADC_CLK=14MHz(周期≈71.4ns),采样时间 = 1.5 周期,则总转换时间 = (1.5+12.5)×71.4ns≈1μs。
7. 辅助功能:模拟看门狗
- 阈值监测
- 预先设置 上限阈值(THR) 和 下限阈值(TLR),实时监测转换结果。
- 若结果超出阈值范围,触发 模拟看门狗中断,可用于异常信号报警(如温度超限)。
关键流程总结
输入信号通道选择采样保持触发信号逐次逼近转换结果存储数据输出/中断响应
与多通道模式的差异
- 单通道模式(非扫描):仅转换单个通道,无需配置序列,适合简单电压监测。
- 多通道模式(扫描):需配置规则组序列(最多 16 通道),依赖 DMA 搬运数据,适合复杂数据采集场景。
ADC基本结构
后面会根据这张图写程序,进行代码中参数配置等操作。
输入通道
输入通道与引脚映射
- 外部通道
- PA0PA7、PB0PB1、PC0~PC5(共 16 个),但 STM32F103C8T6 仅引出 10 个(PA0~PA9)。
- 内部通道
- 通道 16:内部温度传感器,用于测量 CPU 温度,计算公式:温度(∘C)=A**vg_SlopeVTS−V25+25
(其中 VTS 为传感器电压,V25 为 25℃ 时电压,Avg_Slope 为温度系数)。 - 通道 17:内部参考电压(1.2V 左右),用于校准外部供电偏差。
- 通道 16:内部温度传感器,用于测量 CPU 温度,计算公式:温度(∘C)=A**vg_SlopeVTS−V25+25
通道 | ADC1 | ADC2 | ADC3 |
---|---|---|---|
通道0 | PA0 | PA0 | PA0 |
通道1 | PA1 | PA1 | PA1 |
通道2 | PA2 | PA2 | PA2 |
通道3 | PA3 | PA3 | PA3 |
通道4 | PA4 | PA4 | PF6 |
通道5 | PA5 | PA5 | PF7 |
通道6 | PA6 | PA6 | PF8 |
通道7 | PA7 | PA7 | PF9 |
通道8 | PB0 | PB0 | PF10 |
通道9 | PB1 | PB1 | |
通道10 | PC0 | PC0 | PC0 |
通道11 | PC1 | PC1 | PC1 |
通道12 | PC2 | PC2 | PC2 |
通道13 | PC3 | PC3 | PC3 |
通道14 | PC4 | PC4 | |
通道15 | PC5 | PC5 | |
通道16 | 温度传感器 | ||
通道17 | 内部参考电压 |
转换模式
模式分类 | 具体模式 | 特点 |
---|---|---|
按转换次数 | 单次转换 | 触发一次,转换一个通道或一组通道,完成后停止。 |
连续转换 | 触发一次后循环转换,无需重复触发。 | |
按通道数量 | 非扫描模式 | 每次仅转换单个通道(规则组序列 1)。 |
扫描模式 | 按序列依次转换多个通道(规则组最多 16 个,需 DMA 搬运数据)。 |
单次转换,非扫描模式
连续转换,非扫描模式
单次转换,扫描模式
连续转换,扫描模式
触发控制
触发方式
- 软件触发:程序中调用函数启动转换(如
ADC_SoftwareStartConvCmd()
)。 - 硬件触发:通过定时器(如 TIM3 更新事件)或外部中断引脚自动触发,减少 CPU 干预。
数据对齐
数据对齐
- 右对齐:12 位数据存放在寄存器低 12 位(默认方式),直接读取即可得到原始值。
- 左对齐:12 位数据存放在寄存器高 12 位,低 4 位补 0,适用于需要降低分辨率的场景(如转换为 8 位数据)。
数据右对齐
数据左对齐
转换时间
AD转换的步骤:采样,保持,量化,编码
STM32 ADC的总转换时间为: TCONV = 采样时间 + 12.5个ADC周期
例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期
TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs
校准
自校准功能
- 目的:消除内部电容误差,提高转换精度。
- 操作:每次上电后执行一次校准,通过库函数
ADC_ResetCalibration()
和ADC_StartCalibration()
实现。
硬件电路
三种形式:分压电阻的形式,上下拉电阻的形式(一般上下拉电阻的阻值相近一点,这样会是PA1 输出较为中间值),最后一个想要实现3.3v的输出,也是通过分压来实现的。
传感器接口电路
- 分压电路
- 光敏电阻、热敏电阻等传感器需与固定电阻串联,通过分压得到 ADC 可接收的电压。
- 示例:光敏电阻(暗电阻 100kΩ)与固定电阻(10kΩ)串联,电源 3.3V:
- 无光照时,光敏电阻阻值高,输出电压接近 3.3V(如 3.0V);
- 有光照时,光敏电阻阻值低,输出电压接近 0V(如 0.3V)。
- 电压转换电路
- 若输入电压超过 3.3V(如 5V),需用电阻分压衰减,例如 17kΩ 与 33kΩ 串联,将 5V 分压为:
- Vout = 5V×(17kΩ+33kΩ)/33kΩ = 3.3V
- Vout = 5V×(17kΩ+33kΩ)/33kΩ = 3.3V
- 若输入电压超过 3.3V(如 5V),需用电阻分压衰减,例如 17kΩ 与 33kΩ 串联,将 5V 分压为:
ADC 与 DAC/PWM 对比
模块 | 功能 | 典型应用 | 优势 |
---|---|---|---|
ADC | 模拟信号转数字信号 | 传感器数据采集、电压监测 | 精度高、支持多通道 |
DAC | 数字信号转模拟信号 | 波形生成、音频解码 | 线性度好 |
PWM | 数字信号等效模拟信号(脉冲) | 电机调速、LED 亮度控制 | 功耗低、电路简单 |
- 注意:STM32F103C8T6 无内置 DAC,需通过 PWM 模拟 DAC 功能。