1、配置ADC,设置5个通道采集
2、使能DMA设置为循环模式
生成工程后编写函数
1、校准ADC,开启DMA接收,在main函数初始化部分调用
#define ADC_MAX_NUM 5 #define BTN_BUFF_LEN 100 static uint16_t dma_adc_data[BTN_BUFF_LEN * ADC_MAX_NUM];
1 /** 2 * @brief 校准adc,开启DMA接收 3 * 4 */ 5 void Adc_Init(void) 6 { 7 // 校准 8 HAL_ADCEx_Calibration_Start(&hadc1); 9 HAL_ADC_Start_DMA(&hadc1, (uint32_t *)dma_adc_data, BTN_BUFF_LEN * ADC_MAX_NUM); 10 11 }
/**DMA采集的数据存放buff,采集5个通道,每个通道采集BTN_BUFF_LEN次
* dma_adc_data数据存放方式:HAL_ADC_Start_DMA(&hadc1, (uint32_t *)dma_adc_data, BTN_BUFF_LEN * ADC_MAX_NUM);
* 数据采集u32类型,dma_adc_data为u16类型,
* 第1个u32:通道1和通道2
* 第2个u32:通道3和通道4
* 第3个u32:通道5和通道1
* 第4个u32:通道2和通道3
* 第5个u32:通道4和通道5
*/
dma_adc_data中,第0、5、10、15...个数据为第1通道数据,可求取平均数滤波获取当前ADC值,经测试,无通道间数据干扰的问题
/**DMA采集完成标志 */ uint8_t DMA_RECEIVE_OVER = 0; /**获取的数据存放最大值和最小值 */ static uint16_t adc_max, adc_min; /**数据累加 */ static uint32_t adc_add; uint16_t ADC_Values[ADC_MAX_NUM] = {0}; /** * @brief Get the Adc Value object 处理原始数据,获取5个通道的数据 */ static void Get_Adc_Value(void) { if (DMA_RECEIVE_OVER == 1) // DMA数据采集完处理数据 { DMA_RECEIVE_OVER = 0; for (uint8_t adc_channel = 0; adc_channel < ADC_MAX_NUM; adc_channel++) { adc_max = 0; adc_add = 0; adc_min = 0xffff; for (uint16_t i = 0; i < BTN_BUFF_LEN; i++) { adc_add += dma_adc_data[ADC_MAX_NUM * i + adc_channel]; adc_max = adc_max > dma_adc_data[ADC_MAX_NUM * i + adc_channel] ? adc_max : dma_adc_data[ADC_MAX_NUM * i + adc_channel]; adc_min = adc_min < dma_adc_data[ADC_MAX_NUM * i + adc_channel] ? adc_min : dma_adc_data[ADC_MAX_NUM * i + adc_channel]; } ADC_Values[adc_channel] = (adc_add - adc_max - adc_min) / (BTN_BUFF_LEN - 2); } } } /** * @brief DMA采集完成中断服务函数 * * @param hadc ADC句柄 */ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) { // 采集完成标志位置1 DMA_RECEIVE_OVER = 1; }
标签:DMA,HAL,dma,MAX,多通道,STM32,NUM,adc,ADC From: https://www.cnblogs.com/yianyan/p/18138923