欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用STM32精确测量电压

程序员文章站 2024-02-23 23:01:04
...

利用STM32精确测量电压

  1. STM32,电压测量

    对于电压和温度的测量是很多嵌入式应用的必备功能。电压的测量一般分为电池电压的测量和其他一些模拟量的测量。电池的测量主要是随时检测电池的电量,以便给出电量的显示或者在电压在到一定的门限时发出报警,提醒用户及时充电。同时在某些应用的时候,在电池低到一定的水平的时候还要及时存储一些关键的数据。至于温度的测量的作用在于有一些和温度有关的参数需要根据温度的高低随时调整。比如说射频发射功率的大小,频率偏移的温度校正等等。本质上电压的测量和温度的测量是一样的, 只不过温度的测量是测量温度传感器所输出的电压。

    对于电压和温度的测量需要用到ADC功能。而影响ADC测量精度的很重要的是一个指标是参考电压的稳定程度。在很多单片机中,参考电压的选择有两种方式,一种是外接一个高精度的参考电压,另外一种是芯片内部产生一个参考电压。那不管是对于哪一种来说,要想保持高的测量精度,则对于参考电压也要有很高的精度。 对于SMT32L0系列单片机来说,为了得到高精度的参考电压,采用了一种较新颖的方法,就是在出厂时进行校正。校正的方式是在IC出厂的时候在某一个固定的电压和温度下进行测量,测得的reference电压或者温度的ADC值会保存在芯片内部的寄存器内。一般来说,STM32会选择在25度,3.0V电压的时候进行测量。
    这样在客户使用片上ADC的时候,就不必去费劲心力的选择或者考虑参考电压的问题,即使参考的电压不是很稳定或者在随时变化也不会影响测试的精度。

    对于STM32L0系列IC来说,在每个芯片出厂的时候都有一个校正的过程。我们可以从一份datasheet里看出他的方法。在芯片的内部有一个参考电压(VREFINT),这个电压连接在ADC的输入端。在芯片出厂的时候,VDDA端会接一个高精度的3.0V电平,环境温度会设置在25摄氏度。在这种情况下,芯片内部会执行ADC的操作,从而得到一个ADC的值,这个值会保存在芯片的内部,而且是只读的属性。 利用STM32精确测量电压

在实际应用当中,VDDA的值也许会很容易变化或者不容易能够很精确的知道。但是通过上述方法进行校正后,通过VREFINT_CAL可以很精确的计算出VDDA的值。

公式如下:

VDDA=3VxVREFINT_CAL/VREFINT_DATA…………………(1)

	这里  VREFINT_CAL是VREFINT校正的值

	而VREFINT_DATA是实际VREFINT通过ADC转换得到的值。

对于ADC来说,每个通道的实际电压的值可以通过下面的公式得到
利用STM32精确测量电压
这里VDDA是一个未知的值,所以你可以将1式带入,这样你就可以得到一个计算每个通道ADC输入电压的公式
利用STM32精确测量电压
这里 VREFINT_CAL是VREFINT校正的值
ADC_DATAx每个通道ADC的测量值
而VREFINT_DATA是实际VREFINT通过ADC转换得到的值。
FULL_SCALE是ADC输出的最大数字值。例如12ADC,FULL_SCALE是4095,或者8位ADC,是255

其实简单点说,STM32是利用了两次ADC的操作,先是精确的测量了参考电压VDDA,继而在第二次测量中得到了精确的输入电压的测量值。首先把VREFINT接入ADC的输入,然后利用公式1得到VDDA的值,然后再将实际要测量的模拟量作为ADC的输入,从而测量出ADC_DATA的值,继而计算出待测量的精确的电压。

通过这种方式,使用者不必再去考虑参考电压的精确度和稳定度,使用STM32的电源电压作为Vref+就可以了,如图所示
利用STM32精确测量电压