MCU ADC参考电压变化怎么办?
在嵌入式系统设计中,ADC(模数转换器)精度直接决定了系统对模拟信号的感知能力。
然而,很多工程师对ADC参考电压(VREF)的认识仍然存在模糊,尤其是在电池供电、电压不稳场景下。
ADC参考电压定义了ADC输入电压与数字输出之间的比例关系:
其中 N 是ADC分辨率(如STM32F103为12位)。
当VREF(即VDDA)稳定时,ADC转换是准确的。
但如果VDDA电压波动,比如电池电量下降,而系统仍使用初始VREF假定值去换算ADC结果,则会导致测量误差。
以前我做低功耗设备遇到过的一个现象:初始VDDA=3.3V,测得电压2.0V,对应ADC=2482。后来VDDA降到3.0V,但仍用3.3V计算 → 误差超出9%以上!
所以,在供电电压变化的应用中(如电池供电设备),必须动态感知参考电压变化。
STM32F103内部集成了一个稳定的基准电压源VREFINT,典型值约1.20V。它连接到ADC通道17,可以通过采样通道17的数据推算实际VREF。
采样VREFINT得到数据 DATAREFINT_DATA ,则有:
进一步,采样实际通道ADCHX的数据 ADCHX_DATA,可计算实际输入电压:
简化公式:
示例代码如下:
uint16_t Read_ADC_Channel(uint8_t channel);
#define FULL_SCALE 4095.0f
#define VREFINT_TYP 1.20f // 典型值float Read_Actual_Voltage(uint8_t channel)
{uint16_t refint_data = Read_ADC_Channel(17); // 读取VREFINTuint16_t chx_data = Read_ADC_Channel(channel); // 读取实际通道float voltage = VREFINT_TYP * ((float)chx_data / (float)refint_data);return voltage;
}
由于每颗芯片的VREFINT存在个体差异(工艺浮动),需要出厂或用户自校准,校准方法如下:
- 供电稳定(如VDDA=3.3V);
- 读取VREFINT通道,记录为REFINT_CAL;
- 保存至Flash存储。
计算公式更新:
新一代STM32(如STM32L5、STM32G4等)内部集成了VREFBUF模块,支持输出稳定参考电压如2.048V或2.5V,直接作为ADC参考电压源。