STM32CubeMX教程15 ADC - 多重ADC转换

目录

1、准备材料

2、实验目标

3、二重ADC转换

3.0、前提知识

3.1、CubeMX相关配置

3.1.1、时钟树配置

3.1.2、外设参数配置

3.1.3、外设中断配置

3.2、生成代码

3.2.1、外设初始化调用流程

3.2.2、外设中断调用流程

3.2.3、添加其他必要代码

4、常用函数

5、烧录验证

5.1、实验具体流程

5.2、实验现象

6、三重ADC转换

6.1、CubeMX相关配置

6.2、添加其他必要代码

6.3、实验现象

7、注释详解

8、参考资料


1、准备材料

开发板(正点原子stm32f407探索者开发板V2.4)

STM32CubeMX软件(Version 6.10.0)

野火DAP仿真器

keil µVision5 IDE(MDK-Arm)

CH340G Windows系统驱动程序(CH341SER.EXE)

XCOM V2.6串口助手

三个滑动变阻器

2、实验目标

使用STM32CubeMX软件配置STM32F407开发板的ADC实现多重ADC采集,具体为使用ADC1_IN5、ADC2_IN6实现二重ADC采集,使用ADC1_IN5、ADC2_IN6和ADC3_IN5实现三重ADC采集

3、二重ADC转换

3.0、前提知识

STM32F407的三个ADC可以组合实现多重ADC采集,当仅仅开启一个ADC时,该ADC只能工作在独立模式;当同时启动ADC1和ADC2,则以ADC1为主器件,ADC2为从器件可以工作在双重ADC采集模式下;当同时启动ADC1/2/3,则以ADC1为主器件,ADC2/3为从器件可以工作在三重ADC采集模式下;

在多重 ADC 模式下可实现以下几种模式,①二/三重注入同时模式 + 规则同时模式、②二/三重规则同时模式 + 交替触发模式、③二/三重注入同时模式、④二/三重规则同时模式、⑤二/三重交替模式和⑥二/三重交替触发模式,本实验我们只介绍二/三重规则同时模式,如下图所示为CubeMX配置中可选的所有模式

工作在多重ADC模式下的DMA请求拥有三种DMA模式,这里只介绍DMA access mode 1/2,不会涉及DMA access mode 3,二重规则同时模式ADC采集时只能选择DMA access mode 2,三重规则同时模式ADC采集时只能选择DMA access mode 1

下面请读者重点理解采集完成的数据是如何通过DMA存入用户定义好的数组中的!

当ADC工作在二重规则同时模式下,此时DMA模式为DMA access mode 2,在ADC1或ADC2转换事件结束时,会生成一个32位DMA传输请求,此请求会将存储在 ADC_CDR 32 位寄存器高位半字中的 ADC2 转换数据传输到SRAM,然后将存储在ADC_CCR低位半字中的ADC1转换数据传输到 SRAM,也就是说我们只需定义一个包含一个元素的uint32_t DataBuffer[1]数组,每次从高16位读取ADC2采集的数据,从低16位读取ADC1采集的数据即可

当ADC工作在三重规则同时模式下,此时DMA模式为DMA access mode 1,在ADC1、ADC2或ADC3转换事件结束时,会生成三个32位DMA传输请求,之后会发生三次从 ADC_CDR 32 位寄存器到SRAM的传输:首先传输 ADC1 转换数据,然后是 ADC2 转换数据,最后是 ADC3 转换数据,也就是说我们需定义一个包含三个元素的uint32_t DataBuffer[3]数组,其中第一个元素DataBuffer[0]表示ADC1采集的数据,第二个元素DataBuffer[1]表示ADC2采集的数据,第三个元素DataBuffer[2]表示ADC3采集的数据

上述描述如下图所示(注释1)

