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年9月1日
    0500
  • xp系统配置文件丢失怎么办?专业解决方法大揭秘

    在Windows操作系统中,XP配置文件的丢失可能会对用户的日常使用造成不便,本文将详细介绍XP配置文件丢失的原因、影响以及恢复方法,配置文件丢失的原因系统错误:系统在运行过程中可能会出现错误,导致配置文件损坏或丢失,病毒感染:恶意软件或病毒可能会破坏或删除配置文件,人为操作:用户在操作过程中不小心删除了配置文……

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

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

      2026年1月10日
      020
  • lol配置要求笔记本高吗?英雄联盟笔记本配置要求,2024最新

    笔记本玩LOL,配置不必焦虑,但选对硬件能显著提升体验《英雄联盟》(LOL)对笔记本配置的要求远低于主流3A大作,官方推荐配置仅需i5处理器、8GB内存和GTX 660M级别显卡即可流畅运行,但实际体验中,帧率稳定性、散热表现和网络延迟往往比单纯跑分更重要,一台采用标压处理器、16GB双通道内存、配备独立显卡……

    2026年9月1日
    0624
  • s2700 web配置中存在哪些常见问题及解决方法?

    S2700 Web配置指南登录S2700交换机1 使用PC端浏览器登录1.1 打开浏览器,输入交换机的IP地址,默认为192.168.1.1,1.2 在弹出的登录窗口中,输入默认用户名和密码,默认用户名为admin,密码为admin,1.3 登录成功后,进入S2700交换机的Web配置界面,基本配置1 配置交换……

    2025年11月1日
    02610

发表回复

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

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