STM32 ADC模数转换实战:从轮询到DMA多通道采集

JUMU实名认证 发表于 2026-08-26 01:08 | 显示全部楼层 | 复制链接分享      上一主题  翻页  下一主题
ADC(模数转换器)是单片机连接模拟世界的窗口。温度、电压、光照、声音等模拟量,都要先经过ADC转换成数字量才能被单片机处理。STM32内置的ADC性能强大,支持12位分辨率、多通道、规则组与注入组、以及DMA传输,是嵌入式采集系统的核心外设。本文从单通道轮询入手,逐步讲到DMA多通道采集。
一、STM32 ADC的基本概念STM32F103的ADC是12位逐次逼近型,转换结果范围0~4095,对应输入电压0~VREF(通常3.3V)。因此实际电压 = ADC值 × 3.3 / 4095。ADC支持最多18个通道,其中16个外部通道(如PA0对应ADC1_IN0、PA1对应ADC1_IN1)可接外部模拟信号。转换有规则组和注入组之分,常规采集用规则组即可。采样时间可配置,采样时间越长精度越高、速度越慢,需根据信号特性权衡。理解分辨率和采样时间的关系,是STM32 ADC配置的第一步。
二、单通道轮询采集配置以标准库为例,ADC单通道轮询配置分几步:开启GPIO和ADC1时钟,把对应引脚配置为模拟输入;初始化ADC1,设置工作模式、对齐方式(右对齐)、转换通道数和触发方式(软件触发);配置规则通道,设置采样时间;最后使能ADC并校准。启动转换后,通过ADC_SoftwareStartConvCmd触发,轮询ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)判断转换完成,再调用ADC_GetConversionValue读取12位结果。这种轮询方式逻辑简单,适合低速周期采样。
三、DMA多通道采集实战当需要连续采集多路信号(如三相电压、多个传感器)时,轮询方式效率低且占用CPU。更优的做法是ADC+DMA:让ADC在定时器或连续模式下自动转换多个通道,转换结果由DMA自动搬运到内存数组,CPU完全不用参与。配置要点:开启ADC1和DMA1时钟;配置DMA数据流,源地址指向ADC1的数据寄存器、目的地址指向用户数组,传输方向为外设到内存、循环模式;ADC开启DMA请求。多通道时还要正确设置通道序列(例如通道0、1、2对应ADC1_IN0、IN1、IN2),结果数组顺序与通道顺序一一对应。DMA采集完成后即可在数组中直接读取最新数据,实现高效的多通道ADC采集。
四、数据换算与常见问题采集到原始ADC值后,根据参考电压换算成实际电压;若测电流或温度,再套用传感器的标定公式。常见问题:一是所有通道读到相同值,通常是通道配置或引脚配置错误;二是DMA数据错位,检查通道顺序与数组顺序是否一致;三是ADC值跳动大,可增大采样时间或在软件中做多次平均滤波;四是GPIO未配置为模拟输入导致读数异常。掌握轮询与DMA两种采集方式后,无论是做示波器、数据采集卡还是传感器检测项目,STM32 ADC都是最关键的模数转换利器。

  距米网  

找到您想要的设计

工程师、学生在线交流学习平台
关注我们

手机版- JMCAD苏ICP备18040927号-1

©2017-2026 常州居居米智能技术有限公司 苏公网安备32041102000587号