基于 STM32U5 片内温度传感器正确测算温度
目录预览
1、引言
2、问题
3、小结
01
引言
STM32 在内部都集成了一个温度传感器,STM32U5 也不例外。这个位于晶圆上的温度传感器虽然不太适合用来测量外部环境的温度,但是用于监控晶圆上的温度还是挺好的,以防止芯片过温运行。
02
问题
2.1.问题详情
某客户在使用 STM32U575ZIT6Q 时,使用 ADC4 对内部温度传感器 VSENSE进行采样计算,但是总觉得温度值不对。那么,应该如何对内部温度传感器信号的 ADC 采样进行计算以得到正确温度值呢?
2.2. 问题分析
首先,我们应该看一下参考手册如何描述内部温度传感器的。参考手册说明了,未经校准的内部温度传感器更适用于对温度变化而非绝对温度进行测量的应用。为了提高温度传感器测量的准确性,ST 在生产过程中将校准值存储在每个器件的系统存储器中,用户可以在应用中去读取这些数据。
这个校准值是写在数据手册的,如图 1 所示。
图1. 内部温度传感器
这张表格告诉我们,校准值 TS_CAL1 的数值位于存储器地址 0x0BFA0710 和0x0BFA0711,也就是它是一个 16-bit 的数据;同理,校准值 TS_CAL2 的数值位于存储器地址 0x0BFA0742 和 0x0BFA0743。
再回过头来看一下参考手册是如何描述怎么读取内部温度传感器的温度的,如图 2 所示。
图2. 读取温度传感器
这里描述的是如何读取内部温度传感器的温度,前面主要介绍 ADC 的配置和对温度传感器的采样,最后根据得到的数据使用公式进行计算,得到温度值。前面的 ADC 的配置和采样就不说了,我们主要来看一下公式的使用。
其中,
Temperature (in ℃) 就是内部传感器的当前温度结果;
TS_DATA 为内部传感器当前温度对应的采样值;
TS_CAL2_TEMP 为校准值 2 的温度值,TS_CAL2 为对应的采样值,对于 STM32U5来说,TS_CAL2_TEMP 为 130℃,对应的采样值存储在 0x0BFA0742 和 0x0BFA0743;
TS_CAL1_TEMP 为校准值 1 的温度值,TS_CAL1 为对应的采样值,对于 STM32U5来说,TS_CAL1_TEMP 为 30℃,对应的采样值存储在 0x0BFA0710 和 0x0BFA0711;
对于 STM32U5 来说,公式可简化为:
那么,是不是直接读取了 TS_CAL2 和 TS_CAL1,放到公式里,然后通过 ADC 得到TS_DATA,就可以直接算温度了呢?接着往下看。
2.3. 问题解决
在室温下使用 NUCLEO-U575ZI-Q 做个实验:
读取 0x0BFA0742 和 0x0BFA0743 得到 TS_CAL2 为 0x155D,也就是 0d5469;读取 0x0BFA0710 和 0x0BFA0711 得到 TS_CAL1 的值为 0x102F,也就是 0d4143。
此时,由 ADC1 对内部温度传感器进行采样转换,得到 TS_DATA 为 0xEAA,也就是0d3754。
那么,如果直接放进去算:
室温下,这个 0.66℃显然不对。
2.3.1. 使用 ADC1 测量内部温度传感器的温度值
再来看数据手册里对校准值的描述,如图 3 所示。
图3. 温度传感器校准值重要参数
这个表格有一个非常重要的参数,就是 ADC1 的参考电压,它是 3.0V,而 NUCLEOU575ZI-Q 板子的 ADC 参考电压为 3.3V。所以,这两个 TS_CAL1 和 TS_CAL2 对于NUCLEO-U575ZI-Q 中的 STM32U575ZIT6Q 的内部温度传感器肯定是不能直接用的,需要先换算为 3.3V 参考电压的值才行。
所以,新的值计算如下:
TS_CAL2 = 5469 × 3 / 3.3 = 4972
TS_CAL1 = 4143 × 3 / 3.3 = 3766
再回到刚才的实验中,计算的公式如下:
这次算出来的结果为 29℃就对了。
2.3.2. 使用 ADC4 测量内部温度传感器的温度值
那对于 ADC4 是否也是一样的呢?
首先,要知道在 STM32U5 中,ADC1 为 14-bit SAR ADC,而 ADC4 为 12-bit SARADC。同样的这块板子,同样的室温下,由 ADC4 对内部温度传感器进行采样转换得到的值是 0x3AA,也就是 0d938。
要使用 0d938 计算温度值,TS_CAL1 和 TS_CAL2 也要相应转为 12 位的数据才行。将它们由 14 位数据转为 12 位的数据,相当于就是右移 2 位,也相当于除以 4。
由于参考电压仍然是 3.3V,所以针对 ADC4 的 TS_CAL2 和 TS_CAL1 应该计算如下:
TS_CAL2 :由读取到的 0x155D 右移 2 位,得到 0x557,也就是 0d1367,再换算成3.3V 的 。
TS_CAL2 = 1367 × 3 / 3.3 = 1243也可以直接使用上面 ADC1 例子的值来计算。
TS_CAL2 = 4972 / 4 = 1243
TS_CAL1 :由读取到的 0x102F 右移 2 位,得到 0x40B,也就是 0d1035,再换算成3.3V 的 。
TS_CAL2 = 1035 × 3 / 3.3 = 941
也可以直接使用上面 ADC1 例子的值来计算。
TS_CAL2 = 3766 / 4 = 941
计算的公式如下:
算出来的结果也是 29℃。
03
小结
当我们使用芯片的内部温度传感器计算内部温度时,需注意校准值是使用哪个 ADC、在什么参考电压下得到的。当实际应用与内部温度传感器校准时所使用 ADC 及条件不一样时,应该对存储单元里的校准值先做计算转化,然后才可以使用参考手册所提供的公式进行计算,否则将会得到错误值。
相关文章:

