STM32CubeMX教程15 ADC - 多重ADC转换

这篇具有很好参考价值的文章主要介绍了STM32CubeMX教程15 ADC - 多重ADC转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、准备材料

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

STM32CubeMX软件(Version 6.10.0)

keil µVision5 IDE(MDK-Arm)

ST-LINK/V2驱动

野火DAP仿真器

XCOM V2.6串口助手

3个滑动变阻器

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 模式下可实现以下6种模式

  1. 二/三重注入同时模式 + 规则同时模式
  2. 二/三重规则同时模式 + 交替触发模式
  3. 二/三重注入同时模式
  4. 二/三重规则同时模式
  5. 二/三重交替模式
  6. 二/三重交替触发模式

本实验我们只介绍二/三重规则同时模式,如下图所示为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]数组,以DMA方式启动ADC转换后,只需每次从高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相关配置

3.1.0、工程基本配置

打开STM32CubeMX软件,单击ACCESS TO MCU SELECTOR选择开发板MCU(选择你使用开发板的主控MCU型号),选中MCU型号后单击页面右上角Start Project开始工程,具体如下图所示

开始工程之后在配置主页面System Core/RCC中配置HSE/LSE晶振,在System Core/SYS中配置Debug模式,具体如下图所示

详细工程建立内容读者可以阅读“STM32CubeMX教程1 工程建立”

3.1.1、时钟树配置

系统时钟使用8MHz外部高速时钟HSE,HCLK、PCLK1和PCLK2均设置为STM32F407能达到的最高时钟频率,具体如下图所示

3.1.2、外设参数配置

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

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

在Pinout & Configuration页面左边功能分类栏目Analog中单击其中ADC1,勾选IN5通道

Mode (ADC模式):修改为Dual regular simultaneous mode only(需要启用ADC2通道才可以选择二重ADC采集模式)

DMA Access Mode (DMA模式):选择DMA access mode 2

DMA Continuous Requests (DMA连续转化请求):使能(需要先增加DMA请求才可以使能)

其他参数与“STM32CubeMX教程13 ADC - 单通道转换”实验均保持一致,具体配置如下图所示

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

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

3.1.3、外设中断配置

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

3.2、生成代码

3.2.0、配置Project Manager页面

单击进入Project Manager页面,在左边Project分栏中修改工程名称、工程目录和工具链,然后在Code Generator中勾选“Gnerate peripheral initialization as a pair of 'c/h' files per peripheral”,最后单击页面右上角GENERATE CODE生成工程,具体如下图所示

详细Project Manager配置内容读者可以阅读“STM32CubeMX教程1 工程建立”实验3.4.3小节

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、烧录验证

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

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

ADC1的其他参数与二重ADC转换时的参数一致,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文章来源地址https://www.toymoban.com/news/detail-793402.html

到了这里,关于STM32CubeMX教程15 ADC - 多重ADC转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32CubeMX学习六 之ADC配置

    记录一下STM32CubeMX的学习笔记,同时分享给初学的小白,希望一起进步。 如何使用STM32CubeMX以及工程创建在之前的博客有提到,这里就直接从ADC配置讲起。 编译环境:KEIL 代码生成:STM32CubeMX 库:HAL MCU:STM32F072 假设你的cubeMX工程已经建好,这里我们开始配置ADC引脚(PA1设置为

    2023年04月10日
    浏览(27)
  • STM32Cubemx——ADC采集+DMA传输

    STM32F407VE核心板 STM32Cubemx 版本 6.0.1 Keil 版本 5.31 杜邦线 ST-Link 12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续采样模式下进行。ADC 的结果存储在一个左

    2023年04月24日
    浏览(49)
  • 搭建stm32电机控制代码框架(三)——Stm32CubeMx配置ADC采样

    电机控制另一个关键的模块就是ADC采样,这个模块配置的好坏决定了采样电流和电压的精准度,因此有必要对其进行深入学习。 简介: STM32 在片上集成的ADC 外设非常强大。STM32F103xC、STM32F103xD 和STM32F103xE增强型产品内嵌3个12位的ADC,每个ADC 共用多达 21 个外部通道,可以实现

    2024年02月13日
    浏览(33)
  • STM32CubeMX配置ADC采样(轮询、中断、DMA)

    STM32CubeMX能够极大减小STM32外设配置的工作量,因此作者也借助空闲时间对STM32CubeMX相关配置进行了学习,本文介绍如何利用STM32CubeMX配置ADC采样,记录了作者学习过程中遇到的问题及解决办法,使大家少走弯路,并方便以后复习 先选择所使用的MCU,这里我使用的是STM32F407ZGT系

    2024年02月03日
    浏览(40)
  • STM32CubeMX系列05——ADC(轮询、中断、DMA)

    ==== 文章汇总(有代码汇总) ==== 正点原子Mini板,主控 STM32F103RCT6. 用到的外设: 串口1(PA9、PA10) 任意几个GPIO口(这里用PA1、PA2、PA3,对应ADC通道1、2、3)。 配置时钟源 配置debug模式(如果需要ST-Link下载及调试可以勾选) 配置时钟树(可以直接在HCLK那里输入72,然后敲回

    2024年02月10日
    浏览(30)
  • STM32CubeMX配置-ADC多通道配置(DMA) (STM32G070)

    一、写在前面         ADC通道采集数据的两种方式:         1)ADC轮询采集数据直接放到数组中;         2)采用中断方式,ADC采集完成进入中断,中断关闭ADC采集,取数据之后再打开ADC采集。 以下按第一种方式实现: 二、ADC多通道配置 1)配置通道及参数     如果要控

    2024年02月05日
    浏览(35)
  • 电机FOC控制(三)STM32 CUBEMX 配置ADC采样

    本文在电机FOC控制(二)STM32 CUBEMX 配置三相PWM互补输出基础上,继续讲述如何STM32 CUBEMX 配置ADC寄存器,使TIMER1 PWM互补输出CC4触发ADC注入采样的过程。 打开Clock Configuration界面,将ADC设置为42.5MHz。 设定ADC1通道7和通道8为单端输入: 设定ADC2通道6和通道7为单端输入: ADCs_Comm

    2024年04月23日
    浏览(30)
  • 尝试使用CubeMX做stm32开发之十:ADC配置

            参考《STM32中文参考手册_V10》,研究CubeMX中有关ADC的配置。 ADC1 Mode and Configuration:         IN0~IN9:10路12位ADC采样通道,外部模拟量信号输入         Temperature Sensor Channel:MCU内置温度传感器采样通道,用来测量器件周围的温度。在MCU内部与ADC1_IN16通道相连

    2024年02月05日
    浏览(29)
  • STM32CubeMX配置STM32G031多通道ADC采集(HAL库开发)

    时钟配置HSI主频配置64M  勾选打开8个通道的ADC  使能连续转换模式  配置好串口,选择异步模式 配置好需要的开发环境并获取代码  修改main.c 串口重定向  串口重定向一定要勾选Use Micro LIB  获取ADC通道值 主函数   串口输出

    2024年02月15日
    浏览(39)
  • STM32初学入门笔记(3):STM32CubeMX配置STM32实现多通道ADC+DMA读取模拟量

    模拟信号的读取是我们在做很多项目是都要用到的,而模拟量的读取就要依赖于ADC数模转换器。对于初学者,学习使用ADC可以很大的帮助以后的STM32学习。 目录 ADC简介 : DMA简介:  工程开始: STM32CubeMX配置区: 配置外部时钟: 配置调试: 配置ADC: 配置DMA: 配置串口: 配

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包