本文共 1771 字,大约阅读时间需要 5 分钟。
前言:之前一篇博客介绍了环境光传感器通过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.串口助手上会显示声音对应的电压值。现象如下:转载地址:http://xyhgn.baihongyu.com/