本篇主要包含以下内容(电池供电产品尤其实用):
1、如何进行 ADC 校准,ADC 校准基本原理
2、如何直接通过内部参考电压得到芯片的工作电压
3、常见应用场合
在一些应用场合,往往需要得到芯片的工作电压,确保芯片工作正常,比如低压时进行必要保护、 ADC 采集时校准等。
一般情况下,我们使用分压电阻方式获得芯片工作时的电压,比如 STM32 可工作在 2.0~3.6 V(你没看错,2.0 V 也能工作,鱼鹰有段时间不小心用了 5 V 电压,芯片竟然也能工作,没烧坏,也是奇迹,但不建议这么干)。但是需要增加额外电路。
另外,如果你能得到芯片的工作电压(或 ADC 的基准电压),在 ADC 校准方面也是有奇效。因为如果你的参考电压变化了,那么你通过 ADC 计算得到值必然也是有问题的。
测量电压值 = (ADC 值 * 参考电压值 3.3)/ ADC 最大值 4096
即上式的 参考电压 3.3v 变化了,那么你计算的测量电压就和实际的不符。因为在这个公式里面,你假设参考电压稳定不变为 3.3v ,但实际上如果因为某种原因,导致电压上升或下降了,那么计算的测量电压值就是有问题的。
所以,为了精确测量电压,就有了校准。
既然参考电压也在变化,那么我们就直接把参考电压也一起采集了,作为公式的参数输入,如此一来,就能保证测量电压的稳定性了。
但是参考电压又应该怎么测量呢?还是使用分压方式吗?我们本身就是为了让分压方式测量的电压更精确才使用校准的呀?这不是陷入了鸡生蛋、蛋生鸡的死循环?
如何跳出这一循环呢?关键在于是否存在一个电压,可不随外部电压变化而变化,起码不应该在芯片(2.0 ~ 3.6 V)正常工作时而变化,超出电压范围外就和我没关系了。
就此我们可以想到一种常用器件,LDO (低压差线性稳压器),比如 5 V 转 3.3 V,只要输入电压在芯片规定范围内,它总是能稳定输出 3.3 V。
在 STM32 中,内部都内置了一个比较稳定的内部参考电压,即 VREFINT,一般电压 1.2 V,但由于芯片差异,这也是不确定的,所以为了更加确定这个电压值,芯片出厂时会进行校准(又来一次校准),即把实际采集到的电压 ADC 值保存到一个地址里面。
怎么理解这次校准呢?这个参考电压内部连接到 ADC 外设中的一个通道,而 ADC 外设使用高精度稳压源稳定供电 3.0 V,而此时该参考电压也会输出一个电压,大概在 1.2V, 然后通过 ADC 采集这个电压的 ADC 值,并把这一次电压值保存在一个地址里面。
这里举一个具体例子(参考文章里面的):
在这个芯片里面的参考电压输出就是 1.216 V,可以说相当精确了,但是另一个同款芯片就不一定就是这个电压了(但也基本在 1.2 V 左右,不会差太多),这就是所谓的差异,也是为什么要校准的原因。
那么得到这样一个稳定的参考电压有什么用,它的特点又是什么呢?
这个参考电压你可以理解为,只要芯片工作在 2.0 ~ 3.6 V,它总是能输出 1.216 V(当然是说上面那颗芯片,其它芯片就不一定是这个电压了)。
这样一来,我们让 VDDA(ADC 外设的基准电压)= VDD(芯片工作电压)。当工作电压下降时,VDDA 电压也在下降,也就是说 4095 在下降前代表 3.3 V,那下降后代表的电压值肯定更小了(还是代表 VDDA 的值,即总是代表的基准电压)。
(图片来源:茶话 MCU)
但是不管 VDDA(VDD) 怎么变化,Vrefint 的电压值总是稳定在 1.216 V(但是这个 ADC 值是处于变化中的)。而这也是我们反推外部电压的基础。
于是我们可以得到下面公式(前提芯片能正常工作,即 2.0 ~ 3.6 V):
VDDA : 4095 = VREFINT : Adc_vrefint
因为 VDDA 等于 VDD,所以也可以认为是芯片的工作电压。在这个公式中,Adc_vrefint 的 ADC 值我们可以通过 ADC 的特殊通道(VREFINT 通道)采集回来,而 VREFINT 我们在前面通过某个地址的 ADC 值已经计算出来了,就是 1.216 V,那么只有 VDDA 一个值不确定,计算它就是轻而易举的事情了。
于是,通过采集 VREFINT 通道的 ADC 值,即可得到我们需要的 VDDA 值,也就是我们的芯片工作电压!!!
这就是不用外部电路检测芯片电压的内幕(原理)!
本来应该一切顺利,这篇笔记也有一个完美的结局,但是很不幸的是,鱼鹰找遍了手册,网上也是到处找,始终没有找到 STM32F1xx 系列芯片校准值的保存地址,而据网上的说法是,这款芯片并没有校准值,这就很让人尴尬了(其它系列是否存在该校准值,可以看对应的数据手册,如果有道友知道 STM32F1xx的地址,可留言告知)。
但是如果你对电压精度要求不是很高的话,你可以直接认为参考电压就是 1.200 V,用它来大概计算芯片的工作电压也是问题不大的。而如果你要更高的精度,那么你也可以像前面说的那样,自己找出每一颗芯片的实际参考电压,人工校准。当然工作量就大了那么一些了(专门写一个校准程序,把校准值写入内部 FLASH 中)。
那么这个功能一般用于什么场合呢?
实时检测芯片的工作电压,我们就知道芯片是否正常工作,从而排除芯片因为电源不稳导致的一些问题。同时,我们可以把这个电压值用于前面所说的 ADC 校准中,这样不管芯片工作电压怎么变化(前提是芯片工作电压和 ADC 基准电压是一同一个),你测量的电压值一定是准确的(即使电压源纹波比较大)。
这个功能对于电池供电的产品尤其实用,因为电池电压在使用过程中,肯定会发生变化,这也意味着可能你的 ADC 基准电压发生了变化(当然你也可以使用额外的稳压源,这样就会增加成本)。
当工作电压低到一定程度时,我们希望能做一些保护工作,或者保存一些参数,我们该如何做呢?三种方法:
1、通过上述方法,定时采集 参考电压 的 ADC 值,从而得到工作电压,当电压低于一定水平时,再采取一些措施。
2、使用 ADC 模拟看门狗功能,将这个通道的值加入到看门狗中,如此一来,只要电压下降到你想要的值,就可以触发看门狗,比方法一更及时,这也是参考文章介绍的一个应用,强烈建议各位道友看看这位大佬写的。
3、芯片内部有低电压保护功能,当电压低到一定水平时,可触发中断,但是只有几个固定电平可选,不像上述方法可设置任意电平。
而在已出货的产品中,可能当时我们并没有考虑那么多,并没有预留检测工作电压的电路,使用这个方法,就可以只更新软件即可获取工作电压,相当实用。
这个方法也曾用高精度稳压源测试过,发现计算出来的电压值精度相当高,而当改变电压大小时,计算出来的电压也在实时变化,可谓实用的一匹,再也不用怕硬件工程师说你采集的 ADC 值(软件)有问题了。
简单总结就是,采集 ADC 外设中的 VREFINT 通道值,通过上面公式简单计算,即可得到芯片当前的 ADC 参考电压,也可认为是芯片工作电压。代码和普通的 ADC 采集没多大区别,只是采集的通道由外部通道变为了内部通道,所以鱼鹰就不再提供具体参考例子了(可惜忘记截图了,否则更有说服力)。
1.RISC-V嵌入式开发课程节选版上线!文末还有图书优惠哦!赶快抢!
2.RISC-V能成为八位MCU的选择吗?
3.对嵌入式工程师硬件转软件的几条建议!
4.浅谈智能嵌入式系统的优化设计
5.单片机AD采样常用的十大滤波算法~
6.物联网时代,嵌入式软件测试工具越来越重要~
免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。