STM32-ADC-过采样下使用内部参考电压进行校准

·前言:在使用ADC时,某些芯片或在硬件设计时就将VREF+(正参考电压)与接VDD3.3V相接,且在后续计算检测通道中的电压时将参考电压定为常量3.3V。

计算公式如ADC图1所示:

ADC图1

按照上图的公式的确可以计算出相应测量通道的相应电压值。但当供电电压会因电路中其它元器件工作时产生的大电流或其它情况而导致电压出现波动不等于3.3V时,用3.3V的定值做参考电压计算得出的检测通道的电压值显然就会出现与实际电压偏差较大的问题。

·问题解决方案参考:

·方法一:

通过使用内部参考电压计算实际的VREF+电压解决VREF+为定值(3.3V)的问题。在STM32官方参考手册中即有介绍该种方法如下ADC图2所示:

ADC图2

上述式子推导过程:

VREFINT = (VREFINT_CAL*VREF+_CAL)/4095;

VREFINT = (VREFINT_DATA*VREF+)/4095;

由STM32官方数据手册已知VREFINT_CAL = *(uint16_t *)0x1FFF75AA;

VREF+_CAL=3.0V;VREFINT恒等于某电压值。

那么可得:(VREFINT_CAL*VREF+_CAL)/4095 =  (VREFINT_DATA*VREF+)/4095;

最后即得:VREF+ = VREF+_CAL*VREFINT_CAL/VREFINT_DATA;(式1)

VREFINT_CAL是芯片出厂时厂家在下图ADC图3的表格中规定的条件测量下出来的内部参考电压通道(ADC图4标点处)的ADC原始数据并存在flash固定只读地址中。该值不是所有系列芯片都有(注意不同芯片该值保存的地址不一致):

ADC图3

那么我们将实时的得到正参考电压VREF+代入ADC图1的转换公式中即得:

VR = (ADC_value * VREF) / 4095.0f;(式2)

其中:VR是ADC某通道检测的实际电压,ADC_value是ADC在某通道的转换结果的16位ADC数据,VREF是ADC的参考电压VREF+,4095是ADC所设置的分辨率(分辨率为12时,2的12次方减1即得4095)。

由于式1中的VREF+_CAL和VREFINT_CAL均是在ADC分辨率为12位的情况下测得的。所以其内部参考电压通道VREFINT经过ADC转换后的数据VREFINT_DATA也必须是12位分辨率下测的数据,如果是其它的分辨率下测得的数据再代入式1将会得到错误的正参考电压(VREF+)。

ADC图4

·方法二:

方法二其实是方法一基础上实现的。也是需要使用ADC检测内部参考电压通道(VREFINT)来以此作为校准值。公式如式3所示。

VCHX = VREFINT * CHX_DATA / REFINT_DATA;(式3)

推导过程如下:

前提条件如下:内部参考电压通道(VREFINT)与待测通道的分辨率(ADC_DPI)需一致。

那么有:

VCHX = VREF+ * CHX_DATA / ADC_DPI;

VREFINT = VREF+ * REFINT_DATA / ADC_DPI;

即得:

VCHX / VREF+ * CHX_DATA = VREFINT / VREF+ * REFINT_DATA;最后即可得到式3

式3的好处是可以忽视VREF+(正向参考电压)以及ADC的分辨率的改变带来的影响。

        ADC的通道转换结果由VREF+和ADC当前的分辨率以及通道待测电压所决定。STM32的通过使用内部参考电压计算实际的VREF+电压的方法实现就是,内部参考电压中的电压是一个固定值,虽然会由很小的变化,但是这个是可以忽略的,那么当ADC的分辨率以及通道待测电压确定时,ADC的通道转换结果仅由VREF+所决定,且我们可以知道ADC的通道转换结果,那么我们即可反推VREF+。

        理论上,在同一时刻ADC能测得内部参考电压通道和某一待测通道的结果,那么其ADC分辨率相等情况下,VREF+也相等,内部参考电压恒定不变,那么在式3中,CHX_DATA 与REFINT_DATA,因为分辨率相等,那么在方法一中不同分辨率造成的误差将会消除。

        如有错误望指出!

作者:XLDDing

物联沃分享整理
物联沃-IOTWORD物联网 » STM32-ADC-过采样下使用内部参考电压进行校准

发表回复