STM32H750外设ADC之MCU内部温度传感器

ops/2024/9/23 21:54:58/

目录

概述

1. 内部温度传感器

1.1 功能介绍

1.2 读取温度方法

1.3 计算温度值

2 STM32Cube生成工程

2.1 配置参数

2.2 生成工程文件 

3 功能实现 

3.1 初始化ADC

3.2 功能函数

4 测试 


代码下载地址:

stm32-h750-proj-ADC-Read-temp资源-CSDN文库

概述

本文主要介绍关于使用STM32H750外设ADC读取MCU内部温度传感器的方法,文中首先介绍STM32H750内部温度传感器的读取原理,实现方法。并使STM32Cube工具设计一个工程,以实现读取温度数据的功能。

1. 内部温度传感器

1.1 功能介绍

温度传感器可测量器件的结温 (TJ),温度范围为 -40 °C 到 125 °C。温度传感器内部连接到 ADC3 VINP[18] 输入通道,该通道用于将传感器输出电压转换为数字值。温度传感器模拟引脚的采样时间必须大于产品数据手册中指定的稳定时间。不使用时可将传感器置于掉电模式。

注意:必须将 VSENSEEN 位置 1 才能使能内部通道 ADC3 VINP[18] 的转换(温度传感器, VSENSE)。

ADC x 通用控制寄存器 (ADCx_CCR)( x=12 或 3)
ADC x common control register
偏移地址: 0x08(该偏移地址与主 ADC 基址 + 0x300 相关)
复位值: 0x0000 0000
ADC1 和 ADC2 由相同的接口控制,而 ADC3 单独控制。
 

位 23 VSENSEEN:温度传感器电压使能 (Temperature sensor voltage enable)
此位由软件置 1 和清零,用于控制 VSENSE 通道。
0:禁止温度传感器通道
1:使能温度传感器通道


注意:

仅当 ADC 已禁止时(ADCAL=0、 JADSTART=0、 ADSTART=0、 ADSTP=0、 ADDIS=0且 ADEN=0),才允许通过软件对此位执行写操作。
 

1.2 读取温度方法

读取温度数据的操作步骤如下:

step-1:   选择 ADC3 VINP[18] 输入通道(使用合适的采样时间)。
step-2:   设定合适的采样时间(请参见器件数据手册中的电气特性部分)。
step-3:    在 ADCx_CCR 寄存器中将 VSENSEEN 位置 1,以便将温度传感器从掉电模式中唤醒。
step-4:   开始 ADC 转换。
step-5:   读取 ADC 数据寄存器中生成的 VSENSE 数据

1.3 计算温度值

使用以下公式计算实际温度:

参数说明:

TS_CAL2 :是在 110°C 下获得的温度传感器校准值
TS_CAL1: 是在 30°C 下获得的温度传感器校准值
TS_DATA: 是由 ADC 转换得到的实际温度传感器输出值

2 STM32Cube生成工程

2.1 配置参数

1) 使能温度传感器功能

2)配置通道参数

3)ADC模块工作时钟配置

 

2.2 生成工程文件 

完成参数配置后,点击GENERATE生成项目工程,项目产生后,打开项目文件:

3 功能实现 

3.1 初始化ADC

在adc.c文件中,已经实现ADC通道的初始化,下面详细介绍每条语句的含义

代码45行: 使用ADC3实现AD转换功能

代码46行: 数据位为16bit

代码47行: 禁止扫描功能

代码48行: 单通道转换

代码49行: 禁止低功耗自动延迟特性

代码50行:  禁止不连续模式 

代码51行:  禁止不连续模式,此位无效

代码52行:使用连续转换模式

代码53行:采用软件触发 

代码54行:采用软件触发,此位无效

代码55行:数据存放在DR

代码56行: ADC转换溢出的话,覆盖ADC的数据寄存器 

代码57行: 数据不偏移

代码58行: 禁止过度采样

代码59行: 初始化ADC功能

代码66行:采样通道为ADC_CHANNEL_TEMPSENSOR

代码67行:采样序列里的第1个

代码68行:采样周期 

代码69行:单端输入

代码70行:无偏移

代码71行:无偏移的情况下,此参数忽略

代码72行:禁止有符号饱和 

代码73行: 初始化通道参数

3.2 功能函数

代码60行:启动ADC转换数据

