STM32的ADC(模数转换器)是其内部重要的模拟信号采集外设。以下是关于STM32 ADC的核心概念、特性及基本使用方法的综合介绍。
一、ADC简介与主要特性
STM32的ADC是逐次逼近型(SAR)模数转换器 ,具有12位分辨率 ,这意味着其输出数字值范围为0至4095。它包含多个通道(具体数量因型号而异,例如F1系列最多有18个通道:16个外部通道和2个内部通道),用于测量外部模拟信号或内部信号(如温度传感器、内部参考电压)。
其主要特性包括:
- 多种转换模式:支持单次、连续、扫描和间断采样模式。
- 触发方式灵活:可由软件、外部事件(如定时器)或外部中断触发。
- 数据对齐 :12位转换结果可存储在16位数据寄存器中,支持左对齐或右对齐(常用右对齐)。
- 独立通道采样时间:每个通道的采样时间可单独编程。
- 模拟看门狗:可设置电压阈值,当输入电压超出范围时产生中断。
- DMA支持:规则通道转换可产生DMA请求,实现数据自动搬运,不占用CPU。
- 输入电压范围 :通常为0至3.3V(当VREF-接地,VREF+接VDDA时)。
二、ADC功能框图详解
- 输入通道与分组 :通道分为规则组 和注入组。规则组用于常规转换,最多16个通道;注入组最多4个通道,可中断规则组的转换序列,优先执行。
- 转换顺序 :规则组的转换顺序由寄存器
ADC_SQR1~3设定;注入组的顺序由ADC_JSQR寄存器设定。 - 转换模式 :
- 单次转换模式:触发一次,转换一个通道或序列后停止。
- 连续转换模式:上一次转换结束后自动开始下一次转换。
- 扫描模式:使能后,ADC会按预设顺序自动转换多个通道。
- 数据寄存器 :规则组转换结果存储在
ADC_DR寄存器中;注入组的结果存储在ADC_JDRx寄存器中。
三、关键概念
- 数据对齐:12位结果在16位寄存器中可右对齐(直接读取)或左对齐(读取高8位可快速获取高8位结果,但数值放大了16倍)。
- 转换时间 :总转换时间 = 采样时间 + 12.5个ADC时钟周期。采样时间可配置,ADC时钟(ADCCLK)由APB2时钟分频得到,最高通常为14MHz。例如,ADCCLK=12MHz,采样时间设为1.5周期,则最短转换时间约为1.17μs。
- 校准:上电后建议执行ADC校准,以提高转换精度。
四、常见应用配置(基于HAL库)
1. 单通道轮询采集
适用于单路信号、非连续或低速采集的场景。
- 配置要点 :
- 模式:独立模式、非扫描、单次转换、软件触发。
- GPIO :将对应引脚配置为模拟输入模式。
- 基本步骤 :
- 使能ADC和GPIO时钟。
- 初始化GPIO为模拟输入。
- 配置ADC句柄:设置对齐方式、扫描模式(禁用)、连续转换模式(禁用)、通道数、触发源(软件触发)等。
- 调用
HAL_ADC_Init()初始化ADC。 - 执行校准
HAL_ADCEx_Calibration_Start()。 - 配置通道参数(通道号、采样时间、规则组排名)。
- 启动转换
HAL_ADC_Start()。 - 轮询等待转换完成
HAL_ADC_PollForConversion()。 - 读取转换值
HAL_ADC_GetValue()。
2. 多通道DMA采集
适用于多路信号、连续高速采集,能有效减轻CPU负担。
- 配置要点 :
- 模式:独立模式、扫描模式、连续转换模式、软件触发。
- 使能ADC的DMA请求。
- 基本步骤 :
- 使能ADC、GPIO和DMA时钟。
- 初始化GPIO为模拟输入。
- 配置DMA:设置外设地址(ADC数据寄存器)、内存地址(存储数组)、数据方向(外设到内存)、数据宽度、循环模式等。
- 配置ADC句柄:使能扫描和连续转换,设置通道数。
- 初始化ADC并校准。
- 配置多个ADC通道及其采样时间、顺序。
- 使用
__HAL_LINKDMA()将ADC句柄与DMA句柄关联。 - 启动DMA传输
HAL_ADC_Start_DMA()。 - 转换完成后,DMA自动将数据搬运到指定数组,并可触发DMA传输完成中断。
五、HAL库配置流程总结
使用STM32CubeMX或代码配置时,一般遵循以下流程:
- 时钟与GPIO初始化:使能外设时钟,配置模拟输入引脚。
- ADC参数初始化 :通过
ADC_InitTypeDef结构体配置工作模式、对齐方式、触发源等。 - ADC校准:执行上电校准。
- 通道配置 :通过
ADC_ChannelConfTypeDef结构体为每个通道设置排名和采样时间。 - 启动与数据获取:根据需求选择轮询、中断或DMA方式启动转换并获取数据。
对于更高级的应用,如读取内部温度传感器或参考电压(VREFINT),需注意其对应的特定内部通道(如ADC1通道16、17),并参考数据手册中的计算公式将ADC值转换为实际物理量。