stm32ADC精确电压计算公式详解

写在前面:

        看了许多篇关于ADC精确采集电压的方法,我真是越看越糊涂,特别是下面这个公式。不知道是否有人和我一样的感受。一方面是我自己有待提高,另一方面我觉得虽然有几篇是高点赞高收藏的文章,但对于我这样的新手,理解起来还是很费劲。

如果有人翻到我这篇文章,相信也是看了不少文章了,但为了讲解得更流畅,还是先简要介绍一下公式中的变量。

        1、VREFINT_CAL:内部参照电压。关于这个电压的解释不是每个MUC的数据手册中都有,或者有些写得详细点,有些就一笔带过。这个电压是在MCU出厂测试的时候,ST公司提供,在3.0V电源供电下,内部参考电压的ADC采样值,ST将它写入了内存0x1FFF F7BA - 0x1FFF F7BB中。读取该地址,就可以把该值取出。这个参照电压的范围是1.182-1.232V(数据手册可查),具体多少,每个MCU都有点差别。

stm32ADC精确电压计算公式详解_第1张图片

        2、VREFINT_DATA:ADC1通道17获取的参照电压。通道17是与Vref+连在一起的,所以获取到的电压就是实时的参考电压。

        3、FULL_SCALE:满量程的数值,12位精度下这个值就等于4096-1。

        4、ADCx_DATA:我们要获取的目标电压数值。

公式推导:

1、从理论上看,ST提供的基准电压Vrefint1,和实际MCU得到的基准电压Vrefint2,应该是相等的。

2、

而Vrefint1 是在3.0V的参考电压下得出的,所以Vrefint1 = 3.0V * (VREFINT_CAL/FULL_SCALE)

而Vrefint2 是在不确定的参考电压下得到,这个参考电压也是我们需要的。 所以Vrefint2 = VDDA * (VREFINT_DATA/FULL_SCALE)

3、因此,就可以建立这样的等式:

VDDA * (VREFINT_DATA/FULL_SCALE) =  3.0V * (VREFINT_CAL/FULL_SCALE)

然后就可以得出下面这个让我们百思不得其解的公式。

VDDA = 【3.0V * (VREFINT_CAL/FULL_SCALE)    】 / 【 (VREFINT_DATA/FULL_SCALE) 】

最终VDDA = 【3.0V * VREFINT_CAL  】 / 【 VREFINT_DATA 】

4、所以我们可以得出  精确的电压值V = VDDA * (ADCx_DATA /FULL_SCALE )

也就得出下面这个让我百思不得其解的公式了:

那为什么用到以上这个公式,我们的测出的电压就精确了呢?

这时候就要从ADC的采样范围(也就是ADC输入范围)开始讲起,

stm32ADC精确电压计算公式详解_第2张图片

 而Vref+与Vref-的数值是由谁决定呢?,不同引脚数的MCU情况不一样。

 64脚或更少封装下,二者直接与ADC的电源VDDA和VSSA相连。

 在100脚和144脚封装下,为了确保输入为低压时获得更好的精度,用户可以连接一个独立的外部参考电压ADC到Vref+和Vref-脚上。当然默认情况下是与VDDA和VSSA相连。

stm32ADC精确电压计算公式详解_第3张图片

3.3V的供电电压是最理想的,但是实际上,一般都会有mv单位下的误差。如果我们要获得精准的Vref+就要实时获得VDDA的电压值。

为此,提出以下的方案:

首先MCU内部的ADC1通道17是和内部参照电压相连的,我们可以开启ADC1的通道17获取内部参照电压。这个参照电压就是上面的VREFINT_DATA。

    但这样通过通道17得出的内部参照电压VREFINT_DATA,只是一个数字量,并不是模拟量,基准电压的模拟量我们无法确定是哪一个值,每块MCU多多少少硬件上都会有差异,只知道在1.182-1.232V之间。

    所以我们会发现  U(内部参照电压) = VDDA * (VREFINT_DATA/FULL_SCALE)中,U(内部参照电压)无法获知,所以这样还不可以获取到准确的VDDA。

此时的问题变成我们要获取到准确的内部参照电压值。

为此,st公司给了我们一个内部参照电压的的固定电压数字量,但是这个数字量是在3V供电,25℃下的值VREFINT_CAL

这个参照电压是st公司在mcu出厂测试的时候帮我们测的,它代表着在逼近理想状态下的内部参照电压,它存在内存0x1FFF F7BA - 0x1FFF F7BB中。

又因为这个值是在3.0V供电下测得,

故,VDDA = 3.0V       

U(内部参照电压)  = 3.0 * (VREFINT_CAL/FULL_SCALE)。

剩下的就是数学问题了,1、2式合并得出VDDA的实际值。有了准确的VDDA值后就可以获得准确的ADC转换电压了。

分享不易,点个赞再走呗

你可能感兴趣的:(stm32,嵌入式硬件,单片机)