代码61行:等待数据转换完成

代码62行:获取ADC转换的结果

代码63行:判断数据转换的状态

代码67行:计算实际温度值

代码72行:如果本次数据转换失败,关闭ADC,准备下次重新启动ADC

详尽代码如下:

void test_get_adc_tempvalue( void )
{uint16_t TS_CAL1;uint16_t TS_CAL2;HAL_StatusTypeDef status;uint32_t value;float conv_value;HAL_ADC_Start( &hadc3 );status = HAL_ADC_PollForConversion( &hadc3, 100);value = HAL_ADC_GetValue( &hadc3 );if( status == HAL_OK) {TS_CAL1 = *(__IO uint16_t *)(0x1FF1E820);TS_CAL2 = *(__IO uint16_t *)(0x1FF1E840);conv_value = (110.0 - 30.0) * (value - TS_CAL1)/ (TS_CAL2 - TS_CAL1) + 30;  printf(" get conv_value: %04f \r\n", conv_value);}else{HAL_ADC_Stop( &hadc3 );}
}

4 测试 

编写完成代码后编译,下载代码至板卡,并在PC上打开终端工具,监控运行结果:


http://www.ppmy.cn/ops/17432.html

相关文章

安卓手机连接电脑实用技巧:实现文件传输与共享

在手机使用过程中,我们常常需要将手机中的文件传输到电脑,或者将手机与电脑进行共享。为了实现这一需求,掌握一些实用的安卓手机连接电脑技巧就显得尤为重要。本文将为您详细介绍2种简单、高效且安全的方法,让您轻松实现安卓手机与…

芯片设计工程师必看:借助Perforce Helix Core和Helix IPLM提高IP重用率,简化设计流程并确保产品质量

在当今半导体行业中,创新速度日益加快,芯片设计工程师们面临着巨大挑战。然而,一些普遍存在的问题却成为了他们创新道路上的“绊脚石”。 其中之一,就是缺乏一个集中式系统来查找IP和相关信息,导致工程师们难以有效重…

【MATLAB】将多个图像输出到单个图形窗口上:使用 subplot 函数创建子图

引言 subplot是MATLAB中的一个函数,它用于在单个图形窗口中创建多个子图。这对于同时显示多个图形或图像非常有用。 语法详解 基本语法: subplot(m, n, p)参数详解: m 指定图形窗口应该分割成多少行n 指定图形窗口应该分割成多少列p 指定…

Godot3D学习笔记1——界面布局简介

创建完成项目之后可以看到如下界面: Godot引擎也是场景式编程,这里的一个场景相当于一个关卡。 这里我们点击左侧“3D场景”按钮创建一个3D场景,现在在中间的画面中会出现一个球。在左侧节点视图中选中“Node3D”,右键创建子节点…

Jammy@Jetson Orin - Tensorflow Keras Get Started: 000 setup for tutorial

JammyJetson Orin - Tensorflow & Keras Get Started: 000 setup for tutorial 1. 源由2. 搭建环境2.1 安装IDE环境2.2 安装numpy2.3 安装keras2.4 安装JAX2.5 安装tensorflow2.6 安装PyTorch2.7 安装nbdiff 3. 测试DEMO3.1 numpy版本兼容问题3.2 karas API - model.compil…

2023-2024年度广东省职业院校学生技能大赛“ 网络系统管理”赛项竞赛规程(正式稿)

2023-2024年度广东省职业院校学生技能大赛“ 网络系统管理”赛项竞赛规程(正式稿) 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书,赛题,解析等资料,知识点培训服务 添加博主wx…

2024.4.28 机器学习周报

目录 引言 Abstract 文献阅读 1、题目 2、引言 3、创新点 4、总体流程 5、网络结构 5.1、损失函数 5.2、Confidence Maps 5.3、Part Affinity Fields(PAFs) 5.4、多人的PAFs 6、实验 7、结论 深度学习 yolov8实现目标检测和人体姿态估计 Yolov8网络结构 yaml…

从零入门区块链和比特币(第二期)

欢迎来到我的区块链与比特币入门指南!如果你对区块链和比特币感兴趣,但不知道从何开始,那么你来对地方了。本博客将为你提供一个简明扼要的介绍,帮助你了解这个领域的基础知识,并引导你进一步探索这个激动人心的领域。…