你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

小白求助!STM32L476使用VREF、VBAT采集模块电压,计算出的VBAT值偏大

[复制链接]
土豆爆炒马铃薯 提问时间:2025-9-2 11:11 / 未解决

从寄存器读出的校准值为0x0681,计算出VREF+=1.219V

当VBAT外界开发板上的3.3V时,使用公式得出Vbat=VREF+=1.219V 由于ADC监测值为实际值的1/3,因此Vbat实际值为1.219*3=3.657V

向各位大佬请教一下,是什么原因导致的VBAT值偏大

image.png

image.png

image.png
收藏 评论4 发布时间:2025-9-2 11:11

举报

4个回答
xmshao 回答时间:3 天前

你是不是有所误会,你说:

从寄存器读出的校准值为0x0681,计算出VREF+=1.219V

这是内部一个固定电压通道,名称是vrefint,并不是ADC模块的参考电压。

对于L4系列来说,ADC模块参考电压要么来自内部VrefBUF,要么来自外部Vref,通常Vref与VDDA相连。

另外,注意先做校准。

butterflyspring 回答时间:3 天前
你这描述似乎将Vbat 和 VREFINT 搞混了。 通常使用都是借助内部基准电压源测量反推VREF+ 的电压。

而且内部校准值是基准源的,建议参考手册部分。

STM32L476 VREFINT.PNG
土豆爆炒马铃薯 回答时间:3 天前

butterflyspring 发表于 2025-9-3 10:02
你这描述似乎将Vbat 和 VREFINT 搞混了。 通常使用都是借助内部基准电压源测量反推VREF+ 的电压。</p>
<p>而且内 ...

我理解内部校准值 VREFINT_CAL=0x0681,即地址0x1FFF75AA存放的数值

由于VREF与VDDA相连接,因此VREF+=VDDA=1.219V

目前测试是使用L476的VBAT引脚与开发板上的3.3V相连接,通过ADC1_channel18的ADC数值转换为VBAT的电压

不确定这样的理解是否有误,代码实现如下

`

void ProcessADCValues(volatile uint16_t *adcData, uint8_t length)
{
  for (uint8_t i = 0; i < length; i++)
  {
    // 处理每个通道的数据
    switch (i)
    {
    case 0:
      VREF_voltage = get_VREF(adcData[0]); // ADC channel 1, vref
      break;
    case 1:
      ILIM_MonitorI = get_MP5087_ILIM(adcData[1]); // ADC channel 3, ilim_monitor
      break;
    case 2:
      ILIM_MonitorI2 = get_MP5087_ILIM(adcData[2]); // ADC channel 4, ilim_monitor1
      break;
    case 3:
      Tosa_temp1 = get_NBC103_Temp(adcData[3]); // ADC channel 5, TOSA_TEMP1
      break;
    case 4:
      Moudle_temp = get_TH05_Temp(adcData[4]); // ADC channel 7, module_temp
      break;
    case 5:
      Tosa_temp2 = get_NBC103_Temp(adcData[5]); // ADC channel 13, TOSA_TEMP2
      break;
    case 6:
      Vbat_voltage = get_Vbat(adcData[6], VREF_voltage); // ADC channel 18, Vbat
      break;
    default:
      break;
    }
    HAL_Delay(100);
  }
}
#define VREFINT_CAL *((__IO uint16_t *)0x1FFF75AA) // VDDA = VREF+ =3.0V(± 10 mV)

float get_VREF(uint16_t adc_value)
{
  float Vdda = (3.0f * VREFINT_CAL) / adc_value;
  return Vdda;
}

float get_Vbat(uint16_t adc_value, float vref_voltage)
{
  float vbat = (vref_voltage / 4095.0f) * adc_value * 3.0f;
  return vbat;
}
butterflyspring 回答时间:昨天 15:17
Vrefint 是芯片内部的基准电压源,手册上可以看到在1.2v。 由于芯片之间略有差异,所以厂家在出厂时将其标准环境(注意是3v)下测量值存入芯片内部,即校准值。

VREF-, VREF+ 是ADC 和 DAC 的内部参照电压。所以VREF+才是ADC计算中的因子,与 Vrefint 是无关的电压。

由于内部的基准电压源无论外部供电电压是多少(大于最低工作电压),都是1.2v,所以才能通过ADC采样值反推出来VREF+ 的电压。



所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版