STM32:HAL多通道ADC数据采集
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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构