使用stm32的ADC得到准确的电压

一、引脚多一点的stm32单片机存在VREF-和VREF+引脚

使用stm32的ADC得到准确的电压_第1张图片

由上面的供电图知道,如果存在VREF-和VREF+引脚,那么ADC是由这两个引脚供电的,ADC的采集电压范围为:VREF-

 

二、引脚少的单片机(48脚)没有引出VREF-和VREF+引脚

VREF-和VREF+引脚在单片机内部与VDDA和VSSA连在一起,因为不像上面单独给VREF+一个稳压源,因此可能存在供电电压不稳的问题。于是需要一些方法来对转换结果进行矫正。

使用stm32的ADC得到准确的电压_第2张图片

ADC的通道17就是单片机内部的一个稳压源。可以读取它的数据来进行矫正。

使用stm32的ADC得到准确的电压_第3张图片

该稳压源电压为1.16V到1.24V,精度不是很准确,要求不高,可以凑合着用。

具体使用方法是:增加一个通道17的采集(如本来要采集2个通道,现在采集3个通道),把通道17的测量数值记为ADrefine,目标通道测量数值为ADchx,则目标电压为:

Vchx = Vrefine* (ADchx/ADrefine),其中Vrefine为参照电压=1.20V。

程序上:

在STM32提供的库函数中,如果要开启内部参考电压功能,使用的库函数和开启温度内部温度传感器的函数是一样的,只是在后面采集ADCx_Channel_x通道的时候不同而已。开启函数为: ADC_TempSensorVrefintCmd(ENABLE);

注:必须设置TSVREFE位激活内部通道:ADCx_IN16(温度传感器)和ADCx_IN17(VREFINT)的转换。

关于操作源码,可以参考正点原子不完全手册 第二十一章 内部温度传感器实验,对于内部电压值的测量和温度传感器的方法是一样的,只是使能的ADC通道不一样,其他都是一样的,所以,可以直接参考。

 

三、引脚少的单片机(48脚)没有引出VREF-和VREF+引脚(方法二)

在某些stm32单片机中还存在VREFINT_CAL(直接在数据手册中搜索VREFINT_CAL)

这个值是ST在出厂测试时,25度,VDDA电压3V,读通道17的数值。我们知道引脚少的单片机VREF+与VDDA是连在一起的,因此当参考电压为3V,25度,ADC测量1.2V的结果就是VREFINT_CAL。这样我们可以测量通道17的数值来计算VDDA的电压:

使用stm32的ADC得到准确的电压_第4张图片

        比如:参考电压为3V,25度,ADC测量1.2V的结果VREFINT_CAL=100,现在我读通道17的数值是200,因为测量对象一直是稳压源1.2V,可是测量数值翻倍了,那肯定是参考电压折半了嘛。

        这样相当于我能测量参考电压大小,于是就能计算目标电压大小:(把上面的式子代入)

使用stm32的ADC得到准确的电压_第5张图片

 

四、采样时间会影响采样精度

因为ADC的采样需要一定的电流大小,因此外部阻抗的大小会影响采样的时间。阻抗越大,电流越小,需要采样时间越长。

使用stm32的ADC得到准确的电压_第6张图片

你可能感兴趣的:(MCU)