打印
[其他ST产品]

STM32Cubemx——ADC采集+DMA传输

[复制链接]
647|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通道,使用规则通道。

使用特权

评论回复
评论
慢醇 2023-4-18 22:35 回复TA
———————————————— 版权声明:本文为CSDN博主「平陆成江,」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_45822269/article/details/116724180 
沙发
慢醇|  楼主 | 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.新建工程

使用特权

评论回复
地板
慢醇|  楼主 | 2023-4-18 22:36 | 只看该作者
选择相应单片机型号
2.时钟源选择及时钟树配置

使用特权

评论回复
5
慢醇|  楼主 | 2023-4-18 22:37 | 只看该作者
3.时基选择调试接口选择

使用特权

评论回复
6
慢醇|  楼主 | 2023-4-18 22:37 | 只看该作者
4.配置ADC采集
1.选择要配置为ADC采集的引脚

使用特权

评论回复
7
慢醇|  楼主 | 2023-4-18 22:37 | 只看该作者
2.开启DMA传输,循环模式

使用特权

评论回复
8
慢醇|  楼主 | 2023-4-18 22:40 | 只看该作者
3.选择分辨率,使能ADC持续转换,DMA持续请求

当然分辨率越高,转换所需时间就越长

使用特权

评论回复
9
慢醇|  楼主 | 2023-4-18 22:40 | 只看该作者
4.选择触发源

在此我选择了软件触发,也可以使用定时器的PWM信号来触发,可以使采集间隔时间固定,可用来分析信号波形,幅频特性等。

使用特权

评论回复
10
慢醇|  楼主 | 2023-4-18 22:41 | 只看该作者
5.生成工程


生成并打开工程。

使用特权

评论回复
11
慢醇|  楼主 | 2023-4-18 22:44 | 只看该作者
3.Keil编写代码
3.Keil编写代码

/* USER CODE BEGIN PV */
uint16_t ADC_Value[100]={0};  
uint32_t Value=0;   //存储平均值
float V=0;      //存储电压值
/* USER CODE END PV */

使用特权

评论回复
12
慢醇|  楼主 | 2023-4-18 22:44 | 只看该作者
为提高准确度,定义数组,取平均值做为测量值

  /* USER CODE BEGIN 2 */
   HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value,100);
  /* USER CODE END 2 */

使用特权

评论回复
13
慢醇|  楼主 | 2023-4-18 22:45 | 只看该作者
在初始化后开启DMA传输,ADC开始转换

  while (1)
  {
    /* USER CODE END WHILE */

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


使用特权

评论回复
14
慢醇|  楼主 | 2023-4-18 22:45 | 只看该作者
主循环内对采集数据求平均,并计算出实际电压。
4.烧录观察

烧录代码后,通过调试观察V变量,可以测量0-3.3V电压(单位mV),如果需要测量更大范围,需要加外围电路,将电压规整到0-3.3V内。

使用特权

评论回复
15
慢醇|  楼主 | 2023-4-18 22:45 | 只看该作者
工程下载地址

链接:https://pan.baidu.com/s/1IU4tsS8mzrc5AzWH7XbfhA
提取码:csa1

使用特权

评论回复
16
jkl21| | 2023-5-10 20:04 | 只看该作者
ADC的通道与引脚是如何对应的

使用特权

评论回复
17
pmp| | 2023-5-10 20:32 | 只看该作者
怎么样读取转换的结果的 ?               

使用特权

评论回复
18
bartonalfred| | 2023-5-10 21:30 | 只看该作者
AD采样的数据能用DMA传输到外扩的sram吗

使用特权

评论回复
19
ccook11| | 2023-5-10 21:38 | 只看该作者
可以避免STM32在数据传输过程中频繁地进行读写操作,从而节省了STM32资源,并且提高了数据传输速度和效率。

使用特权

评论回复
20
jimmhu| | 2023-5-10 22:10 | 只看该作者
多通道采集 使用dma 为什么只显示一个通道的值

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

117

主题

1187

帖子

5

粉丝