夜深人静学32系列18——DMA+ADC单/多通道采集

news2024/11/27 10:36:52

夜深人静学32系列18——DMA+ADC单/多通道采集

  • DMA & ADC (理论篇)
    • DMA
      • DMA框图
      • DMA通道与外设对应表
    • ADC
      • 重要知识
      • 不同模式组合的作用
    • 为什么要是用DMA + ADC?
    • DMA & ADC (实战篇)
    • 任务要求
    • 原理图
    • CubeMX配置
    • 代码实现
    • 实验现象

很久没更新了,这次我们浅浅的学习一下 DMA+ADC采集

DMA & ADC (理论篇)

DMA

DMA,全称Direct Memory Access,即直接存储器访问,用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可
供其它操作使用。
DMA数据流:每个 DMA 控制器有 8 个数据流,每个数据流有多达 8 个通道(或称请求)
DMA传输 将数据从一个地址空间复制到另一个地址空间。可以是外设到外设、外设到内存、内存到内存。
DMA的优势:DMA传输无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高,

DMA框图

在这里插入图片描述

DMA通道与外设对应表

  • DMA1
    在这里插入图片描述
  • DMA2
    在这里插入图片描述

ADC

ADC,全称:Analog-to-Digital Converter,指模拟/数字转换器
STM32F411配载一个12 位 ADC, 是逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部 源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续
采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位数据寄存器中。

重要知识

  • 转换顺序:ADC上的转换通过到被分为两组,规则组和注入组,注入组的优先级大于规则组,我们通常使用规则组。每个组都有一个转换顺序,该序列可按任意顺序在任意通道上完成。
  • 单次转换:ADC在转换外成一次转换后便停止。
  • 连续转换:完成一次转换后自动进行下一次转换
  • 扫描模式:ADC会自动完成所有通道的转换
  • 不连续采样模式(i间断模式):控制每次转换一组中的几个通道(或者说是选择通道中的几个进行一次转化,)
  • 数据对齐:ADC采集的12为数据在16位寄存器中的数据存放方式。
    在这里插入图片描述
  • 采样时间:各通道的采样时间 = 采样时间 + 12时钟周期,其中采样时间,可以自行配置,采样时间越长,采集的电压越精确。
  • 时钟频率 : 由APB2总线时钟分频得到
  • 触发源:可以由软件触发或者外部事件触发

不同模式组合的作用

在这里插入图片描述

为什么要是用DMA + ADC?

  • 在我们开启多个通道对多个模拟量进行采集时,单片机会将每个通道采集的数据都存放到ADC_DR寄存器内,如果我们处理不当,就会导致下一次采集的数据,覆盖上一次采集的数据,导致数据丢失。
  • 这个时候DMA就很重要了,我们可以配置软件,使得ADC每采集完一次数据,就将其通过DMA搬运到指定的存储单元,这样就不会由数据丢失,并且可以大大的减少CPU的工作量

DMA & ADC (实战篇)

任务要求

  • 通过单片机采集PB1和PB0的电压
  • 使用DMA传输采集的数据
  • 通过串口助手打印采集信息

原理图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 通过观察原理图,我们知道PB1是连接到一个电位器,那我采集的数据应该是0 ~ 2 ^12 - 1 (4095)
  • 而PB0则是通过一个上拉电阻连接到VCC,所以采集的数据应该是4095

CubeMX配置

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以上就是有关ADC和DMA的配置,其他部分这里不做介绍

代码实现

main.c

    uint16_t ADC_Buffer[2];                  //定义ADC数据存放数组```
