STM32 ADC

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功能框图详解

  1. 输入通道与分组 :通道分为规则组 和注入组。规则组用于常规转换,最多16个通道;注入组最多4个通道,可中断规则组的转换序列,优先执行。
  2. 转换顺序 :规则组的转换顺序由寄存器ADC_SQR1~3设定;注入组的顺序由ADC_JSQR寄存器设定。
  3. 转换模式 :
    • 单次转换模式:触发一次,转换一个通道或序列后停止。
    • 连续转换模式:上一次转换结束后自动开始下一次转换。
    • 扫描模式:使能后,ADC会按预设顺序自动转换多个通道。
  4. 数据寄存器 :规则组转换结果存储在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 :将对应引脚配置为模拟输入模式。
  • 基本步骤 :
    1. 使能ADC和GPIO时钟。
    2. 初始化GPIO为模拟输入。
    3. 配置ADC句柄:设置对齐方式、扫描模式(禁用)、连续转换模式(禁用)、通道数、触发源(软件触发)等。
    4. 调用HAL_ADC_Init()初始化ADC。
    5. 执行校准HAL_ADCEx_Calibration_Start()。
    6. 配置通道参数(通道号、采样时间、规则组排名)。
    7. 启动转换HAL_ADC_Start()。
    8. 轮询等待转换完成HAL_ADC_PollForConversion()。
    9. 读取转换值HAL_ADC_GetValue()。
2. 多通道DMA采集

适用于多路信号、连续高速采集,能有效减轻CPU负担。

  • 配置要点 :
    • 模式:独立模式、扫描模式、连续转换模式、软件触发。
    • 使能ADC的DMA请求。
  • 基本步骤 :
    1. 使能ADC、GPIO和DMA时钟。
    2. 初始化GPIO为模拟输入。
    3. 配置DMA:设置外设地址(ADC数据寄存器)、内存地址(存储数组)、数据方向(外设到内存)、数据宽度、循环模式等。
    4. 配置ADC句柄:使能扫描和连续转换,设置通道数。
    5. 初始化ADC并校准。
    6. 配置多个ADC通道及其采样时间、顺序。
    7. 使用__HAL_LINKDMA()将ADC句柄与DMA句柄关联。
    8. 启动DMA传输HAL_ADC_Start_DMA()。
    9. 转换完成后,DMA自动将数据搬运到指定数组,并可触发DMA传输完成中断。

五、HAL库配置流程总结

使用STM32CubeMX或代码配置时,一般遵循以下流程:

  1. 时钟与GPIO初始化:使能外设时钟,配置模拟输入引脚。
  2. ADC参数初始化 :通过ADC_InitTypeDef结构体配置工作模式、对齐方式、触发源等。
  3. ADC校准:执行上电校准。
  4. 通道配置 :通过ADC_ChannelConfTypeDef结构体为每个通道设置排名和采样时间。
  5. 启动与数据获取:根据需求选择轮询、中断或DMA方式启动转换并获取数据。

对于更高级的应用,如读取内部温度传感器或参考电压(VREFINT),需注意其对应的特定内部通道(如ADC1通道16、17),并参考数据手册中的计算公式将ADC值转换为实际物理量。

相关推荐
Zw-awa1 小时前
先把轮子转稳,才不会烧心:编码器速度环 PID 怎么接回 PWM
stm32
嵌入式学习菌1 小时前
Modbus 03H 最多读多少寄存器?10H 最多写多少寄存器?
单片机
小李不想当小白1 小时前
USART串口数据包(STM32标准库学习笔记)
经验分享·笔记·stm32·单片机·嵌入式硬件·学习
硅基手札2 小时前
【Linux 内核专栏 18】进程间通信 IPC(下)— Socket·Netlink·fd 三件套·futex·线程同步
linux·运维·驱动开发·单片机·嵌入式硬件·mcu·架构
无敌贵点大王17 小时前
嵌入式软件面试经(自用)
c语言·stm32·单片机·学习·mongodb·面试·职场和发展
我是海飞18 小时前
使用杰理 AC7925B 实现 Windows电脑 USB 副屏
windows·单片机·电脑·嵌入式·杰理
我是海飞18 小时前
杰理 JL703N SDK 实现 AI 自动化调试:自动进入下载模式、下载、重启与日志抓取
人工智能·单片机·自动化·音视频·杰理
Zwawa18 小时前
PID 的三个参数之外:位置式、增量式和反馈控制
c语言·单片机·嵌入式
创界工坊工作室18 小时前
29-基于单片机的万年历设计
stm32·单片机·嵌入式硬件·proteus
zhangzhangkeji19 小时前
stm32 HAL 库改写 江协科大的程序
stm32