[应用相关] STM32使用内部参考电压提高ADC采集准确度

[复制链接]
 楼主| coshi 发表于 2023-7-12 08:57 | 显示全部楼层 |阅读模式
我们在使用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 测量值转换为绝对电压值:

313264adfa48da7af.png
如何使用内部参考电压
使用STM32CubeMX配置ADC是除了选取自己的需要的ADC通道,还要勾选Vrefint channel,这个通道也可以看做是一路ADC采集,用于后边的计算。
3211964adfa5a1f3fe.png
RANK分配,采用DMA模式时,定义数组时直接对应到数组。
9258264adfa62de7b7.png
使能DMA。
6086764adfa70999ea.png
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采集准确度的方法,不过计算电压值,我还是喜欢自己再去实际校准得到一个系数。
————————————————
版权声明:本文为CSDN博主「家养钢铁侠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45325304/article/details/130728503

您需要登录后才可以回帖 登录 | 注册

本版积分规则

96

主题

3310

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部

96

主题

3310

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部