基于stm32实现adc的双通道采集HAL库DMA方式

基于stm32实现adc的双通道采集HAL库DMA方式

本文目标:基于stm32实现adc的双通道采集HAL库DMA方式实验

按照本文的描述,应该可以跑通实验并举一反三。

先决条件:装有编译和集成的开发环境,比如:Keil uVision5、STM32CubeMX

使用外设:USART1、GPIO、ADC、DMA

前言

这篇文章是使用了双通道的adc进行验证而积累,属于自我笔记类型,供初学者进行学习验证。

实验目的

基于stm32实现adc的双通道采集HAL库DMA方式实验,顺便记录一下使用自己所理解的点。

关于ADC的特点

在这里插入图片描述

功能框图:

在这里插入图片描述

关于ADC的模式

在这里插入图片描述

扫描模式: 使用STM32CUBEMX配置了多通道后,这一项默认开启且无法设置成关闭。这个模式就是自动扫描你开启的所有通道进行转换,直至转换完。例如你开启了CH0、CH1、CH2、CH3这四个通道,启动转换后ADC会自动将这4个通道全部转换完,但是这种连续性是可以被打断的,所以就引出了间断模式。

连续模式: 在CUBE中选中ENABLE就是连续模式,DISABLE就是单次模式。开启连续模式后,ADC的转换不由其他控制。例如将ADC设置为了定时器的TGRO触发采样,如果开启连续模式,ADC将忽略定时器的触发采样。(连续转换模式开启后其实就是满频率的采样)。

间断模式: 可以将多个通道进行分组采集,例如你开启了CH0~3这4个通道,假如你设置了间断次数为4,就相当于将4个通道分成了4组,每组1个通道,那么要想采集完这4个通道就需要手动触发4次ADC采集;如果设置了间断次数为2,那么采集完4个通道就需要手动触发2次ADC采集。

关于采样时间

ADC采样两点间隔的时间一定要大于ADC的采样时间! 采样时间怎么算,下面就细说一下。

STM32F103一般将时钟配置主频为72M、APB2为72M。ADC挂在APB2时钟总线上,且ADC的时钟不能超过14M。所以一般将ADC的分频设置为6,ADC的时钟主频就为72/6=12MHz。那么一个周期就是:1/12MHz=0.0833us。
在这里插入图片描述

上图的意思是:ADC对输入电压采样若干个ADC_CLK周期,这些周期可通过ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位进行修改。每个通道都可以用不同的采样时间进行采样。

ADC转换时间 = 采样时间 + 12.5个周期

示例:
当ADC时钟主频为14MHz并且采样时间为1.5个周期时:采样时间 = 1.5 + 12.5 = 14个周期;一个周期的时间为1/14MHz,一共14个周期,1 / 14MHz * 14个周期 = 1us,那么此时ADC的采样频率就是1/1us=1000KHz=1MHz,这也是理论上ADC的最大采样频率。
STM32F1系列的时钟主频一般设置为了12M,采样时间的设置所对应采样频率如下图所示:

在这里插入图片描述

知道了最短时间后,当ADC时钟主频为12M并且采样时间为1.5个周期时,ADC采样两点的时间必须大于1.17us。

基于上面的描述,接下来进行工程实验。

搭建工程

使用STM32CubeMX配置stm32的基本配置。基本的配置如下:开启swd调试,开启外部时钟。

在这里插入图片描述

在这里插入图片描述

  • 配置USART1,用于printf调试

在这里插入图片描述

  • 配置ADC1,用于本次实验的测试

在这里插入图片描述

在这里插入图片描述

  • 时钟界面选项卡:

在这里插入图片描述

  • 工程选项卡:

在这里插入图片描述

在这里插入图片描述

点击右上角的的生成代码:

在这里插入图片描述

使用keil打开工程,编译工程,一切都是ok

在这里插入图片描述

编写代码实现需求

开始编写代码,首先要把串口的打印映射好,使用下面的代码片段可用正常使用printf打印

int fputc( int ch, FILE *f )
{
	USART_TypeDef* USARTx = USART1;
	while ((USARTx->SR & (1<<7)) == 0);
	USARTx->DR = ch;
	return ch;
}

接下来定义数组用于接收数据

uint16_t g_sensor_adc_value[2] = {0};

在main函数中简单进行测试一下

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* 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();
  /* USER CODE BEGIN 2 */
    HAL_ADCEx_Calibration_Start(&hadc1);		                      //  启动ADC转换
	HAL_ADC_Start_DMA(&hadc1,(uint32_t*)g_sensor_adc_value,2);	//  开启DMA
  while (1)
  {
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
		HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&g_sensor_adc_value[0],2);	//  开启DMA
  }
}

实验现象

在这里插入图片描述

总结

这里我外接了两个感应器,可以看到单片机此时能够正常获取数据,能根据传感器采集的数据变化而变化,综上所述本次实验取得预期效果。

参考大牛的博客

