凡亿教育-小米
凡事用心,一起进步
打开APP
公司名片
凡亿专栏 | MCU ADC参考电压变化怎么办?
MCU ADC参考电压变化怎么办?

然而,很多工程师对ADC参考电压(VREF)的认识仍然存在模糊,尤其是在电池供电、电压不稳场景下。


ADC参考电压定义了ADC输入电压与数字输出之间的比例关系:


bf8d5c3bb8f5306e7d10eb8bb34dd8.jpg


其中 N 是ADC分辨率(如STM32F103为12位)。 


fdf4c5e943b015c51cb7ff9fca936b.jpg


当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。


8420a830895a32f88139dc692b8fab.jpg


采样VREFINT得到数据 DATAREFINT_DATA ,则有:


18c7323ff8bcce17b3a3a45aaebb19.jpg


进一步,采样实际通道ADCHX的数据 ADCHX_DATA,可计算实际输入电压:

 

354a21d1e7f2928e39f924bf4e9a38.jpg


简化公式:


88a5ae26cb6e362304301d24641ce5.jpg


示例代码如下:



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存储。


计算公式更新:


a8d346abb9bfa760159e6c8dd4d290.jpg


新一代STM32(如STM32L5、STM32G4等)内部集成了VREFBUF模块,支持输出稳定参考电压如2.048V或2.5V,直接作为ADC参考电压源。 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。
相关阅读
进入分区查看更多精彩内容>
精彩评论

暂无评论