STM32L010RB使用HAL库读取ADC多通道时两通道数值相同问题求解
问题根因
你遇到的两个通道读数一致问题由以下几处配置错误共同导致:
- ADC通道配置的
Rank参数非法,STM32 HAL库的ADC常规序列Rank编号从1开始,你给CH0配置的Rank=0属于无效值,最终两个通道都被绑定到了Rank1的位置,导致后配置的通道覆盖前序配置。 - 通道配置结构体未补全
SamplingTime参数,缺少采样时间配置会导致采样参数异常,读数不稳定。 - ADC初始化时开启了连续转换模式(
ContinuousConvMode = ENABLE),和你单次触发单次读取的逻辑冲突,容易出现转换结果残留覆盖的问题。 - 读取完转换结果后未主动清除EOC(转换完成)和OVR(数据溢出)标志位,上一次的转换结果会被重复读取。
修复方案
按以下步骤修改代码即可解决问题:
- 修正通道选择函数的配置参数,补全采样时间,统一设置Rank为1:
void ADC_Select_CH0(void){ ADC_ChannelConfTypeDef sConfig_0 = {0}; sConfig_0.Channel = ADC_CHANNEL_0; sConfig_0.Rank = ADC_REGULAR_RANK_1; // 等效于数值1 sConfig_0.SamplingTime = ADC_SAMPLETIME_79CYCLES_5; // 和ADC初始化参数保持一致 if (HAL_ADC_ConfigChannel(&hadc, &sConfig_0) != HAL_OK){ Error_Handler(); } } void ADC_Select_CH1(void){ ADC_ChannelConfTypeDef sConfig_1 = {0}; sConfig_1.Channel = ADC_CHANNEL_1; sConfig_1.Rank = ADC_REGULAR_RANK_1; sConfig_1.SamplingTime = ADC_SAMPLETIME_79CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc, &sConfig_1) != HAL_OK){ Error_Handler(); } }
- 修改ADC初始化代码,关闭连续转换模式:
// MX_ADC_Init函数中修改对应配置 hadc.Init.ContinuousConvMode = DISABLE;
- 修改通道读取函数,读取完成后清除标志位:
void ADC_Check_CH0(void){ HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc, 100); Axis[0] = HAL_ADC_GetValue(&hadc); __HAL_ADC_CLEAR_FLAG(&hadc, ADC_FLAG_EOC | ADC_FLAG_OVR); // 清除标志位 HAL_ADC_Stop(&hadc); } void ADC_Check_CH1(void){ HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc, 100); Axis[1] = HAL_ADC_GetValue(&hadc); __HAL_ADC_CLEAR_FLAG(&hadc, ADC_FLAG_EOC | ADC_FLAG_OVR); HAL_ADC_Stop(&hadc); }
优化建议
如果需要长期读取两个ADC通道,建议直接使用扫描模式+DMA的方案:提前配置CH0为Rank1、CH1为Rank2,开启DMA自动搬运转换结果到Axis数组,无需反复切换通道配置,转换效率和稳定性更高。
内容的提问来源于stack exchange,提问作者Serhii
相关产品推荐
相关产品推荐

