STM32使用内部参考电压提高ADC采集准确度

我们在使用ADC采集外部电压时,一般默认参考电压为MCU的供电电压,例如单片机供电电压为3.3V时,我们计算采集电压的公式为:

假设12位ADC
采集电压=(AD值/4096*3.3

但是如果因为某些原因导致的供电不稳定,而我们任然按照3.3V计算,ADC采集计算出来的电压就会出现误差。
在STM32手册中关于ADC的介绍中提到使用内部参考电压计算实际的VDDA电压。
使用内部参考电压计算实际的 VDDA 电压:

施加给微控制器的 VDDA 电源电压可能会有变化,或无法获得准确值。在制造过程中由 ADC
在 VDDA = 3.3 V 的条件下获得的内置内部参考电压 (VREFINT) 及其校准数据可用于评估实际
的 VDDA 电压。
以下公式可求得为器件供电的实际 VDDA 电压:
VDDA = 3 V x VREFINT_CAL / VREFINT_DATA
其中:
 VREFINT_CAL 是 VREFINT 校准值
 VREFINT_DATA 是由 ADC 转换得到的实际 VREFINT 输出值

将电源相关的 ADC 测量值转换为绝对电压值:
STM32使用内部参考电压提高ADC采集准确度_第1张图片

如何使用内部参考电压

使用STM32CubeMX配置ADC是除了选取自己的需要的ADC通道,还要勾选Vrefint channel,这个通道也可以看做是一路ADC采集,用于后边的计算。
STM32使用内部参考电压提高ADC采集准确度_第2张图片
RANK分配,采用DMA模式时,定义数组时直接对应到数组。
STM32使用内部参考电压提高ADC采集准确度_第3张图片
使能DMA。
STM32使用内部参考电压提高ADC采集准确度_第4张图片
STM32手册中提到:VREFINT 的精确电压由 ST 在生产测试期间对每部件单独测量,储存于系统存储区。这个值是固定的,计算前我们需要将它读出来。

u16 ADC_Buffer[3];//定义u16数组 0.通道4 1.通道7 2.参考电压Vref
u16 VREFT_CAL = 0;//内部基准
VREFT_CAL = *(uint16_t*)(VREFINT_CAL_ADDR);//读取内部基准
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC_Buffer,3);//开启  ADC---DMA
V= (3*VREFT_CAL*ADC_Buffer[0])/(ADC_Buffer[2]*4096); //校准后的通道4采集电压

以上就是STM32使用内部参考电压提高ADC采集准确度的方法,不过计算电压值,我还是喜欢自己再去实际校准得到一个系数。

你可能感兴趣的:(MCU,stm32,单片机,嵌入式硬件)