STM32CubeMX下STM32单片机声音传感器DMA方式采集多通道数据(ADC-DMA)

前言:之前一篇博客介绍了环境光传感器通过ADC的方式采集单通道的数据,现在介绍一下DMA方式采集多通道的数据。不过使用的是声音传感器,基本原理一样。
1.首先打开ADC1的两个通道IN11,IN12。使能两个通道。
在这里插入图片描述
2.ADC1配置:使能扫描转换模式(Scan Conversion Mode),使能连续转换模式(Continuous Conversion Mode),使能DMA连续请求。ADC规则组选择转换通道数为2(Number Of Conversion)。其他为默认设置。
在这里插入图片描述
3.打开中断。
在这里插入图片描述
4.添加DMA设置,设置为连续传输模式,数据长度为字。
在这里插入图片描述
5.端口通道配置完成在这里插入图片描述
6.时钟配置。在这里插入图片描述
7.项目管理。在这里插入图片描述
在这里插入图片描述
8.生成报告以及代码,编译程序。在adc.c文件中可以看到ADC初始化函数。在main函数前面添加变量。其中ADC_volume作为转换数据缓存数组,ad1,ad2存储PA6,PA7的电压值。

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
uint32_t ADC_volume[100];
uint8_t i;
uint32_t ad1,ad2;
/* USER CODE END PV */

9.在while(1)前面以DMA方式开启ADC转换。HAL_ADC_Start_DMA()函数第二个参数为数据存储的起始地址,第三个参数为DMA传输数据的长度。

 /* USER CODE BEGIN 2 */
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_volume,100);
  /* USER CODE END 2 */

由于DMA采用了连续传输的模式,ADC采集到的数据会不断传到到存储器中(此处即为数组ADC_volume)。ADC采集的数据从ADC_volume[0]一直存储到ADC_volume[99],然后采集到的数据又重新存储到ADC_volume[0],一直到ADC_volume[99]。所以ADC_volume数组里面的数据会不断被刷新。这个过程中是通过DMA控制的,不需要CPU参与。我们只需读取ADC_volume里面的数据即可得到ADC采集到的数据。
其中ADC_volume[0]为通道6(PA6)采集的数据,ADC_volume[1]为通道7(PA7)采集的数据,ADC_volume[2]为通道6采集的数据,如此类推。数组偶数下标的数据为通道6采集数据,数组奇数下标的数据为通道7采集数据。

10.在while(1)循环中添加应用程序,将采集的数据装换为电压值并输出。

 /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		    HAL_Delay(500);
        for(i = 0,ad1 =0,ad2=0; i < 100;)
        {
            ad1 += ADC_volume[i++];
            ad2 += ADC_volume[i++];
        }
        ad1 /= 50;
        ad2 /= 50;
 
        printf("\r\n******** ADC DMA Example ********\r\n\r\n");
        printf(" AD1 volume = %1.3fV \r\n", ad1*3.3f/4096);
        printf(" AD2 volume = %1.3fV \r\n", ad2*3.3f/4096);
				HAL_Delay(1000);
  }
      /* USER CODE END 3 */

程序中将数组偶数下标数据加起来求平均值,实现均值滤波的功能,再将数据转换为电压值。
11.编译程序并下载到开发板。打开串口调试助手。设置波特率为115200.串口助手上会显示声音对应的电压值。现象如下:
在这里插入图片描述

  • 13
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值