int main(void)
{
  /* USER CODE BEGIN 1 */
       uint8_t i;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
 HAL_ADC_Start_DMA(&hadc1, (uint32_t*)ADC_Buffer, 2);       //开启ADC转换,并开始DMA传输
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
//      printf("Hello");
      for(i=0;i<2;i++)
      {
//        printf("ADC_Buffer[%d] = %d  ",i,hadc1.Instance->DR);
        printf("DMA_Buffer[%d] = %d  ",i,ADC_Buffer[i]);  
      }
      printf("\r\n");
     
//      HAL_ADC_Start_DMA(&hadc1,ADC_Buffer,1);
      HAL_Delay(1000);
      
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

实验现象

在这里插入图片描述

解释一下原理:

  1. 我们通过函数 HAL_ADC_Start_DMA 开启ADC转换,ADC每转换一个通道,就会发起DMA请求,DMA将ADC_DR寄存器的数据搬运到ADC_Buffer 数组,由于开启了扫描模式,在完成转换后ADC进行下一通道的转换,再次发起DMA请求,重复上述步骤
  2. 所有的通道都转换完成,由于开启了持续转换,又会重复进行步骤1。自此完成ADC自动转换,并且DMA自动搬运转换数据。
  3. 通过串口打印对应部分,即可完成本实验。

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

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

相关文章

MVSNet、PatchMatchNet环境配置、运行演示

文章目录 1 环境配置要求2 配置流程2.1 创建新环境mvs环境2.2 配置 PatchMatchNet环境3 程序运行演示1 环境配置要求 Ubuntu 18.04 python 3.7 , CUDA 10.1。 requirements.txt torch==1.4.0 torchvision==0.5.0 opencv-python numpy plyfile pillow tensorboard以上环境MV…

Docker 快速搞定 selenium grid 分布式测试

目录 前言&#xff1a; NO.1 搭环境 NO.2 写代码 NO.3 并发 感想 前言&#xff1a; Docker是一个流行的容器化平台&#xff0c;它可以帮助开发人员快速构建、部署和运行应用程序。Selenium Grid是一个用于分布式测试的工具&#xff0c;它可以并行执行多个测试用例&#xf…

做接口测试需要哪些技能、怎么做?

目录 1、什么是接口测试&#xff1f; 2、接口测试需要会什么&#xff1f; 3、如何学这些技能&#xff1f; 4、如何获取接口相关信息&#xff1f; 5、如何进行进行接口测试&#xff1f; 6、自动化接口测试 7、其他 1、什么是接口测试&#xff1f; 定义&#xff1a;测试系…

【ARM Coresight 系列文章 10 - ARM Coresight STM 介绍及使用】

文章目录 ARM System Trace MacrocellSTM FeaturesSTM 与 ETM/PTM的差异STM Master ARM System Trace Macrocell ARM 对STM 的解释是其支持高带宽的"仪器化输出"&#xff0c;仪器化输出其实也就是像 Cortex-M 系列中的 ITM 一样&#xff0c;通过将数据写入 STM 的 s…

(中等)LeetCode 328. 奇偶链表 Java

对于链表中有零个、一个、两个节点的情况&#xff0c;直接返回即可 对于链表的节点数大于两个的情况&#xff0c;需要讨论&#xff0c;看当前节点是第奇数个节点还是第偶数个节点 class Solution {public ListNode oddEvenList(ListNode head) {if (head null || head.next …

Android Glide onlyRetrieveFromCache downloadOnly submit ,kotlin

Android Glide onlyRetrieveFromCache downloadOnly submit ,kotlin Glide预加载&#xff0c;加载到磁盘或者内存缓存&#xff0c;然后加载的图片只从缓存&#xff08;磁盘缓存或者内存缓存&#xff09;中取。 private val imageFile File("/storage/emulated/0/DCIM/Ca…

百科创建必看攻略!人物百度百科怎么创建?5分钟教会你创建人物百度百科词条

百度人物百科是一个广受欢迎的在线百科平台&#xff0c;它为用户提供了一个便捷的方式来了解各种各样的人物信息。如果你有一个人物的详细资料&#xff0c;你可以通过创建一个百度人物百科页面来分享这些信息。 下面是分媒互动分享的创建百度人物百科页面的步骤以及需要注意的几…

ConfigMap 补充 和 Secret

对于上一篇文章我们分享了为什么要使用 ConfigMap &#xff0c;我们创建 ConfigMap 的时候可以传入单个或者多个键值对&#xff0c;也可以传入文件&#xff0c;还分享了如何简单的传入 ConfigMap 里面的数据作为环境变量 我们补充一下使用 ConfigMap 一次性传递多个条目吧 一…

直击现场|Sui Builder House巴黎站倒计时0天

Sui Builder House下一站即将在法国巴黎举行&#xff0c;为世界各地的开发人员提供在这座被誉为“City of Light”的城市学习和交流的机会。 Sui Builder House将于7月18–19日在巴黎举行&#xff0c;这是展示Sui突破性技术的绝佳机会。在丹佛Builder House活动之后&#xff0c…

PCIe总线的链路训练

目录 概述 链路训练的目的 几个关键概念 Lane reveral &#xff1a; Polarity inversion&#xff1a; De-skew&#xff1a; link number&#xff1a; Lane number&#xff1a; Bit lock&#xff1a; Symbol lock&#xff1a; 几个特殊序列&#xff1a; TS1和TS2&am…

深度学习系列8——分类模型评估指标

1. 概述 1.1 分类 分类&#xff1a;标签为离散值。 回归&#xff1a;标签为连续值。 2. 混淆矩阵 二分类的混淆矩阵&#xff1a; TP 和 TN 为网络预测正确的部分&#xff0c;FP 和 FN 为网络预测错误的部分。 3. 二级指标 准确率&#xff1a; 针对模型的整体评估&#xf…

Java基础之复习笔记(上)

目录 一、Java是什么&#xff1f; &#x1f496;Java概念 &#x1f496;Java运行机制 二、Java的语言基础 &#x1f496;关键字 &#x1f496;基本数据类型 &#x1f496;运算符 三、Java逻辑控制 &#x1f496;分支结构 &#x1f496;循环结构 四、Java的方法 &#…

嵌入式基础知识-系统调度

系统调度是操作系统重要功能&#xff0c;在嵌入式开发&#xff0c;也要了解系统调度的基本原理。对于嵌入式Linux开发&#xff0c;一般使用多线程和多进程开发&#xff0c;对于运行RTOS的嵌入式系统&#xff0c;一般使用多任务开发。这些线程、进程、任务的调度&#xff0c;有许…

RS232转Profinet网关怎么设置

大家好&#xff0c;今天我要给大家带来一个很有意思的案例分享。你们猜猜&#xff0c;这回我们要用远创智控的一款神奇的网关YC-RSPN-002做什么呢&#xff1f;没错&#xff0c;我们要把一台扫码枪设备通过这个RS232转PROFINET网关&#xff0c;接入到一台西门子S7-1200PLC的Prof…

在这个高度自动化的时代,为什么自动化测试取代不了手功测试?

在这个高度自动化的时代&#xff0c;为什么自动化测试取代不了手功测试&#xff1f;06:1101自动化测试和手工测试的概念 自动化测试和手工测试都是软件测试的两种基本方法。 自动化测试是基于脚本或工具自动执行测试用例的过程。测试人员可以使用自动化测试工具来编写测试脚本…

【美团面试】软件测试面试题

一、设计登录界面测试用例 功能测试(Function test) 0. 什么都不输入&#xff0c;点击提交按钮&#xff0c;看提示信息。&#xff08;非空检查&#xff09; 1.输入正确的用户名和密码&#xff0c;点击提交按钮&#xff0c;验证是否能正确登录。&#xff08;正常输入&#xff0…

C语言 替换gets函数

目录 替换gets函数gets()用处gets()的危险之处gets()的几种替代方法一、用%c循环输入直到遇到换行结束二、用getchar()循环输入直到遇到换行结束三、scanf的另一种用法四、c中的getline()方法五、解决方案使用fgets代替 替换gets函数 gets()用处 gets从标准输入设备读字符串函…

noSQL的小练习

目录 Redis&#xff1a; 1、 string类型数据的命令操作&#xff1a; 2、 list类型数据的命令操作&#xff1a; 3、 hash类型数据的命令操作&#xff1a; MongoDB&#xff1a; 1. 创建一个数据库 名字grade 2. 数据库中创建一个集合名字 class 3. 集合中插入若…

Redis分片集群有什么作用?怎样读取和存储信息

分片集群主要解决的是&#xff0c;海量数据存储的问题&#xff0c;集群中有多个master&#xff0c;每个master保存不同数据&#xff0c;并且还可以给每个master设置多个slave节点&#xff0c;就可以继续增大集群的高并发能力。同时每个master之间通过ping监测彼此健康状态&…

Selenium中如何抓取网络请求响应及WebSocket信息

目录 获取Chrome性能日志 获取请求及响应信息 我们在使用Selenium测试Web或Electronjs/Cef框架应用时&#xff0c;有时候操作一个元素需要判断是否发送了请求以及请求的参数是否正确 我们可以通过&#xff0c;开启Chrome的性能日志来然后配合driver.get_log("performan…