最近有个同学在做一个高精度模拟检测电源的电路,公司为省成本不能采购高精度外接模数转换芯片,而自身电源电压波动也较大,突然想起大学时期在学PIC单片的时候好像也遇到过这样的问题,在51上找到一个比较好的帖子
在使用STMCU开发过程中,有人问如果电源电压是变动的,询问有无办法用比较简洁的办法对电源电压进行监测,或者说电源电压波动情况下能否检测出其它待测的AD输入电压。
这里跟大家分享交流一个方法。就是在没有其它外来参考电压,用芯片电源电压VDD作为ADC的参考电压,同时该电源电压又在一定范围内变动的情况下【这个范围就是在保证芯片正常工作的范围】,利用MCU芯片内部自带基准电压对电源电压进行监测。
在我印象中【STMCU系列和型号太多了,记不住】,几乎每颗STMCU芯片内部都有个相对稳定且不受电源电压一定范围内波动影响的基准电压。这里以STM8L15x芯片为例来介绍。
STM8L151系列芯片内部有个参考输出电压,ST的技术手册里命名为VREFINT。
该内部参考电压的值即使芯片电源电压在工作范围内波动时,它基本维持不变即1.224V,而且该电压信号可以通过指令控制直接连接到ADC的某个AD通道而求得该电压对应的AD值。
这里提前厘清下:该内部参考电压VREFINT并非ADC的参考电压,ADC的参考电压依然是VDD。即使VDD有所波动,这个VREFINT电压恒定不变,对于ADC电路而言,它只是个测试点。这里经常有人犯迷糊,把VREFINT内部基准参考电压跟ADC模块的参考电压混为一谈。
在某一固定的ADC参考电压情况下,所有被测电压点的AD转换值与该点电压值保持同一比例关系,换句话说,对于ADC参考电压固定情况下,各点的电压与ADC值与成线性关系。
下面图形是8L15X芯片分别在3个不同参考电压下的AD转换曲线示意图,这里参考电压接不同的VDD。下面三根斜线分别是VDD为2.8V、3.2V、3.6V时的AD转换曲线示意图。那根黄色垂直虚线是表示内部VREFINT电压(1.22V)所在的位置。
不难理解,对于不同的参考电压,同一待测电压【VREFINT】1.22V所测得的AD转换值是不一样的,从上面图也可以直观的看出。这里AD的参考电压就是VDD,显然VDD越大,1.22VVREFINT电压对应的AD转换值越小。
对于某一个参考电压来说,如果能测得1.22V所对应的AD转换值,假设记为Val_AD1.2那参考电压VDD对应的AD转换值自然是此时该AD的满量程值,记为Val_Full,【如果精度是10位,就是1024,如果是12位,那就是4096】。
不管VDD怎么变动,某时刻的VDD对应的满量程值Val_Full跟内部基准电压【VREFINT】1.22V的AD转换值Val_AD1.2的线性比例关系总是存在的。即有:
VDD:Val_Full=1.22:Val_AD1.2【Val_AD1.2为实时测得值】
那么VDD=(1.22/Val_AD1.2)*Val_Full
这样你就可以达到监测芯片供电VDD的电压之目的了。当然你也可以利用上述原理和类似条件做别的应用,比如说电源电压一定范围内波动情况下还是可以检测出其它待测点的电压。
具体方法是在测量某个通道的电压值之前,先读出参照电压的ADC测量数值,记为ADrefint;再读出要测量通道的ADC转换数值,记为ADchx;则要测量的电压为:
Vchx=Vrefint*(ADchx/ADrefint)
其中Vrefint为参照电压=1.224V。