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

相关推荐

  • 华为查看交换机配置,华为交换机配置命令有哪些

    在华为交换机配置管理中,核心结论是:必须严格遵循“最小权限原则”与“配置审计闭环”,通过命令行分层操作结合自动化脚本校验,确保网络变更的零失误与高可追溯性,任何配置调整若脱离备份机制与版本控制,都将构成严重的安全隐患,本文基于华为 VRP 系统特性,深度解析从基础查看到高级调优的实战路径,并融合酷番云云网融合架……

    2026年5月10日
    0222
  • 非洲地区是否有服务器?分布和类型有何特点?

    非洲,这片充满生机与活力的土地,近年来在信息技术领域也展现出了勃勃生机,随着互联网的普及和电子商务的兴起,非洲各国对服务器资源的需求日益增长,非洲有服务器吗?答案是肯定的,以下将从非洲服务器的现状、分布以及发展趋势等方面进行详细介绍,非洲服务器现状服务器需求增长随着非洲经济的快速发展,互联网用户数量逐年攀升,根……

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

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

      2026年1月10日
      020
  • win7系统下配置Tomcat环境变量,具体步骤有哪些疑问?

    Win7下Tomcat配置环境变量步骤详解在Windows 7操作系统中配置Tomcat环境变量是进行Java Web开发的基础步骤之一,通过配置环境变量,我们可以方便地在命令行中启动和停止Tomcat服务器,以下将详细介绍如何在Win7系统中配置Tomcat环境变量,准备Tomcat安装包确保你已经下载了To……

    2025年12月6日
    01680
  • 安全存储限时活动有哪些具体优惠和参与条件?

    在数字化时代,数据已成为个人与企业的核心资产,如何保障数据安全存储的重要性日益凸显,为响应广大用户对数据安全的需求,一场以“安全存储限时活动”为主题的大型推广活动正式启动,旨在通过多重优惠措施与专业服务,帮助用户构建全方位的数据防护体系,让重要信息存储更安心、更高效,活动背景:数据安全需求激增,专业存储服务成刚……

    2025年11月19日
    02410

发表回复

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

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