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

STM32F302VC多ADC通道扫描转换仅获最后通道值问题

解决STM32F302VC扫描模式下ADC仅返回最后一个通道值的问题

你的问题根源在于单次等待EOC并读取值的逻辑,无法匹配扫描+连续模式下多通道依次转换的流程:开启扫描+连续模式后,ADC会按配置的通道序列依次完成转换,每个通道转换结束都会触发EOC,但你当前代码只捕获了最后一次EOC事件,自然只能拿到最后一个通道的结果。

修改方案

核心是循环读取所有配置的通道结果,每次等待单个通道转换完成(EOC)后立即读取值,直到所有通道都读取完毕再停止ADC。

修改后的代码示例

假设你已经正确配置了4个通道(和NbrOfConversion = 4对应),读取逻辑修改如下:

// 启动ADC1转换
if (HAL_ADC_Start(&hadc1) == HAL_OK)
{
    // 循环读取所有配置的ADC通道(数量等于NbrOfConversion)
    for (int i = 0; i < 4; i++)
    {
        // 等待当前通道转换完成
        if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK)
        {
            // 读取当前通道的转换值
            adc1_value[i] = HAL_ADC_GetValue(&hadc1);
            HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_10);
        }
    }
}

// 所有通道读取完成后,停止ADC转换
HAL_ADC_Stop(&hadc1);

关键配置与注意事项

  • 通道数量匹配:确保hadc1.Init.NbrOfConversion的值和你实际配置的通道数量一致。你当前初始化里设了4,但只配置了通道2和4,需要补充剩下2个通道的配置,否则ADC会重复转换已配置通道或出现异常。
  • EOC选择正确性:你当前设置的ADC_EOC_SINGLE_CONV是正确的,该配置会让每个通道转换完成都触发EOC,正好匹配逐个读取的逻辑。如果改成ADC_EOC_SEQ_CONV,则只有整个序列转换完成才触发EOC,无法逐个读取。
  • 连续模式的作用:开启ContinuousConvMode = ENABLE后,ADC完成一个通道序列转换后会自动重新开始,不过我们在读完所有通道后就调用HAL_ADC_Stop,不会进入循环扫描,正好符合单次读取所有通道的需求。

内容的提问来源于stack exchange,提问作者Runzolf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:57:38