看了许多篇关于ADC精确采集电压的方法,我真是越看越糊涂,特别是下面这个公式。不知道是否有人和我一样的感受。一方面是我自己有待提高,另一方面我觉得虽然有几篇是高点赞高收藏的文章,但对于我这样的新手,理解起来还是很费劲。
如果有人翻到我这篇文章,相信也是看了不少文章了,但为了讲解得更流畅,还是先简要介绍一下公式中的变量。
1、VREFINT_CAL:内部参照电压。关于这个电压的解释不是每个MUC的数据手册中都有,或者有些写得详细点,有些就一笔带过。这个电压是在MCU出厂测试的时候,ST公司提供,在3.0V电源供电下,内部参考电压的ADC采样值,ST将它写入了内存0x1FFF F7BA - 0x1FFF F7BB中。读取该地址,就可以把该值取出。这个参照电压的范围是1.182-1.232V(数据手册可查),具体多少,每个MCU都有点差别。
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输入范围)开始讲起,
而Vref+与Vref-的数值是由谁决定呢?,不同引脚数的MCU情况不一样。
64脚或更少封装下,二者直接与ADC的电源VDDA和VSSA相连。
在100脚和144脚封装下,为了确保输入为低压时获得更好的精度,用户可以连接一个独立的外部参考电压ADC到Vref+和Vref-脚上。当然默认情况下是与VDDA和VSSA相连。
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转换电压了。
分享不易,点个赞再走呗