基于 STM32U5 片内温度传感器正确测算温度
目录预览 1、引言 2、问题 3、小结 01 引言 STM32 在内部都集成了一个温度传感器,STM32U5 也不例外。这个位于晶圆上的温度传感器虽然不太适合用来测量外部环境的温度,但是用于监控晶圆上的温度还是挺好的,以防止芯片过温运行。 02 问题…...

【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据】操作批量新增、分页查询(三)
orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据 环境: idea jdk17 spring boot 3.0.7 mysql 8.0测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本mybatis☑️☑️3.5.4sqltoy☑️☑️5.2.98lazy✖️☑️1.2.4…...
Leetcode 3068. Find the Maximum Sum of Node Values
Leetcode 3068. Find the Maximum Sum of Node Values 1. 解题思路2. 代码实现 题目链接:3068. Find the Maximum Sum of Node Values 1. 解题思路 这一题虽然标记为一道hard的题目,但其实就是一个脑筋急转弯的题目。 我们只需要想明白一点即可&…...
用 Dockerfile为镜像添加SSH服务
1、基础镜像ubuntu:18.04 2、替换为国内的安装源 3、安装openssh-server 4、允许root用户远程登陆 5、暴露端口22 6、服务开机自启动 1.创建目录 [rootopenEuler-node1 db]# mkdir sshd_ubuntu 2.创建 Dockerfile、 run.sh 、authorized_keys、vim aliyun.list 文件 [rootop…...
Maven能解决什么问题?为什么要用?
如果没有maven,我们在开发一个应用的时候,需要自己先确定要引入哪些第三方的jar包,并且要去找到这些jar包,把他们导入到项目中,而且最痛苦的时候各个jar包之间的兼容性和冲突的问题。 jar包弄好了之后,我们…...
【Golang星辰图】探索网络和HTTP的奇妙世界:使用Go语言打造高性能应用
提升Web开发效率:学会使用Go语言的网络和HTTP库 前言 随着互联网的快速发展,网络和HTTP成为了现代应用开发中必不可少的部分。Go语言作为一门快速、可靠和高效的编程语言,提供了丰富的网络编程和HTTP处理库,使得构建高性能的网络…...
[C语言]——操作符
目录 一.算术操作符:、-、*、/、% 1. 和 - 2.* 3./ 4.% 二.赋值操作符:和复合赋值 1.连续赋值 2.复合赋值符 三.单目操作符:、--、、- 1.和-- 1.1前置 1.2后置 1.3前置-- 2. 和 - 四.强制类型转换 一.算术操作符:…...

