stm32 adc dma

news2024/11/25 16:01:21

ADC采集电压,使用DMA传输到内存

一,ADC设置

1,Mode。 

 这里我们使用ADC的独立模式。

2,时钟分频

 ADCCLK由 PCLK2分频得到,最大时钟频率36M。ADC 时钟太快,采样可能不够准确,误差大。

3,采样分辨率

 分辨率不一样,最小转换时间也不一样,分辨率小可以提高转换时间。

注意触发时间一定要大于转换时间,保证每次转换完成。

4,数据对齐

 5,扫描转换模式。

 

当由多个通道采集时,可以组成常规组序列,如果开启扫描模式,就进行轮流采样。

6,连续转换模式。

CR2中:

持续转换模式,我的理解是,指ADC是单次转换还是连续转换,连续转换的话,比如软件触发一次转换的话,转换完成,会自动进行下一次转换,不许程序上再次触发。这样的话,ADC会持续不断的进行采样。

 比如初始化种程序开始ADC了采样

HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_DMA_BUFFER, 10);

 ADC会一直采样下去,数据也正常。

下面,是我添加了,HAL_ADC_Stop_DMA(&hadc1)函数,发现,ADC还是继续采集,只是,发现转换结果,只有第一次转换有数据,其余都变为0了。

 

 7,不连续转换模式。

CR1中:

 参考程序可能更好懂一些,可是,还是不太明白

官方解释

uint32_t ContinuousConvMode;           /*!< Specifies whether the conversion is performed in single mode (one conversion) or continuous mode for regular group,
                                              after the selected trigger occurred (software start or external trigger).
                                              This parameter can be set to ENABLE or DISABLE. */
  
  FunctionalState DiscontinuousConvMode; /*!< Specifies whether the conversions sequence of regular group is performed in Complete-sequence/Discontinuous-sequence (main sequence subdivided in successive parts).
                                              Discontinuous mode is used only if sequencer is enabled (parameter 'ScanConvMode'). If sequencer is disabled, this parameter is discarded.
                                              Discontinuous mode can be enabled only if continuous mode is disabled. If continuous mode is enabled, this parameter setting is discarded.
                                              This parameter can be set to ENABLE or DISABLE. */

8,DMA持续请求

 FunctionalState DMAContinuousRequests; /*!< Specifies whether the DMA requests are performed in one shot mode (DMA transfer stop when number of conversions is reached)
                                              or in Continuous mode (DMA transfer unlimited, whatever number of conversions).
                                              Note: In continuous mode, DMA must be configured in circular mode. Otherwise an overrun will be triggered when DMA buffer maximum pointer is reached.
                                              Note: This parameter must be modified when no conversion is on going on both regular and injected groups (ADC disabled, or ADC enabled without continuous mode or external trigger that could launch a conversion).
                                              This parameter can be set to ENABLE or DISABLE. */

**********如果禁止的话,DMA只发送一次*****************

9,结束转换选择 (End of conversion selection)

 

10,规则通道转换模式:

Number Of Conversion。

转换通道数,根据这个数量,下方出现几个RANK,对各个通道进行配置。

外部触发转换源。

可分软件触发和外部触发。

软件触发,指控制寄存器触发一次ADC转换。

外部触发,可以通过外部事件(例如,定时器捕获、EXTI 中断线)触发转换,使用定时器触发属于外部触发。

外部触发边沿选择。

Rank,通道 ,采样时间。

参考上节介绍。

14,注入通道转换模式。

二,程序。

1,ADC和DMA设置


/* ADC1 init function */
void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */

  /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_2;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN ADC1_Init 2 */

  /* USER CODE END ADC1_Init 2 */

}

void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(adcHandle->Instance==ADC1)
  {
  /* USER CODE BEGIN ADC1_MspInit 0 */

  /* USER CODE END ADC1_MspInit 0 */
    /* ADC1 clock enable */
    __HAL_RCC_ADC1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**ADC1 GPIO Configuration
    PA2     ------> ADC1_IN2
    */
    GPIO_InitStruct.Pin = GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* ADC1 DMA Init */
    /* ADC1 Init */
    hdma_adc1.Instance = DMA2_Stream0;
    hdma_adc1.Init.Channel = DMA_CHANNEL_0;
    hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_adc1.Init.Mode = DMA_CIRCULAR;
    hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
    hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);

  /* USER CODE BEGIN ADC1_MspInit 1 */

  /* USER CODE END ADC1_MspInit 1 */
  }
}

2,主程序

初始化

MX_DMA_Init();
MX_ADC1_Init();

