【STM32】ADC模数转换基本原理
这篇文章是嵌入式中我通过大量资料 整合成了一份 系统完整、层次清晰的 ADC 模数转换原理解析 文档。
这里系统地梳理了 STM32F1 系列 ADC 模数转换的核心资料,包括:
1.原理 + 特性
2.通道配置
3.模式选择(单次/连续/扫描)
4.关键寄存器与时序
5.全套库函数调用方式
6.提供示例实验代码
📘 1. STM32F1 系列 ADC 模数转换原理详解
参考资料:
STM32F1xx官方资料:《STM32中文参考手册V10》-第11章 模拟/数字转换(ADC)
🧩 第一部分:STM32 ADC 基本原理
什么是 ADC?
ADC(Analog to Digital Converter) 是一种将模拟电压信号转换为数字信号的模块。在 STM32 中,ADC 是片上外设,可将 03.3V 的电压转换为 12 位数值(04095)。
ADC 指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。
典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。
STM32F10x ADC特点:
12位逐次逼近型的模拟数字转换器。
最多带3个ADC控制器
最多支持18个通道,可最多测量16个外部和2个内部信号源。
支持单次和连续转换模式
转换结束,注入转换结束,和发生模拟看门狗事件时产生中断。
通道0到通道n的自动扫描模式
自动校准
采样间隔可以按通道编程
规则通道和注入通道均有外部触发选项
转换结果支持左对齐或右对齐方式存储在16位数据寄存器
ADC转换时间:最大转换速率 1us。(最大转换速度为1MHz,在ADCCLK=14M,采样周期为1.5个ADC时钟下得到。)
ADC供电要求:2.4V-3.6V
ADC输入范围:VREF- ≤ VIN ≤ VREF+
电压转换公式
V = (ADC_Value / 4096.0) * Vref
假设 Vref = 3.3V,ADC_Value = 2048:则
V = 2048 / 4096 * 3.3 = 1.65V
特性 | 描述 |
---|---|
转换精度 | 12位(0~4095) |
架构 | 逐次逼近型(SAR) |
控制器个数 | 最多 3 个(ADC1~ADC3) |
通道数量 | 最多 18 个(16个外部 + 温度 + VREF) |
模式 | 单次 / 连续 / 扫描 / 注入 |
对齐方式 | 左对齐 / 右对齐 |
校准功能 | 支持自动校准 |
时钟要求 | ADCCLK ≤ 14MHz |
🧩 第二部分:通道与引脚对应关系(如下图示)
STM32F10x大容量芯片带3个ADC控制器
其中144脚芯片因为带PF脚,所以多5个通道,为21个外部通道。小于144脚芯片只有16个外部通道。
【转换通道结构】
通道类型 最大通道数 特点
规则通道 16 个 正常顺序转换
注入通道 4 个 类似中断处理,可打断规则通道
内部通道 2 个 温度(ch16)、VREF(ch17)
STM32F10x系列芯片ADC通道和引脚对应关系
ADC引脚
ADC 模块框图(ADC 寄存器结构 + 模式)
ADC的模块包含:输入多路选择器模拟至数字转换器(SAR)控制逻辑(触发、注入/规则选择)数据寄存器(ADC_DR、JDRx)状态寄存器(ADC_SR)
STM32通道组
① 规则通道组: 相当正常运行的程序。最多16个通道。
规则通道和它的转换顺序在ADC_SQRx寄存器中选择,规则组转换的总数应写入ADC_SQR1寄存器的 L[3:0] 中。
② 注入通道组: 相当于中断。最多4个通道。
注入组和它的转换顺序在ADC_JSQR寄存器中选择。注入组里转化的总数应写入ADC_JSQR寄存器的 L[1:0] 中。
STM32F1的ADC的各通道可以单次,连续,扫描或者间断模式执行。
🧩 第三部分:模式选择(单次/连续/扫描)
转换模式:
模式 | 描述 |
---|---|
单次模式 | 转换一次,需手动触发 |
连续模式 | 自动持续转换 |
扫描模式 | 多通道自动轮询 |
注入模式 | 手动触发,可打断规则通道 |
软件触发 | SWSTART 启动 |
外部触发 | 由定时器等外设触发(EXTSEL) |
单次转化 VS 连续转换
扫描模式
ADC中断
ADC时钟配置
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
不要让ADC时钟超过14MHz,否则可能不准。
🧩 第四部分:关键寄存器与时序
📌 ADC 核心寄存器说明(简表)
寄存器 | 作用 |
---|---|
ADC_CR1 | 模式选择,扫描模式使能,EOC中断 |
ADC_CR2 | 启动控制、触发源、数据对齐、CONT |
ADC_SQRx | 通道顺序配置 |
ADC_SMPRx | 通道采样时间配置 |
ADC_DR | 转换结果数据寄存器 |
ADC_SR | 状态标志(EOC、AWD等) |
ADC_CR1寄存器
在扫描模式下,由ADC_SQRx或者ADC_JSQRx寄存器选中的通道被转换。如果设置了EOCIE或者JEOCIE,在最后一个通道转换完毕后才会产生EOC或者JEOC中断。