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
相关产品推荐
相关产品推荐