如下图所示为多重ADC框图,当工作在二重ADC时不存在ADC3,ADC1/2/3三个ADC只有ADC1为主ADC,当以多重ADC工作时,只需要配置主ADC的DMA传输,从ADC无需设置,在启动多重ADC采集时也只能以DMA方式启动主ADC,从ADC以普通方式启动即可,不能将从ADC也以DMA方式启动,多重ADC采集的数据均会存入32位的通用规则数据寄存器中

3.1、CubeMX相关配置

请阅读“STM32CubeMX教程1 工程建立”实验3.4.1小节配置RCC和SYS

3.1.1、时钟树配置

系统时钟树配置均设置为STM32F407总线能达到的最高时钟频率,具体如下图所示

3.1.2、外设参数配置

本实验需要需要初始化USART1作为输出信息渠道,具体配置步骤请阅读“STM32CubeMX教程9 USART/UART 异步通信”

设置TIM3通用定时器溢出时间100ms,外部触发事件选择更新事件,参数详解请阅读“STM32CubeMX教程6 TIM 通用定时器 - 生成PWM波”实验,具体配置如下图所示

在Pinout & Configuration页面左边功能分类栏目Analog中单击其中ADC1,勾选IN5通道,在下方的参数设置将ADC模式修改为Dual regular simultaneous mode only,DMA模式选择DMA access mode 2(需要启用ADC2通道才可以选择二重ADC采集模式),并且使能DMA连续转化请求(需要先增加DMA请求才可以使能),其他参数与“STM32CubeMX教程13 ADC - 单通道转换”实验均保持一致,具体配置如下图所示

单击Configuration中的DMA Settings选项卡对ADC1的DMA请求进行设置,所有配置均与“STM32CubeMX教程14 ADC - 多通道DMA转换”实验保持一致,具体配置如下图所示

在Pinout & Configuration页面左边功能分类栏目Analog中单击其中ADC2,勾选IN6通道,注意除通道外所有参数配置必须与ADC1保持一致,否则ADC采集将出现错误,具体配置如下图所示

3.1.3、外设中断配置

在Pinout & Configuration页面左边System Core/NVIC中勾选DMA2 Stream0 全局中断,然后选择合适的中断优先级即可,具体配置如下图所示

3.2、生成代码

请阅读 “STM32CubeMX教程1 工程建立”实验3.4.3小节配置Project Manager

单击页面右上角GENERATE CODE生成工程

3.2.1、外设初始化调用流程

请阅读“STM32CubeMX教程14 ADC - 多通道DMA转换”实验“3.2.1、外设初始化调用流程”小节

3.2.2、外设中断调用流程

请阅读“STM32CubeMX教程14 ADC - 多通道DMA转换”实验“3.2.2、外设中断调用流程”小节

3.2.3、添加其他必要代码

在adc.c中重新实现ADC转换完成回调函数HAL_ADC_ConvCpltCallback(),具体代码如下所示

源代码如下

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
    /*定时器中断启动DMA二重ADC转换*/
    uint32_t Volt1,Volt2;
    uint32_t adcValue=DataBuffer[0];	

    /*从低16位取出ADC1采集数据*/
    uint32_t ADC1_val=adcValue & 0x0000FFFF;	
    Volt1=3300*ADC1_val;	
    Volt1=Volt1>>12;		
	
    /*从高16位取出ADC2采集数据*/
    uint32_t ADC2_val=adcValue & 0xFFFF0000;
    ADC2_val= ADC2_val>>16;
    Volt2=3300*ADC2_val;
    Volt2=Volt2>>12;		
    
    printf("Volt1:%d, Volt2:%d\r\n",Volt1,Volt2);
}

在主函数main中启动二重ADC转化,一些全局变量定义及启动源代码如下

/*main.c全局变量定义*/
uint32_t DataBuffer[BATCH_DATA_LEN];

/*main.h变量声明*/
#define BATCH_DATA_LEN 1
extern uint32_t DataBuffer[BATCH_DATA_LEN];

/*ADC启动代码*/
HAL_ADC_Start(&hadc2);
HAL_ADCEx_MultiModeStart_DMA(&hadc1,DataBuffer,BATCH_DATA_LEN);
HAL_TIM_Base_Start(&htim3);

