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

STM32F401CB ADC读取电位器控制LED无响应故障排查

故障排查:STM32F401CB ADC读取电位器控制LED无响应

问题描述

基于STM32F401CB开发项目,目标是读取电位器值并控制LED亮灭,但无论何种情况LED均不点亮,推测无法读取电位器值。硬件采用PA0作为模拟输入、PB0作为通用输出;软件配置12位分辨率ADC,转换值存储在16位变量potentiometer_value中,通过read_adc函数读取。即使将判断条件设为potentiometer_value>0,LED仍无反应。

相关代码

#include "stm32f4xx.h"

void rcc_config(void) {
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

}

void gpio_config(void) {
    GPIO_InitTypeDef gpio_init_struct;
    gpio_init_struct.GPIO_Mode=GPIO_Mode_AN;
    gpio_init_struct.GPIO_OType=GPIO_OType_PP;
    gpio_init_struct.GPIO_Pin=GPIO_Pin_0;
    gpio_init_struct.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpio_init_struct.GPIO_Speed=GPIO_Speed_2MHz;
    GPIO_Init(GPIOA,&gpio_init_struct);

    GPIO_InitTypeDef gpio_init_struct2;
    gpio_init_struct2.GPIO_Mode=GPIO_Mode_OUT;
    gpio_init_struct2.GPIO_OType=GPIO_OType_PP;
    gpio_init_struct2.GPIO_Pin=GPIO_Pin_0;
    gpio_init_struct2.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpio_init_struct2.GPIO_Speed=GPIO_Speed_2MHz;
    GPIO_Init(GPIOB,&gpio_init_struct2);

}

void adc_config(void) {
    ADC_CommonInitTypeDef adc_common_init_struct;
    adc_common_init_struct.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled;
    adc_common_init_struct.ADC_Mode=ADC_Mode_Independent;
    adc_common_init_struct.ADC_Prescaler=ADC_Prescaler_Div6;
    adc_common_init_struct.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_20Cycles;
    ADC_CommonInit(&adc_common_init_struct);

    ADC_InitTypeDef adc_init_struct;
    adc_init_struct.ADC_Resolution=ADC_Resolution_12b;
    adc_init_struct.ADC_DataAlign=ADC_DataAlign_Right;
    ADC_Cmd(ADC1,ENABLE);
    adc_init_struct.ADC_ContinuousConvMode=ENABLE;
    ADC_ContinuousModeCmd(ADC1,ENABLE);
    ADC_Init(ADC1,&adc_init_struct);

    ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_15Cycles);

}

uint16_t potentiometer_value;

uint16_t read_adc() {
    ADC_SoftwareStartConv(ADC1);
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);

    return ADC_GetConversionValue(ADC1);
    ADC_ClearFlag(ADC1,ADC_FLAG_EOC);


}

int main(void)
{
    rcc_config();
    gpio_config();
    adc_config();
    ADC_ClearFlag(ADC1,ADC_FLAG_EOC);
    GPIO_ResetBits(GPIOB,GPIO_Pin_0);



  while (1)
  {
      potentiometer_value=read_adc();
      if (potentiometer_value>0) {
          GPIO_SetBits(GPIOB,GPIO_Pin_0);
      }
      else {
          GPIO_ResetBits(GPIOB,GPIO_Pin_0);
      }
  }
}

故障可能原因

  • ADC初始化顺序错误:adc_config中先调用ADC_Cmd(ADC1,ENABLE)再执行ADC_Init,正确流程应为先完成所有参数初始化,再使能ADC模块。
  • EOC标志无法清除:read_adc函数中ADC_ClearFlag语句写在return之后,永远不会执行,导致EOC标志持续置位,后续转换判断逻辑失效。
  • 硬件连接问题:
    • 电位器未正确连接到PA0与电源/地,导致模拟输入无有效电压
    • LED回路缺少限流电阻或正负极接反,PB0输出无法驱动LED
    • STM32的VREF+参考电压未正确配置(内部参考需确认启用,外部参考需检查接线)
  • GPIO配置冗余:PA0配置为模拟输入时,GPIO_OType和GPIO_Speed参数无效,虽不影响功能,但易造成混淆。
  • ADC连续模式配置重复:同时通过adc_init_struct和ADC_ContinuousModeCmd开启连续模式,建议统一配置方式。

内容的提问来源于stack exchange,提问作者Onur Yağcı

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:18:26