当前位置: 首页 > news >正文

STM32 ADC原理与驱动详解:从存储器映射到多通道采集(下) | 零基础入门STM32第六十六步

主题内容教学目的/扩展视频
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_ModeIndependent(独立模式)双ADC交替采样
ScanConvModeENABLE(扫描模式)多通道自动切换
ContinuousConvModeENABLE(连续转换)实时监控信号
DataAlignRight对齐(12位有效)左对齐可快速读取高8位

3.2 多通道配置表

通道引脚采样顺序采样周期应用场景
CH4PA4128.5周期电位器电压采集
CH5PA5228.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)

相关文章:

  • 基于51单片机的12864模拟示波器proteus仿真
  • 【Linux篇】:初步理解何为进程--从硬件“原子“到PCB“粒子“的进程管理革命
  • 直击行业痛点,赛逸展2025科技创新奖推陈出新
  • 42.单调栈2
  • 3月17日星期一今日早报简报微语报早读
  • 华为OD机试 - 书籍叠放 - 逻辑分析(Java 2023 B卷 200分)
  • 【操作系统安全】任务3:Linux 网络安全实战命令手册
  • JAVA(8)-数组
  • Python虚拟环境完全指南:用venv管理项目依赖,避免环境冲突的N个技巧
  • Matlab 汽车二自由度转弯模型
  • VLLM:虚拟大型语言模型(Virtual Large Language Model)
  • 决策树(DT算法)
  • MongoDB 可观测性最佳实践
  • 从Excel到搭贝的转变过程
  • 【Agent】OpenManus-Flow-BaseFlow详细分析
  • 解决qt中自定插件加载失败,不显示问题。
  • 2-信息安全概述
  • maven依赖包重复查找处理方法
  • hive通过元数据库查询分区和非分区的数据量及存储占用
  • DeepSeek 是否被过度吹捧了?
  • 从近200件文物文献里,回望光华大学建校百年
  • 李伟任山东省委常委、省纪委书记
  • 清雪车司机未拉手刹下车导致溜车被撞亡,事故调查报告发布
  • 丰富“互换通”产品类型,促进中国金融市场高水平对外开放
  • 刘强东坐镇京东一线:管理层培训1800人次,最注重用户体验
  • 美国调整对华加征关税