打印
[应用相关]

STM32如何通过内部VREF得到实际的VDDA值

[复制链接]
3379|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
天灵灵地灵灵|  楼主 | 2017-12-28 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

我们经常会使用STM32 ADC功能测试外部电压,在一些精度不高的场合,我们一般就用3.3V作为参考电压来计算测到的电压值。

不过,这种情况很少见,可能只有单片机学习板才会这样使用。

因为我们使用的3.3V稳压芯片,很少有标准的3.300V输出,有可能是3.270V,也可能是3.345V,而且,还存在个体差异,这个板子上的电压是3.294V,另外一个板子上面,就可能是3.312V。

如果我们都用3.300来计算的话,同样的电压,测出来的结果就会存在mV级别的差异。

在实际使用中,我们一般使用外部基准电压芯片,例如,100脚的STM32一般都有VREF引脚,就是用来接外部基准电压芯片,例如REF3133,输出的电压是标准的3.300V。

为什么不用基准电压芯片作为电源供电芯片?

因为基准电压芯片的输出电流都是小于25mA的,对于一般的电路板应用,这么点输出电流不足以让电路板工作。

不同的STM32 如何使用基准电压芯片?

对于100脚及其以上的芯片,把基准电压芯片连接到VREF芯片即可。

对于100脚以下的芯片,STM32没有把VREF引脚引出来,所以,我们只能把基准电压芯片连接到VDDA引脚。

注意,STM32单片机上面有好多电源引脚,其中有若干VDD引脚,只有一个VDDA引脚,VDDA引脚就是模拟供电引脚。

不过,需要注意,VDDA的电压不是随便定义的。例如,STM32F051系列单片机就规定,VDDA必须要大于或者等于VDD才可以正常工作,所以这时候,最好是给单片机3.0V供电,再给VDDA采用一个3.3V的基准电压芯片供电。

不用电压基准电压芯片可以吗?

如果在你的应用中,VDDA引脚和VDD引脚连在一起,都是由电源芯片供电,这时候,如果你能知道VDDA的实际电压,也可以得到精确的ADC结果。

例如,你可以用万用表测到VDDA电压,例如,是3.286V,你就可以使用3286来计算。

不过,这也只能是在实验的时候,在实际使用中,如果你做了1万个板子,然后需要用万用表量1万个板子的电源电压,然后再给每个板子修改程序,显然是不可能的。

所以,STM32给我们一个解决方案,STM32在内部都有一个参考电压引脚,可以通过配置,把这个脚连接到ADC输入引脚,是内部连接。然后再通过这个值计算实际的VDDA值。

不过,STM32也存在个体差异,所以,它并没有在手册上给出我们这个参考电压是多大。而是用出厂时调教好的校准值和得到的参考电压值一起使用。如下图:

VREFINT_CAL是校准值,这个值,每个单片机都不一样,被存储到了0X1FFFF7BA和0X1FFFF7BB,使用的时候,需要先读出来。

给你个程序看吧,程序当中,有读取VREFINT_CAL和VREFINT_DATA值的语句。你可以看个究竟。

这个程序已经实践验证过了,不会有问题,下面是实验结果:

我把测到的VDDA值,发送到了串口查看。然后我用万用表测了一下实际的VDDA值,由于我的万用表精度有限,只能测到小数点后2位数字,万用表得到的是3.32V和3.31V之间跳动。

串口发送的值,小数点后第三位四舍五入之后,结果也是3.32V和3.31V,结果是一致的!

沙发
天灵灵地灵灵|  楼主 | 2017-12-28 11:24 | 只看该作者
stm32f051计算VDDA测试程序
stm32f051计算VDDA测试程序.zip (2.04 MB)



使用特权

评论回复
板凳
sonicll| | 2017-12-28 16:52 | 只看该作者
楼主你这资料是哪里查到的,是STM32全系列都支持吗?我在F103和F415的手册中都没有找到关于校准值的描述

使用特权

评论回复
地板
sdggg| | 2017-12-28 22:03 | 只看该作者
可悲的是不同温度参考电压不同,偏差大

使用特权

评论回复
5
mmuuss586| | 2017-12-28 22:56 | 只看该作者
感谢楼主分享;

使用特权

评论回复
6
mcuzone| | 2017-12-29 08:59 | 只看该作者
sdggg 发表于 2017-12-28 22:03
可悲的是不同温度参考电压不同,偏差大

你点中了内置Vref的命门。基本上绝大多数的MCU的内置Vref都仅仅是可用而已,对于8位10位的ADC还能用用。一旦真实有效位想做到10位以上,必定得用外置Vref

使用特权

评论回复
7
VREFINT_CAL这个值每个芯片都是固定的吗?那么实际就是电压改变了,然后VREFINT_DATA这个值会改变?就是根据VREFINT_DATA值来算电压了。是这么理解的吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

178

主题

3395

帖子

13

粉丝