//定义一个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的值发生变化