stm32 精确电压测量法(内部参考电压)
2019-11-06 来源:eefocus
芯片型号:stm32l051c8(其它型号请参考datasheet,仅供参考)
使用ADC采集电压时若使用外部参考电压,如果外部电压变化,且低于正常LDO工作电压时,输出的电压将发生改变,导致基准电压改变而导致ADC电压出现偏差,因此在该芯片上查看datasheet后得知,厂家已经为我们考虑到这种情况,并在出厂时将类似于基准电压的值写在flash中。该值的环境:25°C, VDD = 3V时的情况,可以直接地址访问读取,我读取了两个芯片的值,大概在1670值左右。通过该值我们就有一个标准。
接下来看参考手册中对该款芯片的介绍,
我们可以看到,通过读取ADC IN17可以获得内部参考电压值,假设我们现在要读取电池电量,需要读取两个通道的值:
1、ADC IN17内部参考电压原始数据,也就是下图公式中的 VREFINT_DATA
2、读取电池电量连接通道原始数据,也就是下图公式中的ADC_DATAX值,我在板子上接的是ADC IN4
下图的计算公式就是利用内部参考的校准电压值和实际读取的内部参考电压值作一个线性关系,将这个斜率对应到我们需要测量的通道值。
说明:VREFINT_CAL:内部参考电压校准值,直接地址读取。比如该款芯片地址:0X1FF80078,那么我们可以这么做:
VREFINT_CAL = *(__IO uint16_t *)(0X1FF80078);
FULL_SCALE:根据我们设置的ADC分辨率而定,12位ADC分辨率值:2^12 - 1 = 4096 - 1.
实测数据:
VREFINT_CAL:1669 VREFINT_DATA: 1716
ADC_DATAX: 2046 FULL_SCALE: 4095
根据公式计算到电压值: VOL = 3 * 1669 * 2046 / (1716 * 4095) = 1.4578
电池电量: 1.4578 * 2 = 2.915 V
用万用表测量的电压值:1.44~ 1.45V波动, 校验成功。
*******************************************************************************
2019-08-10补充
最近在项目中使用到ADC电压采集,由于使用的模拟量输出,所以对精度要求较高,使用上文的方式精度还不错,不过怎么调节都会与实际测量电压有偏差,为了降低这个误差,在软件上做处理。由于工程使用的是CubeMx生成的代码,经过调试,在采集电压前进行ADC校准会得到更好的精度。所以在采集前可加入这么一句代码:
HAL_ADCEx_Calibration_Start(&hadc); //校准ADC