为什么二重ADC转化下DMA要将数据传输到uint32 DataBuffer[1]?

二重ADC转化下DMA模式为DMA access mode 2,在该模式下ADC1转换完成的数据会传输到32位的 DataBuffer[0] 的低16位,而ADC2转换完成的数据会传输到32位的 DataBuffer[0] 的高16位

4、常用函数

/*多重ADC以DMA方式启动*/
HAL_StatusTypeDef HAL_ADCEx_MultiModeStart_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length)

5、烧录验证

5.1、实验具体流程

“USART1配置 -> TIM3定时器及触发源配置 -> ADC1/2通道参数配置 -> ADC1的DMA传输参数配置 -> DMA2 Stream0全局中断配置 -> 重新实现DMA传输完成回调函数HAL_ADC_ConvCpltCallback() -> 主函数中启动触发源定时器及以多重ADC采集DMA方式启动”

5.2、实验现象

烧录程序,单片机上电之后,串口不断的输出ADC1_IN5、ADC2_IN6的采集值,笔者将两个滑动变阻器按照ADC1_IN5、ADC2_IN6的顺序,分别从一端缓慢拧到另一端,可以从串口输出的数据看到,三个通道采集到的ADC数据从最小值0慢慢变到最大4095

6、三重ADC转换

6.1、CubeMX相关配置

在Pinout & Configuration页面左边功能分类栏目Analog中单击其中ADC3,勾选IN5通道,所有参数与二重ADC转换ADC2参数一致,在配置ADC1为三重ADC规则通道采集时ADC3的触发源参数会消失,因此无需理会,具体ADC3参数配置如下图所示

在Pinout & Configuration页面左边功能分类栏目Analog中单击其中ADC1,将其模式修改为Triple regular simultaneous mode only,DMA模式修改为DMA access mode 1,其他参数与二重ADC转换ADC1参数一致,其他ADC2的配置、ADC1 DMA的配置和NVIC的设置均与二重ADC采集一致,具体ADC1参数配置如下图所示

6.2、添加其他必要代码

/*main.c全局变量定义*/
uint32_t DataBuffer[BATCH_DATA_LEN];

/*main.h变量声明*/
#define BATCH_DATA_LEN 3
extern uint32_t DataBuffer[BATCH_DATA_LEN];

/*主函数中ADC启动代码*/
HAL_ADC_Start(&hadc2);
HAL_ADC_Start(&hadc3);
HAL_ADCEx_MultiModeStart_DMA(&hadc1,DataBuffer,BATCH_DATA_LEN);
HAL_TIM_Base_Start(&htim3);

/*adc.c中重新实现转换完成中断回调*/
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
    /*定时器中断启动DMA三重ADC转换*/
    uint32_t val=0,Volt=0;
    for(uint8_t i=0;i<BATCH_DATA_LEN;i++)
    {
        val=DataBuffer[i];
        Volt=(3300*val)>>12;
        printf("ADC%d, val:%d, Volt:%d\r\n",i,val,Volt);
    }
    printf("\r\n");
}

为什么三重ADC转化下DMA要将数据传输到uint32 DataBuffer[3]?

二重ADC转化下DMA模式为DMA access mode 1,在该模式下ADC1转换完成的数据会传输到32位的 DataBuffer[0],ADC2转换完成的数据会传输到32位的 DataBuffer[1],ADC3转换完成的数据会传输到32位的 DataBuffer[2]

6.3、实验现象

烧录程序,单片机上电之后,串口不断的输出ADC1_IN5、ADC2_IN6和ADC3_IN5的采集值,笔者将三个滑动变阻器按照ADC1_IN5、ADC2_IN6和ADC3_IN5的顺序,分别从一端缓慢拧到另一端,可以从串口输出的数据看到,三个通道采集到的ADC数据从最小值0慢慢变到最大4095

7、注释详解

注释1:图片来源STM32F4xx中文参考手册

8、参考资料

