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%的偏差都不到,公司的控制器做的还是可以的,给硬件的同事点个赞!

相关推荐
振浩微433射频芯片10 分钟前
从门锁到考勤,VRC522B如何在近场读卡场景中“稳坐C位”?
网络·人工智能·单片机·物联网
Groundwork Explorer12 小时前
W5500 网卡编程初始化与使用指南
python·单片机
单片机仿真设计13 小时前
【proteus仿真】基于 STM32 的智能垃圾桶设计(仿真图+程序)
c语言·stm32·stm32单片机·proteus·毕设·仿真
智闲电子设计14 小时前
STM32 SD 卡 + FatFS 实战:掉电丢数据?f_sync 和簇对齐写救你
stm32·单片机·嵌入式硬件
ヾChen15 小时前
ESP32 OTA 踩坑实录
stm32·单片机·嵌入式硬件·物联网·学习
DevHub16 小时前
probe-rs 教程:一行命令替代 OpenOCD 烧写调试 Cortex-M
arm开发·嵌入式硬件·mcu·rust
小僧景贤16 小时前
嵌入式ADC高阶深度解析:基于STM32底层原理、误差溯源、硬件调校与工业级落地
单片机·嵌入式硬件·stm32 adc·工业级高精度采集·adc 误差校准·量产固件开发
黑猫学长呀16 小时前
【驱动开发常见问题】编译出现rm: cannot remove `asm/arch‘: Is a directory
驱动开发·单片机·嵌入式硬件·bug·编译报错·kernrl
雨田言炎17 小时前
STM32专题之内部FLASH详解
笔记·stm32·单片机
Be for thing19 小时前
【嵌入式成长10】STC89C51蜂鸣器|有源/无源蜂鸣器区分、三极管驱动、定时器播放音乐实战
单片机·嵌入式硬件·学习