STM32F407 内部参考电压校准实现 HAL库

校准的是什么?

首先,这个校准机制校准的是系统中电源电压VDD,不校准的情况下我们默认它是3.3V

怎么校准?

STM32F407 提供了一个内部固定参考电压VREFINT ,这是一个精确的1.21V 固定电压源。在芯片制造时,厂家将VREFINT 在3.3V的电源电压下的ADC采样值记录在了flash地址0x1FFF7A2A

什么意思呢?厂家出厂的时候给了一个很精确的3.3V电源作为VDD,并记录了在该精准3.3V下,内部那个精确1.21V 固定电压源的ADC采样值,并记在了0x1FFF7A2A这个地方。我们实际使用的时候VDD不一定是精准的3.3V,而内部那个1.21V 电压源是精确的,0x1FFF7A2A这个地方记录的ADC采样值也是精确的,这样就可以用这两个精确的值去计算出精确的VDD值(这里好好体会一下)

怎么计算?

将flash地址0x1FFF7A2A中记录的uint16值记为VREFINT_CAL,将ADC在当前这个需要校准的VDD下采样的内部那个精确1.21V固定电压源的ADC采样值记为VREFINT_ADC,那么当前的VDD如下:

体会一下,假如VREFINT_ADC大于VREFINT_CAL,那不就是当前的参考电压VDD比出厂时的精确的3.3V小了?反之亦然(这里要结合逐次比较型ADC的采样原理理解)

代码实现

核心的也就下面这几行

复制代码
FLASH_READ_boo(0x1FFF7A2A, &VREFINT_CAL, 1);

VREFINT_ADC = ADC1_sampling.average_Vrefint;

校准后的ADC采样值 = ADC采样值 * VREFINT_CAL/VREFINT_ADC

如果对ADC采样过程不清除可以参考我之前写的STM32 f407 多通道ADC采集+DMA传输 基于HAL库和Cubemx配置_stm32f407 adc dma-CSDN博客

对flash读写不清楚的话可以参考另一篇STM32 使用HAL库实现flash读写_stm32 hal flash-CSDN博客

体会

实测下来,以上方法校准VDD用处不大,校准前和校准后基本也就差个0.1%~0.3%,VDD在大部分情况下还是比较准的,不如直接校准零点来的直接。

补充:后续测试发现零点偏移也很小,很多端口连0.1%的偏差都不到,公司的控制器做的还是可以的,给硬件的同事点个赞!

相关推荐
iCxhust6 小时前
8086/8088单板机VSCode集成自动下载功能(完善串口接收显示版)
ide·vscode·单片机·编辑器·微机原理·8088单板机·8086单板机
振南的单片机世界7 小时前
从数码管到点阵屏:动态扫描加595,3个IO驱动256个LED
stm32·单片机·嵌入式硬件
listhi5207 小时前
STC8 16通道模拟采集 + 4路串口 + 8路PWM 程序
stm32·单片机·嵌入式硬件
星夜夏空998 小时前
STM32单片机学习(4)——嵌入式概述
stm32·单片机·学习
Deitymoon8 小时前
STM32——OLED显示字符串
单片机·嵌入式硬件
LCG元9 小时前
STM32实战:基于STM32F407的FFT频谱分析(音频信号处理)
stm32·音视频·信号处理
Graceful_scenery9 小时前
龙芯2k0300 - 走马观碑组按键驱动移植
单片机·嵌入式硬件
d111111111d9 小时前
MQTT+STM32+ESP8266网络程序分层+韦老师
笔记·stm32·单片机·嵌入式硬件·学习·php
长安第一美人9 小时前
RT-Thread 工业屏驱动开发实战:UART 串口屏协议解析 + 数据实时刷新 + 设备驱动框架完整实现
驱动开发·嵌入式硬件·rt-thread·工业控制·uart通信·串口屏驱动
LDR0069 小时前
突破快充壁垒,赋能全场景体验——LDR6600 2C1A快充协议芯片重磅来袭
嵌入式硬件