STM32 cubemx 多路ADC+DMA

一、cubemx基本配置

        STM32 cubemx 多路ADC+DMA_第1张图片

 STM32 cubemx 多路ADC+DMA_第2张图片

 STM32 cubemx 多路ADC+DMA_第3张图片

 

 二、启动ADC和DMA

STM32 cubemx 多路ADC+DMA_第4张图片

 STM32 cubemx 多路ADC+DMA_第5张图片

 STM32 cubemx 多路ADC+DMA_第6张图片

 STM32 cubemx 多路ADC+DMA_第7张图片

STM32 cubemx 多路ADC+DMA_第8张图片 

 三、串口监视STM32 cubemx 多路ADC+DMA_第9张图片

 四、代码

STM32 cubemx 多路ADC+DMA_第10张图片 

 

STM32 cubemx 多路ADC+DMA_第11张图片

//定义一个DMA接收数组
uint32_t ADC_Value[120]={0};



//ADC_DMA 启动
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 120);


//均值滤波
uint32_t ad1=0, ad2=0, ad3=0, ad4=0, ad5=0, ad6=0;
int i=0;
for (i = 0, ad1 = ad2 = ad3 = ad4 = ad5 = ad6 = 0; i < 120;)
		{
				ad1 += ADC_Value[i++];
				ad2 += ADC_Value[i++];
				ad3 += ADC_Value[i++];
				ad4 += ADC_Value[i++];
				ad5 += ADC_Value[i++];
				ad6 += ADC_Value[i++];
		}
	    ad1=ad1/20;
		ad2=ad2/20;
		ad3=ad3/20;
		ad4=ad4/20;
		ad5=ad5/20;
		ad6=ad6/20;

//重写Printf
#include "stdio.h"
int fputc(int ch,FILE *f)
{
    uint8_t temp[1]={ch};
    HAL_UART_Transmit(&huart1,temp,1,2);       
}
//上位机接收
printf("1=%4d,2=%4d,3=%4d,4=%4d,5=%4d,6=%4d\r\n",ad1,ad2,ad3,ad4,ad5,ad6);

 定义了6路adc通道,从dma中获取的值会依次存入入数组中

由于定义的数组 ADC_Value大小为120,

第一个ADC通道Channel0的值存入ADC_Value[0],

Channel1的值存入ADC_Value[1],

Channel2的值存入ADC_Value[2],

Channel3的值存入ADC_Value[3],

Channel4的值存入ADC_Value[4],

Channel5的值存入ADC_Value[5],

此时完成了一次所有通道的接收,由于启动了DMA循环模式,adc通道将继续接收数据

Channel0的值存入ADC_Value[6],

Channel1的值存入ADC_Value[7],

Channel2的值存入ADC_Value[8],

Channel3的值存入ADC_Value[9],

Channel4的值存入ADC_Value[10],

Channel5的值存入ADC_Value[11],

以此类推,直到Channel5的值存入ADC_Value[119],又重新回到Channel0的值存入ADC_Value[0],..

一直循环下去 

如果不需要滤波,直接将ADC_Value的大小定义为

                        uint32_t  ADC_Value[6]={0};

然后启动ADC DMA

                        HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 6);

需要数据时直接读取ADC_Value[0] 到ADC_Value[5]的值

ADC_Value[0] 对应第一个通道采集的值

 五、结果

采用六个电位器作为ADC的输入,选择电位器可以明显看到每路adc的值发生变化

STM32 cubemx 多路ADC+DMA_第12张图片

你可能感兴趣的:(CUBEMX,stm32,单片机,arm)