You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32L010RB使用HAL库读取ADC多通道时两通道数值相同问题求解

问题根因

你遇到的两个通道读数一致问题由以下几处配置错误共同导致:

  • ADC通道配置的Rank参数非法,STM32 HAL库的ADC常规序列Rank编号从1开始,你给CH0配置的Rank=0属于无效值,最终两个通道都被绑定到了Rank1的位置,导致后配置的通道覆盖前序配置。
  • 通道配置结构体未补全SamplingTime参数,缺少采样时间配置会导致采样参数异常,读数不稳定。
  • ADC初始化时开启了连续转换模式(ContinuousConvMode = ENABLE),和你单次触发单次读取的逻辑冲突,容易出现转换结果残留覆盖的问题。
  • 读取完转换结果后未主动清除EOC(转换完成)和OVR(数据溢出)标志位,上一次的转换结果会被重复读取。

修复方案

按以下步骤修改代码即可解决问题:

  1. 修正通道选择函数的配置参数,补全采样时间,统一设置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();
  }
}
  1. 修改ADC初始化代码,关闭连续转换模式:
// MX_ADC_Init函数中修改对应配置
hadc.Init.ContinuousConvMode = DISABLE;
  1. 修改通道读取函数,读取完成后清除标志位:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:36:02