万分注意,自动生成代码,ADC初始化在前,DMA初始化在后,这样导致DMA时钟还没开启,初始化失败,传输数据时,只有第一个数据成功,之后全为零。将初始化顺序调整,DMA传输数据正常。

使用DMA启用ADC

 HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_DMA_BUFFER, 10);

关闭ADC

HAL_ADC_Stop_DMA(&hadc1);

如果想自己控制ADC的转换,这里不要设置ADC连续转换模式,不然停不下来,不过ADC只进行一次采样,DMA传输的数据只有第一个正确。
 

参考文章:

STM32F7实现ADC采集(软件触发+DMA传输)解决了采样结果不实时更新的问题-电子工程世界 (eeworld.com.cn)

(5条消息) 【STM32】STM32CUBEMX + ADC(单通道,双通道DMA)_gfanbei的博客-CSDN博客_stm32cube adc

 (7条消息) 【STM32F4xx踩坑记录】ADC+DMA+STM32CUBEMX 造成数据溢出的问题_Kim_小星兴的博客-CSDN博客_stm32f4 adc dma cubemx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

砥砺深耕,笃行致远向未来——中国社科院与美国杜兰金融管理硕士项目

想在一个领域里有所发展&#xff0c;相信深耕下去一定会有收获。工作中积累的实战经验或是在文章上看到的补给型知识大都属于碎片化的&#xff0c;系统的学习理论知识很重要&#xff0c;尤其对于金融行业&#xff0c;中国社科院与美国杜兰大学合办金融管理硕士项目的出现&#…

演讲实录|OpenMLDB 与阿里云 MaxCompute 生态集成

在 OpenMLDB 第 8 期 Meetup 中&#xff0c;OpenMLDB PMC 陈迪豪以出租车行车时间预测问题为例&#xff0c;使用 OpenMLDB 基于阿里云 MaxCompute 的 Serverless 服务搭建机器学习应用&#xff0c;从数据引入开始&#xff0c;实现了端到端的机器学习应用全流程构建。 云服务作…

软件工程---习题五

1.为每种类型的模块耦合举一个具体例子。   答&#xff1a;耦合式对一个软件结构内不同模块之间互联程度的度量。耦合强弱取决于接口的复杂度&#xff0c;进入或访问某一模块的点&#xff0c;以及通过接口的数据。一般模块之间的可能的连接方式有七种&#xff0c;构成耦合的七…

深入MVC模式和三层架构

MVC模式 MVC 是一种分层开发的模式&#xff0c;其中&#xff1a; M&#xff1a;Model&#xff0c;业务模型&#xff0c;处理业务 V&#xff1a;View&#xff0c;视图&#xff0c;界面展示 C&#xff1a;Controller&#xff0c;控制器&#xff0c;处理请求&#xff0c;调用模…

深度学习中的卷积操作

本文从信号处理中的互相关运算引入深度学习中的卷积。 然后介绍了不同的卷积类型&#xff0c;以及如何在pytorch中使用这些卷积层。 &#xff08;在看pytorch文档中的Conv1D/2D/3D的时候感到比较困惑&#xff0c;又很好奇深度学习中各种各样的卷积操作。于是结合整理几乎包含深…

Linux软硬链接与动静态库

&#x1f9f8;&#x1f9f8;&#x1f9f8;各位大佬大家好&#xff0c;我是猪皮兄弟&#x1f9f8;&#x1f9f8;&#x1f9f8; 文章目录一、创建软硬链接二、软硬链接①软链接②硬链接③硬链接的用处④软硬链接的区别三、库的作用①库与为什么用库②动静态库的加载过程四、动静…

大数据分析如何进行日志采集

最近经常和技术大牛在交流&#xff0c;每次的碰撞都会让我产生更多的想法。例如这次谈到的&#xff0c;某企业信息化用了二三十种的公有云服务、有二十多种业务系统的数据库使用了同一个物理库、云产品的稳定性是值得肯定的。今天我们就来谈一谈日志在数据库中的作用以及如何采…

[附源码]Python计算机毕业设计SSM基于java语言的在线电子书阅读系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于jsp+mysql+ssm小熊猫水果管理系统-计算机毕业设计

项目介绍 小熊猫水果管理系统是水果商业贸易中的一条非常重要的道路&#xff0c;可以把其从传统的实体模式中解放中来&#xff0c;网上购物可以为消费者提供巨大的便利。通过小熊猫水果管理系统这个平台&#xff0c;可以使用户足不出户就可以了解现今的流行趋势和丰富的水果信…