主要参考STM32Cube高效开发教程(基础篇)320页14.6小节实验

笔者认为该章节提到一个BUG其实是错误的,从ADC不应该以DMA方式启动,也无需在STM32CubeMX生成的工程代码中手动修改DMAContinuousRequests为ENABLE

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于 LightGBM 的系统访问风险识别

基于 LightGBM 的系统访问风险识别 文章目录 基于 LightGBM 的系统访问风险识别一、课题来源二、任务描述三、课题背景四、数据获取分析及说明&#xff08;1&#xff09;登录https://www.datafountain.cn并获取相关数据&#xff08;2&#xff09;数据集文件说明&#xff08;3&a…

UDS诊断(ISO14229-1) 11服务

文章目录 功能简介应用场景请求和响应1、请求2、子功能3、肯定响应4、否定响应 报文示例UDS中常用 NRC参考 功能简介 11服务&#xff0c;即 ECUReset&#xff08;ECU重置&#xff09;服务&#xff0c;用来控制MCU进行重启&#xff0c;重启分为硬件重启和软件重启。 应用场景…

TikTok真题第11天 | 1249.移除无效的括号、23.合并K个升序链表、773.滑动谜题

今天开始整hard题&#xff0c;果然费时。 1249.移除无效的括号 题目链接&#xff1a;1249.minimum-remove-to-make-valid-parentheses 解法&#xff1a; 这个题用栈来处理&#xff0c;用栈来记录左括号的位置&#xff0c;同时用一个向量来记录左括号和右括号是否有效&#x…

【Java系列】Iterator

Iterator&#xff08;迭代器&#xff09; Java Iterator&#xff08;迭代器&#xff09;迭代器接口定义了几个方法&#xff0c;最常用的是以下三个&#xff1a; Iterator 类位于 java.util 包中&#xff0c;使用前需要引入它&#xff0c;语法格式如下&#xff1a;获取一个迭代器…

第14课 多维数组

文章目录 前言一、多维数组的定义二、多维数组的初始化三、多维数组的使用&#xff08;以二维数组为例&#xff09;1. 矩阵转置问题 三、课后练习1. 求一个m*n矩阵中所有元素的累加和2. 查找并输出一个m*n矩阵中的最小元素以及其在矩阵中的位置3. 将m*n矩阵A复制为m*n矩阵B&…

2024年软件测试面试笔记(超详细整理)

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;得准备年后面试了&#xff0c;又不知道从何下手&#xff01;为了帮大家节约时间&#xff0c;特意准备了一份面试相关的资料&#xff0c;内容非常的全面&#xff0c;真的可以好好补一补&#xff0c;希望大家在都能拿到…

在宝塔Linux中安装Docker

前言 帮助使用宝塔的用户快速上手docke的安装 &#x1f4da;&#x1f4da; &#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《Docker》。&#x1f3af;&#x1f3af…

大数据 - Hadoop系列《三》- HDFS(分布式文件系统)概述

&#x1f436;5.1 hdfs的概念 HDFS分布式文件系统,全称为:Hadoop Distributed File System。 它是一个文件系统&#xff0c;用于存储文件&#xff0c;通过目录树来定位文件&#xff1b;其次&#xff0c;它是分布式的&#xff0c;由很多服务器联合起来实现其功能&#xff0c;集…

2024年【高压电工】找解析及高压电工考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高压电工找解析根据新高压电工考试大纲要求&#xff0c;安全生产模拟考试一点通将高压电工模拟考试试题进行汇编&#xff0c;组成一套高压电工全真模拟考试试题&#xff0c;学员可通过高压电工考试技巧全真模拟&#…

Android 反编译处理Dex

前言 当我们将Android项目打包上架的时候&#xff0c;为了提高被人反编译代码的可能性可以提取 dex 文件对代码进一步做混淆处理。 本文不对相关工具做过多的解释&#xff0c;不了解的可以先熟悉相关工具的使用。 相关工具&#xff08;点击直接下载&#xff09; jadx-gui&a…

