STM32L422使用内部参考电压测量ADC值结果异常排查求助
STM32L422内部参考电压ADC采样异常故障原因及解决
故障原因汇总
- ADC参考源配置错误:你的ADC初始化代码未指定参考电压为内部VREFINT,STM32L4系列ADC默认参考源为Vdda引脚电压,你用1.2V作为基准做换算,但ADC实际以Vdda为基准,是结果偏离的核心原因。
- VREF引脚测量逻辑错误:未开启VREFINT输出功能时,VREF+引脚为高阻态,此时测量得到的0.53V为无效值,不能代表内部参考电压的实际值。
- 换算公式未使用出厂校准值:你直接用标称1.2V做换算,没有使用芯片OTP区存储的出厂校准的VREFINT值,会引入固定偏差。
- 采样逻辑不完善:单次采样易受干扰,没有采集内部VREFINT通道做实时校准,精度无法保证。
修复步骤
- 修改ADC初始化配置,显式指定参考源为内部VREFINT:
在MX_ADC1_Init函数中hadc1.Instance = ADC1;之后添加配置:
hadc1.Init.ReferenceVoltage = ADC_REFERENCE_INTERNAL;
同时在CubeMX的ADC配置界面将Reference Voltage选项改为Internal Reference,不要使用默认的Vdda。
开启VREFINT时钟并增加稳定等待时间:
确认RCC配置中VREFINT外设时钟已经使能,在ADC初始化之后、校准之前增加10ms延时,保证内部参考电压稳定。修正电压换算逻辑,使用出厂校准值:
// 先采集内部VREFINT通道的采样值,用于实时计算实际内部参考电压 ADC_ChannelConfTypeDef sConfigVref = {0}; sConfigVref.Channel = ADC_CHANNEL_VREFINT; sConfigVref.Rank = ADC_REGULAR_RANK_1; sConfigVref.SamplingTime = ADC_SAMPLETIME_92CYCLES_5; HAL_ADC_ConfigChannel(&hadc1, &sConfigVref); HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1,100); uint16_t vref_adc = HAL_ADC_GetValue(&hadc1); HAL_ADC_Stop(&hadc1); // 计算实际内部参考电压,*VREFINT为3.0V参考下的出厂校准值 float real_vref = (float)(*VREFINT) * 3.0f / vref_adc; // 切换回输入通道采集,计算实际输入电压 sConfig.Channel = ADC_CHANNEL_12; HAL_ADC_ConfigChannel(&hadc1, &sConfig); HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1,100); uint16_t input_adc = HAL_ADC_GetValue(&hadc1); HAL_ADC_Stop(&hadc1); float input_voltage = (float)input_adc * real_vref / 4095.0f;
- 硬件检查:确认分压电路输出电压实际为1V,VREF+引脚没有对地短路或接其他负载。
相关硬件截图


内容的提问来源于stack exchange,提问作者sujan_014
相关产品推荐
相关产品推荐

