STM32 ADC如何配置?详细步骤与参数设置指南

基本配置步骤

  1. 使能时钟

    stm32 adc配置

    • 使能GPIO时钟(对应ADC通道引脚)
    • 使能ADC时钟
  2. 配置GPIO

    将引脚设置为模拟模式

  3. 配置ADC参数

    • 分辨率(12/10/8/6位)
    • 扫描模式(单通道/多通道)
    • 连续转换模式
    • 触发方式(软件/外部触发)
    • 数据对齐(右对齐/左对齐)
  4. 配置ADC通道

    • 选择通道序号
    • 设置采样时间
  5. 校准ADC

    • 执行复位校准
    • 执行校准
  6. 启动转换

    stm32 adc配置

    • 软件触发转换
    • 等待转换完成
    • 读取转换结果

单通道轮询模式示例代码(ADC1, 通道0, PA0)

#include "stm32f4xx.h"
void ADC1_Init(void) {
    // 1. 使能时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    // 2. 配置GPIO
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;   // 模拟模式
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    // 3. 配置ADC参数
    ADC_InitTypeDef ADC_InitStruct;
    ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;  // 12位分辨率
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;           // 单通道模式
    ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;      // 连续转换
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; // 软件触发
    ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;  // 数据右对齐
    ADC_InitStruct.ADC_NbrOfConversion = 1;              // 1个转换通道
    ADC_Init(ADC1, &ADC_InitStruct);
    // 4. 配置ADC通道
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_84Cycles); // PA0对应通道0
    // 5. 校准ADC
    ADC_Cmd(ADC1, ENABLE);                     // 使能ADC
    ADC_ResetCalibration(ADC1);                // 复位校准
    while(ADC_GetResetCalibrationStatus(ADC1));// 等待复位完成
    ADC_StartCalibration(ADC1);                // 开始校准
    while(ADC_GetCalibrationStatus(ADC1));     // 等待校准完成
    // 6. 启动转换
    ADC_SoftwareStartConv(ADC1);               // 软件触发转换
}
uint16_t Read_ADC(void) {
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成
    return ADC_GetConversionValue(ADC1);       // 返回转换结果
}
int main(void) {
    ADC1_Init();
    while(1) {
        uint16_t adc_value = Read_ADC();
        // 使用adc_value(0~4095对应0~3.3V)
        // 添加延时或处理逻辑
    }
}

多通道扫描模式(使用DMA)

关键修改点:

// 启用扫描模式和DMA
ADC_InitStruct.ADC_ScanConvMode = ENABLE;     // 多通道扫描
ADC_InitStruct.ADC_NbrOfConversion = 3;       // 3个通道
// 配置DMA
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
DMA_InitTypeDef DMA_InitStruct;
DMA_InitStruct.DMA_Channel = DMA_Channel_0;
DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)adc_buffer;
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStruct.DMA_BufferSize = 3;            // 3个通道
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;  // 循环模式
DMA_InitStruct.DMA_Priority = DMA_Priority_High;
DMA_Init(DMA2_Stream0, &DMA_InitStruct);
DMA_Cmd(DMA2_Stream0, ENABLE);
// 启用ADC的DMA
ADC_DMACmd(ADC1, ENABLE);

关键注意事项

  1. 采样时间计算:

    • 总转换时间 = 采样时间 + 12个周期(12位分辨率)
    • 例:ADC_SampleTime_84Cycles + 12 = 96周期 @ ADC时钟=21MHz → 转换时间 ≈ 4.57μs
  2. 电压计算:

    float voltage = (adc_value * 3.3f) / 4095.0f; // VREF=3.3V
  3. 参考电压:

    • 确保VREF+引脚连接稳定参考电压(通常使用3.3V)
    • 避免超过VDDA电压(0~3.3V输入)
  4. 校准要求:

    • 每次上电后需校准一次
    • 温度变化大时建议重新校准
  5. 中断使用:

    • 可启用EOC(转换完成)中断替代轮询
    • 配置NVIC并实现中断服务函数

常见问题解决

  • 读数不稳定:

    stm32 adc配置

    • 增加采样时间(如使用ADC_SampleTime_480Cycles)
    • 添加RC滤波电路(10kΩ + 100nF)
    • 避免高频噪声(远离数字信号线)
  • ADC无法启动:

    1. 检查时钟使能(APB2时钟和GPIO时钟)
    2. 验证GPIO配置为模拟模式
    3. 确保校准流程完整执行
  • 多通道数据错位:

    • 检查DMA内存地址递增配置
    • 确认通道配置顺序与DMA缓存匹配

不同STM32系列(F1/F3/F4/H7)配置存在差异,请参考对应《参考手册》的ADC章节,使用CubeMX工具可自动生成初始化代码。

图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/285683.html

赞 (0)
上一篇 2026年2月7日 15:10
下一篇 2026年2月7日 15:18