IIS服务器发布PHP网站

IIS服务器&#xff0c;相信开发者都不会陌生&#xff0c;它的英文全称是Internet Information Services&#xff0c;是由微软公司提供的基于运行Microsoft Windows的互联网基本服务&#xff0c;常用于Windows系统的Web项目部署&#xff0c;本篇以PHP项目为例&#xff0c;讲解如…

使用 extract + TextMapAdapter 实现了自定义 traceId

前言 某些特定的场景&#xff0c;需要我们通过代码的方式实现自定义 traceId。 实现思路&#xff1a;通过 tracer.extract 能够构造出 SpanContext &#xff0c;将构造出来的 SpanContext 作为上层节点信息&#xff0c;通过 asChildOf(SpanContext) 能够构造出当前的 span。 …

SpringBoot + Vue 抖音全平台项目

简介 本项目是一个短视频平台&#xff0c;拥有热度排行榜&#xff0c;热门视频&#xff0c;兴趣推送&#xff0c;关注推送&#xff0c;内容审核等功能。 源码下载 网盘 (访问密码: 8418) 登录/注册 首页 创作中心 架构设计 上传视频业务流程 视频推送流程 1.用户订阅分类后…

Java实现树结构(为前端实现级联菜单或者是下拉菜单接口)

Java实现树结构&#xff08;为前端实现级联菜单或者是下拉菜单接口&#xff09; 我们常常会遇到这样一个问题&#xff0c;就是前端要实现的样式是一个级联菜单或者是下拉树&#xff0c;如图 这样的数据接口是怎么实现的呢&#xff0c;是什么样子的呢&#xff1f; 我们可以看看 …

NodeJs - Chrome内存分析工具使用

NodeJs - Chrome内存分析工具使用 一. 前期准备二. Chrome 内存分析工具使用2.1 查看快照2.2 使用案例 一. 前期准备 我们下载好相关依赖&#xff1a; npm i v8-profiler-next测试代码&#xff1a; const v8Profiler require(v8-profiler-next) const fs require(fs)funct…

Intellij建议用String替换StringBuilder

文章目录 前言String 和 StringBuilder 性能对比String 和 StringBuilder 使用的字节码对比总结 本文收发地址 https://blog.csdn.net/CSqingchen/article/details/135324313 最新更新地址 https://gitee.com/chenjim/chenjimblog 前言 最近编码时看到 Intellij 建议使用 Stri…

2023-12-15 LeetCode每日一题(反转二叉树的奇数层)

2023-12-15每日一题 一、题目编号 2415. 反转二叉树的奇数层二、题目链接 点击跳转到题目位置 三、题目描述 给你一棵 完美 二叉树的根节点 root &#xff0c;请你反转这棵树中每个 奇数 层的节点值。 例如&#xff0c;假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] &…

认识数据挖掘

随着数据库技术的迅速发展及数据库管理系统的广泛应用&#xff0c;人们积累的数据越来越多。激增的数据背后隐藏着许多重要的信息&#xff0c;人们希望能够对其进行更高层次的分析&#xff0c;以便更好地利用这些数据。目前的数据库系统可以高效地实现数据的录入、查询、统计等…

操作系统(Operator System)

这里写目录标题 1. 什么是操作系统2. 主要功能3. 计算机的层状结构4. 什么叫做管理5. 总结6. 为什么要有操作系统7. 最后 1. 什么是操作系统 操作系统&#xff08;英语&#xff1a;Operating System&#xff0c;缩写&#xff1a;OS&#xff09;是一组主管并控制计算机操作、运…

Debezium日常分享系列之:向 Debezium 连接器发送信号

Debezium日常分享系列之&#xff1a;向 Debezium 连接器发送信号 一、概述二、激活源信号通道三、信令数据集合的结构四、创建信令数据集合五、激活kafka信号通道六、数据格式七、激活JMX信号通道八、自定义信令通道九、Debezium 核心模块依赖项十、部署自定义信令通道十一、信…