在中国程序员能不能干一辈子?

在中国程序员当然能干一辈子&#xff0c;因为35岁的程序员已经自动死亡&#xff0c;全网销声匿迹&#xff0c;查无此人了&#xff0c;这辈子已经玩完了&#xff08;雾 开个玩笑&#xff0c;就是看够了那些焦虑文学&#xff0c;我只想说&#xff1a; 程序员到35岁、45岁、55岁&…

【LeetCode】1697. 检查边长度限制的路径是否存在

题目描述 给你一个 n 个点组成的无向图边集 edgeList &#xff0c;其中 edgeList[i] [ui, vi, disi] 表示点 ui 和点 vi 之间有一条长度为 disi 的边。请注意&#xff0c;两个点之间可能有 超过一条边 。 给你一个查询数组queries &#xff0c;其中 queries[j] [pj, qj, limi…

外部注意力机制与内部注意力机制

自注意力是注意力机制的一种特殊情况&#xff0c;其核心思想为通过计算特征内部元素之间的联系来获得大范围内的依赖关系。而在外部注意力中&#xff0c;key被拿到了网络外部&#xff0c;因此可以习得数据集的全局状况。 自注意力机制中&#xff0c;输入特征F被投射到query矩阵…

Qt扫盲-QAbstractSlider理论总结

QAbstractSlider理论总结1. 概述2. 常用属性3. 信号1. 概述 QAbstractSlider 其实就是 QScrollBar, QSlider and QDial 的父类&#xff0c;也就是抽象类定义了Slider这种控件的一些公共属性&#xff0c;其实就是一个抽象滚动条的主要属性。 就比如一个具体的滑动条&#xff0c…

服务器load高问题定位和优化

服务器开发系列 文章目录服务器开发系列前言一、原因分析与定位&#xff1f;总结前言 什么是Load&#xff1f;什么是Load Average?   Load 就是对计算机干活多少的度量&#xff08;WikiPedia&#xff1a;the system Load is a measure of the amount of work that a comput…

isaac gym(二)仿真setup(代码齐全)

目录 .1 Simulation Setup .2 Creating a Simulation 2.1 Simulation Parameters 2.1.1 Up Axis 2.2 Creating a Ground Plane .3 Loading Assets .4 Environments and Actors 4.1 env 4.2 actors 4.3 Test .5 Running the Simulation .6 Adding a Viewer ​编辑 .7 Th…

03_1排序算法:冒泡排序、选择排序、插入排序

开始系统学习算法啦&#xff01;为后面力扣和蓝桥杯的刷题做准备&#xff01;这个专栏将记录自己学习算法是的笔记&#xff0c;包括概念&#xff0c;算法运行过程&#xff0c;以及代码实现&#xff0c;希望能给大家带来帮助&#xff0c;感兴趣的小伙伴欢迎评论区留言或者私信博…

专访 | 刘乔升:开源是人类智力劳动最好的组织形式

OpenMLDB&#xff1a; 可以请你先自我介绍一下吗&#xff1f; 刘乔升&#xff1a; 我叫刘乔升&#xff0c;来自复旦大学&#xff0c;就读于软件工程专业&#xff0c;是 2022 开源之夏 OpenMLDB Go SDK 项目的贡献者。在参加本届开源之夏活动前&#xff0c;我就有参加过一些开源…

自定义maven骨架

目录 一、自定义maven骨架 1、先创建一个新的工程、添加你需要的结构目录及pom所需要的依赖文件&#xff0c;以这个工程为模板&#xff0c;创建框架 2、添加在pom文件中添加依赖&#xff0c;com.test文件中这个坐标与maven仓库相对应 3、点击Edit....会有一个弹窗 4、点击加…

如何在SpringBoot中设置HTTP缓存,你知道么?

在工作之余阅读缓存相关的书籍时&#xff0c;看到了http缓存相关的知识&#xff0c;HTTP 缓存机制是一个 web 性能优化的重要手段&#xff0c;无论是做前端还是做web后台&#xff0c;都可能会用得到它&#xff0c;应该是知识体系库中的一个基础环节&#xff0c;以前这一块学的不…

TAPD新增需求自动写入腾讯文档

【实现效果&#xff1a;】TAPD新增需求/缺陷&#xff0c;可以自动写入腾讯文档智能表&#xff0c;方便通过腾讯文档灵活管理自己的项目排期&#xff0c;并且通过不同的视图效果&#xff0c;实现简单的需求统计/分组迭代&#xff0c;通过数据关联及时跟进延期项目。 【准备工作…