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

相关推荐
Despacito0o2 小时前
ESP32-s3摄像头驱动开发实战:从零搭建实时图像显示系统
人工智能·驱动开发·嵌入式硬件·音视频·嵌入式实时数据库
门思科技2 小时前
设计可靠 LoRaWAN 设备时需要考虑的关键能力
运维·服务器·网络·嵌入式硬件·物联网
慕尘2 小时前
Clion配置51单片机开发环境
单片机
良许Linux4 小时前
32岁入行STM32迟吗?
stm32·单片机·嵌入式硬件
m0_466607705 小时前
【STM32CubeMX】ST官网MCU固件库下载及安装
stm32·单片机·嵌入式硬件
Wallace Zhang8 小时前
STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader
stm32·嵌入式硬件·安全
GodKK老神灭9 小时前
STM32 CCR寄存器
stm32·单片机·嵌入式硬件
杰克逊的日记10 天前
MCU编程
单片机·嵌入式硬件
Python小老六10 天前
单片机测ntc热敏电阻的几种方法(软件)
数据库·单片机·嵌入式硬件
懒惰的bit10 天前
STM32F103C8T6 学习笔记摘要(四)
笔记·stm32·学习