STM32 ADC驱动原理与多通道采集详解:从存储器映射到实际应用(进阶篇)

主题 内容 教学目的/扩展视频
ADC读电位器和光敏重点课程 电路原理,跳线设置,ADC功能分析,驱动程序,读出AD数据,读内部温度传感器数据。 会设置参数,能读出AD值即可。

师从洋桃电子,杜洋老师


本文深入剖析了STM32 ADC驱动的实现原理,通过代码注释与结构图解的有机结合,帮助开发者全面掌握多通道ADC采集技术。
重点突出了DMA传输机制与校准流程,并提供了可扩展的多通道方案,为各类工业检测应用奠定基础。

📑文章目录

  • 一、ADC驱动架构全景图
  • 1.1 存储器映射与寄存器寻址
  • 2.2 硬件连接拓扑
  • 二、核心代码解析
  • 2.1 adc.h关键定义
  • 2.2 adc.c核心实现
  • 2.2.1 DMA配置(核心参数说明)
  • 2.2.2 ADC初始化流程
  • 三、关键配置详解
  • 3.1 工作模式设置
  • 3.2 多通道配置表
  • 四、高级应用扩展
  • 4.1 扩展多通道采集
  • 4.2 采样时间优化公式
  • 五、校准与误差处理
  • 5.1 校准流程
  • 5.2 常见误差源
  • 六、实战调试技巧
  • 6.1 调试信息输出
  • 6.2 信号质量检测
  • 七、扩展应用场景
  • 7.1 工业传感器采集系统
  • 7.2 电池管理系统
  • 八、相关资源

  • ▲ 回顾上期🔍STM32 ADC原理与驱动详解:从光敏电阻到数字转换(上) | 零基础入门STM32第六十五步


    (图1:开发板与光敏电阻和电位器部分连接示意图)


    一、ADC驱动架构全景图

    1.1 存储器映射与寄存器寻址

    APB2总线

    ADC1基地址0x40012400

    ADC_DR寄存器偏移0x4C

    完整地址0x4001244C

  • ADC1_DR_Address:ADC数据寄存器物理地址(0x4001244C)
  • 查表方法:参考《STM32F10XXX参考手册(中文)》存储器映射章节获取外设基地址
  • 2.2 硬件连接拓扑

              VDDA
               │
               ├───[光敏电阻]──ADC_IN5
               │
               └───[电位器]────ADC_IN4
               │
            STM32F103
               │
            DMA1通道1
               │
           内存缓冲区ADC_DMA_IN[2]
    

    二、核心代码解析

    2.1 adc.h关键定义

    #define ADC1_DR_Address 0x4001244C // ADC1数据寄存器地址
    #define ADC_CH4 GPIO_Pin_4        // 通道4(电位器)
    #define ADC_CH5 GPIO_Pin_5        // 通道5(光敏电阻)
    
    void ADC_DMA_Init(void);          // DMA初始化函数
    void ADC_GPIO_Init(void);         // GPIO配置函数
    void ADC_Configuration(void);     // 主配置函数
    

    2.2 adc.c核心实现

    2.2.1 DMA配置(核心参数说明)
    void ADC_DMA_Init(void){
        DMA_InitTypeDef DMA_InitStructure;
        DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; // 外设地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_DMA_IN;    // 内存缓冲区
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;          // 传输方向
        DMA_InitStructure.DMA_BufferSize = 2;                       // 双通道缓冲
        DMA_InitStructure.DMA_MemoryInc = ENABLE;                   // 内存地址自增
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;             // 循环模式
        // ...其他配置
    }
    
    2.2.2 ADC初始化流程

    主程序

    ADC_Configuration

    ADC_GPIO_Init

    ADC_DMA_Init

    ADC校准

    启动转换

    调用初始化

    配置模拟输入

    设置DMA传输

    执行校准流程

    使能连续采集

    主程序

    ADC_Configuration

    ADC_GPIO_Init

    ADC_DMA_Init

    ADC校准

    启动转换


    三、关键配置详解

    3.1 工作模式设置

    配置项 参数说明 扩展应用
    ADC_Mode Independent(独立模式) 双ADC交替采样
    ScanConvMode ENABLE(扫描模式) 多通道自动切换
    ContinuousConvMode ENABLE(连续转换) 实时监控信号
    DataAlign Right对齐(12位有效) 左对齐可快速读取高8位

    3.2 多通道配置表

    通道 引脚 采样顺序 采样周期 应用场景
    CH4 PA4 1 28.5周期 电位器电压采集
    CH5 PA5 2 28.5周期 光敏电阻采集

    四、高级应用扩展

    4.1 扩展多通道采集

    // 修改缓冲区大小
    #define CHANNEL_NUM 4
    vu16 ADC_DMA_IN[CHANNEL_NUM];
    
    // 增加通道配置
    ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 3, ADC_SampleTime_28Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 4, ADC_SampleTime_28Cycles5);
    

    4.2 采样时间优化公式

    总转换时间 = (采样周期 + 12.5) / ADC时钟频率
    示例:28.5周期 + 12.5 = 41周期
    当ADCCLK=12MHz时,转换时间≈3.41μs
    

    五、校准与误差处理

    5.1 校准流程

    复位校准

    等待复位完成

    开始校准

    等待校准完成

    5.2 常见误差源

    误差类型 解决方法
    电源噪声 添加LC滤波电路
    信号串扰 隔离模拟/数字地
    采样时间不足 增大ADC_SampleTime值
    阻抗失配 添加电压跟随器

    六、实战调试技巧

    6.1 调试信息输出

    // 在main循环中添加调试输出
    printf("CH4: %4d CH5: %4d\n", ADC_DMA_IN[0], ADC_DMA_IN[1]);
    

    6.2 信号质量检测

    连接示波器

    观察输入信号

    检查纹波噪声

    测量转换延迟


    七、扩展应用场景

    7.1 工业传感器采集系统

               +-------------+
               | 温度传感器 |--> ADC_IN6
               +-------------+
               | 压力传感器 |--> ADC_IN7
               +-------------+
                      │
                   STM32F103
                      │
               [DMA传输至云平台]
    

    7.2 电池管理系统

    // 电压计算公式
    float battery_voltage = (ADC_DMA_IN[0] / 4096.0) * 3.3 * (R1+R2)/R2;
    

    通过本文的代码解析与配置说明,开发者可以快速构建高精度ADC采集系统。建议使用信号发生器注入测试信号,通过修改采样周期和DMA配置探索性能边界。ADC作为模拟世界与数字系统的桥梁,其灵活配置将极大拓展嵌入式设备的感知能力!


    八、相关资源

    [1] 洋桃电子B站课程-STM32入门100步
    [2] STM32官方文档手册
    [3] STM32F103固件函数库用户手册(中文)
    [4] 光敏电阻ADC读取程序
    [5] 光敏和电位器ADC读取程序
    [6] ADC原理与驱动.pptx


    💬 技术讨论(请在评论区留言~)


    📌 下期预告:下一期将探讨ADC读模拟量摇杆,欢迎持续关注!

    点击查阅🔍往期【STM32专栏】文章

    版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
    实测开发版:洋桃1号开发版(基于STM32F103C8T6)
    更新日志

  • v1.0 初始版本(2025-03-13)
  • 作者:触角01010001

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 ADC驱动原理与多通道采集详解:从存储器映射到实际应用(进阶篇)

    发表回复