目录
本篇文章内容的前置知识为 TIM 编码器接口,如果不了解,可点击链接学习
ADC 模拟-数字转换器
在 STM32 系列微控制器中,ADC(Analog-Digital Converter,模拟-数字转换器) 是一种重要的外设模块,用于将连续变化的模拟电压信号转换为数字信号,便于数字电路进行后续处理。它在传感器数据采集、电压监测等场景中被广泛使用,起到连接模拟世界与数字系统的桥梁作用。
ADC 模块具有以下主要特点:
1. 分辨率为 12 位的逐次逼近型 ADC(SAR ADC),可以将输入的模拟电压精确转换为数字值,范围从 0 到 4095(共 2¹² 个等级)
2. 转换速度高,每次转换的典型时间约为 1 微秒(1 μs),适用于快速采样场景。
3. 输入电压范围为 0 ~ 3.3V,与芯片的参考电压一致。对应的数字结果从 0(代表 0V)到 4095(代表 3.3V)
4. 提供 18 个模拟输入通道,其中包括 16 个外部引脚输入通道,以及 2 个内部信号源(芯片内部温度传感器、内部参考电压)
支持两种转换方式:
规则组:适合定期采样的标准数据采集流程。
注入组:适合异步或中断触发的高优先级采样任务,具有更高的实时性。
集成了 模拟看门狗(Analog Watchdog)功能,可用于自动监测某个模拟输入电压是否超出设定的上下限范围,并在异常时发出中断,增强系统的安全性。
在 STM32F103C8T6 芯片中,包含 两个 ADC 模块(ADC1 和 ADC2),共支持 10 个外部输入通道,用户可根据应用场景选择合适的通道进行采样。
逐次逼近型ADC
逐次逼近型 ADC(SAR ADC)是一种常见的模拟-数字转换器,它通过逐位比较输入模拟电压与 DAC(数模转换器)输出的电压,逐步逼近最终数字结果。每次比较确定一个二进制位,直到完成全部位数(如 8 位、12 位)为止。
上图是ADC0809 的结构框图,是一种具有多通道输入的 8 位逐次逼近型 ADC
模块 | 功能 |
---|---|
IN0 ~ IN7 | 共 8 个模拟输入通道,最多可采集 8 路模拟信号 |
通道选择开关 | 根据地址选择其中一路模拟信号进行采样 |
地址锁存与译码 | 通过 ADDA、ADDB、ADDC 接收通道地址;ALE 锁存地址 |
比较器 + DAC + SAR | 实现逐次逼近转换,比较输入电压与 DAC 电压逼近过程 |
定时与控制 | 控制 ADC 的启动与转换节奏,START 启动转换,EOC 表示转换完成 |
8 位三态缓冲器 | 存储转换结果,经由 D0~D7 输出,OE 控制输出有效性 |
V_REF(+) / V_REF(-) | 设置参考电压范围,决定转换精度与量程 |
ADC框图
一、输入部分(左侧)
ADCx_IN0 ~ IN15:最多支持 16 路外部模拟信号输入
温度传感器、VREFINT:内部模拟通道
多路开关:选择哪个通道输入
注入通道 / 规则通道:
注入通道最多 4 个(优先级高,常中断触发)
规则通道最多 16 个(常用于自动采集)
二、控制与触发部分(底部)
JEXTSEL / EXTSEL 控制位:选择触发源
JEXTTRIG / EXTTRIG:控制是否启用外部触发
支持的触发源包括 TIM 定时器通道、TRGO 信号等
支持注入组与规则组分别配置不同的触发方式
三、转换与结果处理(中部与右侧)
模拟至数字转换器:12 位分辨率,进行逐次逼近转换
注入 / 规则通道结果寄存器:分别存储转换数据
可通过 DMA 自动传输规则组数据,减轻 CPU 负担
四、监测与中断(右上角)
模拟看门狗(AWD):可设置高/低阈值,实时监测电压异常
中断控制单元:
EOC:规则组转换完成
JEOC:注入组转换完成
AWD:电压异常
可配置中断标志位,触发 NVIC 响应
STM32 的 ADC 模块支持多通道采样、规则与注入双通道机制、多种触发方式、模拟看门狗与 DMA 功能,既灵活又高效,适合各种复杂的模拟信号采集场景。
ADC基本结构
1. 模拟信号输入
GPIO(16 路)、温度传感器、参考电压 VREFINT 等模拟源通过多路选择器接入
信号被分配到规则组(最多16路)或注入组(最多4路)
2. 启动与时钟控制
RCC 提供 ADC 时钟
触发控制器决定转换的启动方式(软件启动或外设触发)
转换开始后,AD 转换器逐步将模拟信号转换为数字量
3. 数据处理与存储
转换结果分别存入:
规则组结果寄存器(1个)
注入组结果寄存器(最多4个)
若启用,模拟看门狗可监测是否超出预设电压范围。
4. 中断与输出
转换完成发出 EOC 信号
若触发中断或电压异常,交由中断输出控制模块发送信号至 NVIC
NVIC 响应中断,进行数据处理或错误处理
输入通道
通道 | 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 | 内部参考电压 |
转换模式
ADC 规则组常见转换模式有四种
转换模式 | 转换类型 | 特点说明 | 应用场景 |
---|---|---|---|
单次转换,非扫描模式 | 单通道 | 只转换一个通道,启动一次转换,转换完成即停止 | 只需采集单一模拟信号,如电压采集 |
单次转换,扫描模式 | 多通道 | 一次启动,依次转换多个通道,全部转换完成后停止 | 多个通道轮询采集一次,如多传感器采样 |
连续转换,非扫描模式 | 单通道 | 只采一个通道,但转换会自动重复进行,直到手动停止 | 实时持续采集一个信号,如电池电压跟踪 |
连续转换,扫描模式 | 多通道 | 多通道轮流采样,自动循环进行,采集完成后再次开始 | 多路模拟信号持续监测,如多路电压、电流 |
触发控制
数据对齐
ADC为12位,寄存器为16位,就需要用到数据对齐,一般使用右对齐
数据右对齐:
数据左对齐:
转换时间
AD转换的步骤:采样,保持,量化,编码
STM32 ADC的总转换时间为 TCONV = 采样时间 + 12.5个ADC周期
例如:当ADCCLK=14MHz,采样时间为1.5个ADC周期
TCONV = 1.5 + 12.5 = 14个ADC周期 = 1μs
校准
ADC有一个内置自校准模式。校准可大幅减小因内部电容器组的变化而造成的准精度误差。校准期间,在每个电容器上都会计算出一个误差修正码(数字值),这个码用于消除在随后的转换中每个电容器上产生的误差
建议在每次上电后执行一次校准
启动校准前, ADC必须处于关电状态超过至少两个ADC时钟周期
硬件电路
ADC 常用函数
函数名 | 功能 | 主要参数 |
---|---|---|
RCC_APB2PeriphClockCmd() | 使能 ADC1 和 GPIO 所在的外设时钟 | RCC_APB2Periph_ADC1 , ENABLE |
RCC_ADCCLKConfig() | 配置 ADC 模块的时钟(PCLK2 分频) | 例:RCC_PCLK2_Div6 → 72MHz ÷ 6 = 12MHz(最大不能超过14MHz) |
GPIO_Init() | 配置模拟引脚(如 PA0)为模拟输入 | GPIO_Pin_0,GPIO_Mode_AIN |
ADC_RegularChannelConfig() | 配置规则组的通道、序号、采样时间 | ADC1, ADC_Channel_0, 1(序列1位置), ADC_SampleTime_55Cycles5 |
ADC_Init() | 初始化 ADC 的各种模式 | ADC1, &ADC_InitStructure(结构体包括扫描、连续、触发等设置) |
ADC_Cmd() | 使能 ADC | ADC1, ENABLE |
ADC_ResetCalibration() | 启动 ADC 校准复位操作(必须流程) | ADC1 |
ADC_GetResetCalibrationStatus() | 轮询校准复位是否完成(RESET 表示完成) | ADC1 |
ADC_StartCalibration() | 启动 ADC 校准 | ADC1 |
ADC_GetCalibrationStatus() | 判断校准是否完成 | ADC1 |
ADC_SoftwareStartConvCmd() | 软件触发一次 ADC 转换 | ADC1, ENABLE |
ADC_GetFlagStatus() | 检查 ADC 状态标志位(如 EOC:转换结束) | ADC1, ADC_FLAG_EOC |
ADC_GetConversionValue() | 获取最近一次转换的结果 | ADC1,返回 uint16_t,范围 0~4095 |
ADC_InitTypeDef 结构体成员
成员 | 说明 |
---|---|
ADC_Mode | 模式选择,常用:ADC_Mode_Independent(独立) |
ADC_ScanConvMode | 是否启用扫描模式(多个通道) |
ADC_ContinuousConvMode | 是否启用连续转换 |
ADC_ExternalTrigConv | 外部触发源,None 表示手动(软件)触发 |
ADC_DataAlign | 数据对齐方式,常用 Right(右对齐) |
ADC_NbrOfChannel | 转换的通道数,非扫描模式必须为 1 |
ADC 时钟(ADCCLK)必须小于 14 MHz,否则 ADC 结果会不准确;
校准操作是 STM32F1 的必须流程,一般只在初始化时做一次;
每次调用 ADC_GetValue() 都会触发一次 ADC 采样 → 等待转换结束 → 返回采样值。