这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » MCUADC参考电压变化怎么办?

共4条 1/1 1 跳转至

MCUADC参考电压变化怎么办?

菜鸟
2025-04-30 11:08:38     打赏

在嵌入式系统设计中,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_tRead_ADC_Channel(uint8_t channel);
#define FULL_SCALE    4095.0f
#define VREFINT_TYP   1.20f  // 典型值
floatRead_Actual_Voltage(uint8_t channel)
{
  uint16_t refint_data = Read_ADC_Channel(17);   // 读取VREFINT
  uint16_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参考电压源。 





关键词: MCU     ADC    

专家
2025-05-01 00:01:32     打赏
2楼

感谢分享


专家
2025-05-01 00:02:18     打赏
3楼

感谢分享


菜鸟
2025-05-06 23:44:51     打赏
4楼

感谢分享


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]