[其他ST产品] STM32Cubemx——ADC采集+DMA传输

[复制链接]
1819|37
 楼主| 慢醇 发表于 2023-4-18 22:35 | 显示全部楼层 |阅读模式
一、准备工具

STM32F407VE核心板
STM32Cubemx 版本 6.0.1
Keil 版本 5.31
杜邦线
ST-Link
二、前置知识
1.ADC简介

12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。
ADC采集通道分为两组,规则转换和注入转换,每个组包含一个转换序列, 该序列可按任意顺序在任意通道上完成,可理解为注入转换的优先级比规则转换高。本节只使用一个ADC通道,使用规则通道。

评论

———————————————— 版权声明:本文为CSDN博主「平陆成江,」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_45822269/article/details/116724180  发表于 2023-4-18 22:35
 楼主| 慢醇 发表于 2023-4-18 22:36 | 显示全部楼层
2.DMA简介

直接存储器访问 (DMA) 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可供其它操作使用。DMA 控制器基于复杂的总线矩阵架构,将功能强大的双 AHB 主总线架构与独立的 FIFO 结合在一起,优化了系统带宽。两个DMA 控制器总共有 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用于管理一个或多个外设的存储器访问请求。每个数据流总共可以有多达 8 个通道(或称请求)。每个通道都有一个仲裁器,用于处理 DMA 请求间的优先级。
 楼主| 慢醇 发表于 2023-4-18 22:36 | 显示全部楼层
2.STM32Cubemx配置
1.新建工程
99021643eaadfd8c0b.png
 楼主| 慢醇 发表于 2023-4-18 22:36 | 显示全部楼层
选择相应单片机型号
2.时钟源选择及时钟树配置
12018643eaaf928243.png
89342643eaafe66fc1.png
 楼主| 慢醇 发表于 2023-4-18 22:37 | 显示全部楼层
3.时基选择调试接口选择
14993643eab109938d.png
 楼主| 慢醇 发表于 2023-4-18 22:37 | 显示全部楼层
4.配置ADC采集
1.选择要配置为ADC采集的引脚
78484643eab1d92082.png
 楼主| 慢醇 发表于 2023-4-18 22:37 | 显示全部楼层
2.开启DMA传输,循环模式
41050643eab2b10df2.png
 楼主| 慢醇 发表于 2023-4-18 22:40 | 显示全部楼层
3.选择分辨率,使能ADC持续转换,DMA持续请求

当然分辨率越高,转换所需时间就越长
4849643eabd557974.png
 楼主| 慢醇 发表于 2023-4-18 22:40 | 显示全部楼层
4.选择触发源
51771643eabeee161b.png
在此我选择了软件触发,也可以使用定时器的PWM信号来触发,可以使采集间隔时间固定,可用来分析信号波形,幅频特性等。
 楼主| 慢醇 发表于 2023-4-18 22:41 | 显示全部楼层
5.生成工程
21709643eac02ab9dc.png
89257643eac094520e.png
生成并打开工程。
 楼主| 慢醇 发表于 2023-4-18 22:44 | 显示全部楼层
3.Keil编写代码
3.Keil编写代码

  1. /* USER CODE BEGIN PV */
  2. uint16_t ADC_Value[100]={0};  
  3. uint32_t Value=0;   //存储平均值
  4. float V=0;      //存储电压值
  5. /* USER CODE END PV */
 楼主| 慢醇 发表于 2023-4-18 22:44 | 显示全部楼层
为提高准确度,定义数组,取平均值做为测量值

  1.   /* USER CODE BEGIN 2 */
  2.    HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value,100);
  3.   /* USER CODE END 2 */
 楼主| 慢醇 发表于 2023-4-18 22:45 | 显示全部楼层
在初始化后开启DMA传输,ADC开始转换

  1.   while (1)
  2.   {
  3.     /* USER CODE END WHILE */

  4.     /* USER CODE BEGIN 3 */
  5.          
  6.           for(int i=0;i<100;i++)
  7.           Value+=ADC_Value[i];//求和
  8.           Value/=100;  //取平均值
  9.           V=Value*3300/4096;  //ADC最大值为4096,代表3300mV
  10.           HAL_Delay(10);
  11.   }
  12.   /* USER CODE END 3 */
  13. }


 楼主| 慢醇 发表于 2023-4-18 22:45 | 显示全部楼层
主循环内对采集数据求平均,并计算出实际电压。
4.烧录观察

烧录代码后,通过调试观察V变量,可以测量0-3.3V电压(单位mV),如果需要测量更大范围,需要加外围电路,将电压规整到0-3.3V内。
 楼主| 慢醇 发表于 2023-4-18 22:45 | 显示全部楼层
工程下载地址

链接:https://pan.baidu.com/s/1IU4tsS8mzrc5AzWH7XbfhA
提取码:csa1
jkl21 发表于 2023-5-10 20:04 | 显示全部楼层
ADC的通道与引脚是如何对应的
pmp 发表于 2023-5-10 20:32 | 显示全部楼层
怎么样读取转换的结果的 ?               
bartonalfred 发表于 2023-5-10 21:30 | 显示全部楼层
AD采样的数据能用DMA传输到外扩的sram吗
ccook11 发表于 2023-5-10 21:38 | 显示全部楼层
可以避免STM32在数据传输过程中频繁地进行读写操作,从而节省了STM32资源,并且提高了数据传输速度和效率。
jimmhu 发表于 2023-5-10 22:10 | 显示全部楼层
多通道采集 使用dma 为什么只显示一个通道的值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

1382

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部