STM32CubeMX | HAL库的ADC多通道数据采集(轮训、DMA、DMA+TIM)、读取内部传感器温度_stm32cubemx | stm32使用hal库的adc多通道数据采集(dma+非dma方式)+ -CSDN博客

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: STM32 HAL ADC定时器触发是指使用STM32单片机的HAL进行ADC采样时,通过定时器产生的触发信号来触发ADC的转换操作。 在STM32 HAL中,可以通过以下步骤来实现ADC定时器触发: 1. 配置定时器: 首先,需要使用HAL的相应函数来配置定时器,设置定时器的时钟源、预分频系数、计数器周期等参数。可以根据具体的需求选择合适的定时器和配置参数。 2. 配置ADC: 使用HAL的相应函数来配置ADC,设置采样通道、采样时间、数据对齐方式等参数。同时需要将ADC的触发源设置为定时器触发模式。 3. 启动定时器和ADC: 使用HAL的相应函数来启动定时器和ADC的操作。定时器开始计数后,当计数器的值达到设定的周期时,会产生一个触发信号。 4. 处理ADC转换完成中断: 当ADC转换完成后,会产生一个中断信号。在中断处理函数中可以获得ADC的转换结果,并进行相应的处理。 通过以上步骤,就可以实现ADC定时器触发,默认情况下,每隔一段时间就会触发一次ADC的转换操作,从而实现定时采样。 需要注意的是,在配置定时器和ADC时,要根据具体的需求进行相应的参数设置,同时要根据转换周期确定定时器的计数器周期。此外,在使用中断处理ADC转换结果时,需要注意中断优先级的设置和合理的数据处理方式。 通过以上方法,我们可以方便地实现STM32 HAL ADC定时器触发,便于实现周期性的ADC采样操作。 ### 回答2: STM32 HAL ADC定时器触发是指使用STM32HAL来配置ADC(模数转换器)以便启动和定时触发ADC转换的过程。 在使用ADC进行模数转换时,使用定时器触发可以将ADC的转换和采样过程与外部定时器同步,以确保准确的转换和采样频率。以下是实现STM32 HAL ADC定时器触发的步骤: 1. 配置定时器: 使用HAL的函数(如HAL_TIM_Base_Init()和HAL_TIM_Base_Start())对定时器进行初始化和启动配置。可以设置定时器的计数周期、预分频因子和重装载值等参数,根据需要选择适当的计时频率。 2. 配置ADC: 使用HAL的函数(如HAL_ADC_Init()和HAL_ADC_ConfigChannel())对ADC进行初始化和通道配置。可以设置ADC的采样时间和分辨率等参数,根据需要选择适当的通道和输入源。 3. 配置触发事件: 使用HAL的函数(如HAL_ADCEx_InjectedConfigChannel()和HAL_TIM_Base_Start_IT())来配置ADC使用定时器作为触发源。可以选择定时器的触发源和触发模式,如上升沿、下降沿或双边沿触发等。 4. 启动ADC转换: 使用HAL的函数(如HAL_ADC_Start())启动ADC的转换过程。此时,当定时器触发事件发生时,ADC将自动启动转换,并将采样结果存储在指定的转换缓冲区中。 通过以上步骤,就可以实现使用STM32 HAL配置ADC定时器触发。这种方式简化了ADC配置的过程,并确保了转换和采样的准确性和稳定性,适用于许多需要定时采样的应用场景,如数据采集、传感器测量等。 ### 回答3: STM32 HAL (Hardware Abstraction Layer)是ST公司推出的一套针对STM32系列单片机的软件,可以方便开发者快速进行开发和移植。ADC(模数转换器)是STM32系列单片机中的一个重要外设,用于将模拟信号转换为数字信号。 在使用STM32 HAL进行ADC定时器触发时,我们可以按照以下步骤进行操作: 1. 配置ADC外设:包括选择转换模式(单次转换或连续转换)、设置转换通道(即输入引脚)、设置采样时间和分辨率等。 2. 配置定时器:选择合适的定时器,并设置相关参数,如定时器时钟源、分频系数、自动重装载值等。 3. 启动定时器:调用HAL_TIM_Base_Start函数启动定时器,使之开始计时。 4. 启动ADC转换:调用HAL_ADC_Start_IT或HAL_ADC_Start_DMA函数启动ADC转换,并通过设置触发源为定时器,使得ADC可以在定时器溢出时进行转换。 5. 等待转换完成:可以使用定时器的中断回调函数或ADC的中断回调函数来进行处理,以获取ADC转换结果。 总结来说,通过配置ADC外设和定时器,然后启动定时器和ADC转换,并设置ADC的触发源为定时器,就可以实现ADC定时器触发的功能。在定时器溢出时,ADC会自动开始转换,并在转换完成后,通过中断或DMA方式将结果传送给相应的缓冲区。 以上是对STM32 HAL ADC定时器触发的简要描述,希望对你有所帮助。如有不清楚的地方,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独处东汉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值