iview碰到的一些问题总结
iview tabs嵌套使用问题 tabs嵌套使用的时候不是直接套用行了,直接套用会出现内层tab都集成到一级tab去,需要设置该属性指向对应 Tabs 的 name 字段(需要版本大于3.3.1) <Tabs name"tab1" ><TabPane label"标签1" tab&qu…...

【Python笔记-FastAPI】后台任务+WebSocket监控进度
目录 一、代码示例 二、执行说明 (一) 调用任务执行接口 (二) 监控任务进度 实现功能: 注册后台任务(如:邮件发送、文件处理等异步场景,不影响接口返回)监控后台任务执行进度(进度条功能)支…...

力扣hot100:15.三数之和(双指针/哈希表)
分析: 三数和问题,这里和两数之和不一样,返回的是值,因此可以对其进行排序,使用双指针。 一、一层循环双指针 class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {sort…...

VMware虚拟机使用Windows共享的文件夹
虚拟机版本为 VMware Workstation 16 Pro:16.2.4;主机位Windows11;记录于2024-03-05 在个人使用时,经常会有一些数据集等大文件重复在不同实验中使用,但是不同系统中来回使用会导致占用虚拟机空间,该博文通过将主机…...

利用Python自动化日常任务
在快节奏的现代生活中,时间就是一切。幸运的是,Python提供了一系列强大的库和工具,可以帮助我们自动化那些乏味且重复的任务,从而释放我们的时间,让我们可以专注于更有创造性和有意义的工作。下面,我们将探…...
Android的多线程和异步处理
在Android开发中,多线程和异步处理是处理耗时操作、提高应用响应性和性能的关键技术。以下是一些关于Android多线程和异步处理的基本概念和实践: 1. **主线程(UI线程)**: - Android应用的主线程负责处理UI操作和事…...

MySQL-----视图
一 视图 ▶ 介绍 视图view是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用视图名称即可获取结果集,并可以将其当作表来使用。 数据库中存放了视图的定义&…...

LeetCode-02
225. 用队列实现栈 用两个队列实现栈的功能,思路如下: 往空队列中放新元素把非空队列中的元素依次放入刚才添加了新元素的队列,直到非空队列变为空队列 class MyStack(object):def __init__(self):self.queue1 []self.queue2 []def push(…...

瑞_Redis_Redis的Java客户端
文章目录 1 Redis的Java客户端1.1 Jedis快速入门1.1.1 入门案例1.1.1.1 项目构建1.1.1.2 引入依赖1.1.1.3 建立连接1.1.1.4 释放资源1.1.1.5 测试1.1.1.6 完整测试类代码 1.1.2 Jedis连接池1.1.2.1 连接池工具类1.1.2.2 改造原始代码 1.2 SpringDataRedis1.2.1 RedisTemplate1.…...

Cmake的使用
第一步:安装Cmake 双击点开即可,无脑下一步。 第二步:编写一个简单的Cmake项目 CMakeLists.txt文件 # 设置最低的 CMake 版本要求 cmake_minimum_required(VERSION 3.10)# 设置项目名称 project(MyProject)# 添加可执行文件 add_executabl…...
linux系统ELK组件介绍
ELK组件介绍 ELK组件介绍Elasticsearch:Logstash:Kibana:Kafka: Filebeat: ELK 官网地址:https://www.elastic.co 官网搭建:https://www.elastic.co/guide/index.html 组件介绍 Elasticsearch: 是一个基于Lucene的搜…...

回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测
回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测 目录 回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BiTCN基于双向时间卷积网络的数据回归预测(完整源码和数据&a…...
Tailscale中继服务derper使用docker-compose部署
docker启动 docker run --restart always \--name derper -p 12345:12345 -p 3478:3478/udp \-v /root/.acme.sh/xxxx/:/app/certs \-e DERP_CERT_MODEmanual \-e DERP_ADDR12345 \-e DERP_DOMAINxxxx \-d ghcr.io/yangchuansheng/derper:latestdocker-compose启动 version: …...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...