相关推荐

  • 非关系型数据库插件价格几何?性价比与功能如何权衡?

    在当今快速发展的信息技术时代,非关系型数据库因其灵活性和扩展性而被广泛采用,非关系型数据库插件作为其重要组成部分,为用户提供了丰富的功能和应用场景,本文将详细介绍非关系型数据库插件的价格,帮助您更好地了解这一领域,非关系型数据库插件概述非关系型数据库插件是指在非关系型数据库系统中,为了扩展数据库功能或增强数据库……

    2026年1月17日
    02800
  • yum源如何配置,linux系统yum源配置方法

    配置Yum源的核心逻辑在于建立本地或远程软件仓库与服务器之间的稳定连接,以实现软件包的快速下载、依赖自动解析及安全更新, 对于CentOS、RHEL等基于RPM包管理系统的Linux发行版而言,正确配置Yum源不仅是系统维护的基础,更是保障业务连续性和安全性的关键步骤,默认源往往因网络延迟或版本更迭导致安装失败……

    2026年5月12日
    02515
    • 服务器间歇性无响应是什么原因?如何排查解决?

      根源分析、排查逻辑与解决方案服务器间歇性无响应是IT运维中常见的复杂问题,指服务器在特定场景下(如高并发时段、特定操作触发时)出现短暂无响应、延迟或服务中断,而非持续性的宕机,这类问题对业务连续性、用户体验和系统稳定性构成直接威胁,需结合多维度因素深入排查与解决,常见原因分析:从硬件到软件的多维溯源服务器间歇性……

      2026年1月10日
      020
  • 皇室战争野猪流怎么配置卡组?野猪流最强配兵推荐

    野猪流配置的关键在于“节奏压制”而非单纯堆输出在当前皇室战争版本中,野猪流依然是一套高效的上分体系,但很多玩家陷入误区——过度追求野猪骑士的爆发伤害,却忽略了费用循环、防守反击和法术斩杀的三角平衡,一套合格的野猪流配置,必须保证平均费用在2至3.8之间,拥有至少两张低费过牌卡,并且具备对空能力和大法术终结手段……

    2026年8月13日
    01644
  • centos lvs 配置教程,centos lvs 负载均衡怎么配置

    CentOS 环境下部署 LVS 是实现高可用负载均衡的首选方案,其关键在于根据业务特性精准选择调度算法,并配合 Keepalived 实现 VIP 高可用漂移,从而构建零单点故障的集群架构,在 CentOS 系统中,Linux Virtual Server (LVS) 作为四层负载均衡器,凭借内核级转发机制……

    2026年4月30日
    02863

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(5条)

  • 帅smart4150的头像
    帅smart4150 2026年2月15日 10:44

    这篇讲STM32 ADC配置的文章挺实在的,对刚上手的人来说是个不错的路线图。它把开启时钟、设GPIO为模拟模式、配置关键参数这些核心步骤都点到了,尤其是采样时间和触发源的选择,实际用起来特别关键,新手容易在这踩坑。 不过感觉有些地方可以再展开聊聊。比如多通道+DMA采集模式,这在实际项目里几乎避不开,能加上就好了,毕竟轮询效率太低了。还有那个ADC校准,虽然文章提到了一句,但这对精度影响真挺大的,值得多说两句操作细节。 文章的风格是偏工具手册型的,一步步照着做基本能跑起来,但要是能加点“血泪教训”就更好了。比如不同时钟源对采样率的影响,或者高阻抗信号源时怎么调采样时间避免读数漂,这些都是调试时掉过头发才懂的经验。 总的来说,作为基础入门指引是合格的,把主线流程理清楚了。真要深入用的话,建议结合官方参考手册和实际板子去试,光看参数列表和直接调代码的感觉还是不一样的,ADC这东西调通了就简单,调不通的时候是真头疼。

    • 木木8914的头像
      木木8914 2026年2月15日 11:07

      @帅smart4150:太赞同了!多通道+DMA和校准细节确实值得深挖,亲身经历告诉你校准不准的时候读数能飘得亲妈不认😂 高阻抗信号源调采样时间简直就是血的教训,我第一次做传感器采集在这掉坑里卡了一整天,后来发现把采样时间拉

    • 开心smart96的头像
      开心smart96 2026年2月15日 11:37

      @帅smart4150:确实,这篇讲ADC配置的文章对新手挺友好的,把核心步骤理得清楚。我也觉得多通道+DMA和校准细节值得深挖,实际调采样时间时如果阻抗高,读数漂移真让人掉坑。调试ADC就是这样,多动手试几次就顺了,光看文档容易卡住。

  • 木user885的头像
    木user885 2026年2月15日 11:17

    这指南真是太棒了!它把ADC配置的关键步骤,比如时钟使能、GPIO模拟模式和扫描模式设置,都讲得简单明了。我之前调试时老是出错,看完后思路一下清晰了,新手老手都能上手。

  • cool877lover的头像
    cool877lover 2026年2月15日 11:52

    这篇教程太实用了!之前调ADC总卡在参数配置上,特别是扫描模式和触发设置这块。看完终于理清了时序和分频的关系,图文对照讲解新手也不容易懵。不过建议补充下校准环节的注意事项,实际调的时候基准电压不稳真的容易踩坑。收藏了下次调试直接翻出来用!