【普中STM32F1xx开发攻略--标准库版】-- 第 29 章 内部温度传感器实验

(1)实验平台:普中STM32F103朱雀、玄武开发板


上一章我们介绍了 ADC 模数转换实验, 知道 ADC 内部有一个通道连接着芯片的温度传感器, 这一章我们就来学习下 STM32F1 的内部温度传感器。 本章要实现的功能是: 通过芯片内部温度传感器读取温度, 并将读取的温度数据打印出去, DS0 指示灯闪烁提示系统正常运行。 学习本章可以参考上一章 ADC 模数转换实验或者参考《STM32F10x 中文参考手册》 -11 模数转换器(ADC) -11.10 章节, 特别是寄存器介绍部分。 本章分为如下几部分内容:

29.1 STM32F1 内部温度传感器介绍

29.1.1 STM32F1 内部温度传感器简介

29.2 内部温度传感器配置步骤

29.3 硬件设计

29.4 软件设计

29.4.1 内部温度传感器初始化函数

29.4.2 温度读取函数

29.4.3 主函数

29.5 实验现象


29.1 STM32F1 内部温度传感器介绍

29.1.1 STM32F1 内部温度传感器简介

STM32F1 内部含有一个温度传感器, 可用来测量 CPU 及周围的温度(TA)。此温度传感器与 ADC1 内部输入通道相连接, 如下图所示。 它连接在 ADC1_IN16上。 ADC1 可以将传感器输出的电压转换成数字值。 STM32F1 的内部温度传感器支持的温度范围为: -40~125 度, 精度为±1.5℃左右。

STM32F1 内部温度传感器的使用很简单, 只要初始化下 ADC1_IN16 通道, 并激活其内部温度传感器通道就差不多了。 关于 ADC 的初始化, 我们在上一章已经进行了详细的介绍, 这里就不多说。 接下来我们介绍一下和温度传感器设置相关的 2 个地方。

(1) 要使用 STM32F1 的内部温度传感器, 必须先激活 ADC 的内部通道,这里通过 ADC_CCR 的 TSVREFE 位( bit23) 设置。 设置该位为 1 则启用内部温度传感器, 否则关闭内部温度传感器。

(2) STM32F103ZET6 的内部温度传感器固定的连接在 ADC1_IN16 上, 所以,我们在设置好 ADC1 之后只要读取通道 16 的 AD 值, 就知道温度传感器返回来的电压值了。 根据这个值, 我们就可以计算出当前温度。 计算公式如下:

T(℃) ={( Vsense - V25) /Avg_Slope}+25

公式中:

V25=Vsense 在 25 度时的数值(典型值为: 1.43V) 。

Avg_Slope=温度与 Vsense 曲线的平均斜率(单位为 mv/℃或 uv/℃) (典型值为 4.3mV/℃) 。

通过上面公式, 我们就能非常方便的计算出当前内部温度传感器测试的温度。

29.2 内部温度传感器配置步骤

接下来我们介绍下如何使用库函数对内部温度传感器进行配置。 这个也是在编写程序中必须要了解的。 具体步骤如下:(ADC 相关库函数在 stm32f10x_adc.c和 stm32f10x_adc.h 文件中)

(1) 初始化 ADC1_IN16 相关参数, 开启内度温度传感器

ADC1_IN16 的初始化步骤与上一章介绍 AD 模数转换实验一样, 这里我们只需要开启内部温度传感器即可, 调用的库函数为:

ADC_TempSensorVrefintCmd(ENABLE);//打开 ADC 内部温度传感器

(2) 读取 ADC1_IN16 AD 值, 将其转换为对应温度

上一步配置好后, 我们就可以读取温度传感器的电压值, 根据温度计算公式,可以求出对应电压值的温度, 具体方法与上一章一样。

29.3 硬件设计

本实验使用到硬件资源如下:

(1) DS0 指示灯

(2) 串口 1

(3) 内部温度传感器

DS0 指示灯、 串口 1 电路在前面章节都介绍过, 这里就不多说, 至于内部温度传感器它属于 STM32F1 芯片内部的资源, 连接的是 ADC1_IN16 通道。

29.4 软件设计

本章所要实现的功能是: 通过芯片内部温度传感器读取温度, 并将读取的温度数据打印出去, DS0 指示灯闪烁提示系统正常运行。 程序框架如下:

(1) 初始化内部温度传感器(初始化 ADC1_IN16, 开启温度传感器)

(2) 编写温度读取函数

(3) 编写主函数

前面介绍内部温度传感器配置步骤时, 就已经讲解如何初始化内部温度传感器。 下面我们打开“\4--实验程序\1--基础实验\21-内部温度传感器实验” 工程,在 APP 工程组中可以看到添加了 adc_temp.c 文件(里面包含了内部温度传感器驱动程序) , 在 StdPeriph_Driver 工程组中添加了 stm32f10x_adc.c 库文件。ADC 操作的库函数都放在 stm32f10x_adc.c 和 stm32f10x_adc.h 文件中, 所以使用到 ADC 就必须加入 stm32f10x_adc.c 文件, 同时还要包含对应的头文件路径。

这里我们分析几个重要函数, 其他部分程序大家可以打开工程查看。

29.4.1 内部温度传感器初始化函数

要使用内部温度传感器, 我们必须先对它进行配置。 初始化代码如下:

/******************************************************************************* * 函 数 名 : ADC_Temp_Init * 函数功能 : ADC_Temp初始化函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void ADC_Temp_Init(void) { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6); //分频因子6时钟为72M/6=12MHz ADC_TempSensorVrefintCmd(ENABLE);//打开ADC内部温度传感器 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//禁止触发检测,使用软件触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; //1个转换在规则序列中 也就是只转换规则序列1 ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化 ADC_Cmd(ADC1, ENABLE);//开启AD转换器 ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器 while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态 ADC_StartCalibration(ADC1);//开始指定ADC的校准状态 while(ADC_GetCalibrationStatus(ADC1));//获取指定ADC的校准程序 ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的软件转换启动功能 }

该函数功能很简单, 初始化 ADC1_IN16 通道, 并且调用ADC_TempSensorVrefintCmd 函数开启内部温度传感器。 初始化过程与上一章 ADC模数转换实验一模一样。

29.4.2 温度读取函数

当初始化内部温度传感器后, 就可以读取温度值, 代码如下:

/******************************************************************************* * 函 数 名 : Get_ADC_Temp_Value * 函数功能 : 获取通道ch的转换值,取times次,然后平均 * 输 入 : ch:通道编号 times:获取次数 * 输 出 : 通道ch的times次转换结果平均值 *******************************************************************************/ u16 Get_ADC_Temp_Value(u8 ch,u8 times) { u32 temp_val=0; u8 t; //设置指定ADC的规则组通道,一个序列,采样时间 ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5); //ADC1,ADC通道,239.5个周期,提高采样时间可以提高精确度 for(t=0;t<times;t++) { ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束 temp_val+=ADC_GetConversionValue(ADC1); delay_ms(5); } return temp_val/times; } /******************************************************************************* * 函 数 名 : Get_Temperture * 函数功能 : 获取温度值 * 输 入 : 无 * 输 出 : 温度值(扩大了100倍,单位:℃) *******************************************************************************/ int Get_Temperture(void) { u32 adc_value; int temp; double temperture; adc_value=Get_ADC_Temp_Value(ADC_Channel_16,10); //读取通道16内部温度传感器通道,10次取平均 temperture=(float)adc_value*(3.3/4096); //电压值 temperture=(1.43-temperture)/0.0043+25; //转换为温度值 temp=temperture*100; //扩大100倍. return temp; }

温度读取函数代码比较简单, 首先读取 ADC1_IN16 通道的 AD 值, 然后将其转换为电压值, 根据温度计算公式就可以得到对应的温度值, 最后将其放大 100倍作为函数值返回, 温度值有正负, 所以返回值类型为 int。

29.4.3 主函数

编写好内部温度传感器初始化和温度读取函数后, 接下来就可以编写主函数了, 代码如下:

#include "system.h" #include "SysTick.h" #include "led.h" #include "usart.h" #include "adc_temp.h" /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ int main() { u8 i=0; int temp=0; SysTick_Init(72); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组 LED_Init(); USART1_Init(115200); ADC_Temp_Init(); while(1) { i++; if(i%20==0) { LED1=!LED1; } if(i%50==0) { temp=Get_Temperture(); if(temp<0) { temp=-temp; printf("内部温度检测值为:-"); } else { printf("内部温度检测值为:+"); } printf("%.2f°C\r\n",(float)temp/100); } delay_ms(10); } }

主函数实现的功能很简单, 首先调用之前编写好的硬件初始化函数, 包括SysTick 系统时钟, 中断分组, LED 初始化等。 然后调用我们前面编写的ADC_Temp_Init 函数, 最后进入 while 循环, 间隔 500ms 读取一次温度, 判断读取的温度是正温度还是负温度, 最后打印温度数据, 在输出温度数据时, 要记得除以 100, 因为读取的温度值是放大了 100 倍的。 DS0 指示灯会间隔 200ms 闪烁,提示系统正常运行。

29.5 实验现象

将工程程序编译后下载到开发板内, 可以看到 DS0 指示灯不断闪烁, 表示程序正常运行。 串口不断打印读取的温度数据, 如果想在串口调试助手上看到输出信息, 可以打开“\5--开发工具\4-常用辅助开发软件\串口调试助手\串口调试助手(丁丁)” 内串口调试助手。 实验现象如下: (前提一定要连接好线路, USB线一端连接电脑, 另一端连接开发板“USB 转串口模块” 上的 USB 下载口, 并且在“USB 转 TTL&电源” 模块上 P4 端子短接片已插上

实验现象说明: 由于芯片工作会发热, 所以内部温度传感器检测的温度通常会高于实际温度, 这也是不使用芯片内部温度传感器来检测环境温度的原因。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1183965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026开年炸雷!Apache Kafka三重高危漏洞肆虐:RCE+DoS+SSRF齐发,波及2.0.0-3.9.0全版本,企业升级刻不容缓

一、漏洞背景与披露全景 2026年初&#xff0c;Apache软件基金会通过官方安全通报渠道&#xff0c;紧急披露了影响Kafka核心组件的3个高危安全漏洞&#xff0c;分别编号为CVE-2025-27817、CVE-2025-27818、CVE-2025-27819。这批漏洞由全球多个安全团队协同发现&#xff0c;其中C…

方程豹豹8开启智驾撞牛未停车 车主质疑:智驾有什么用呢?

【文/深度评车&财经三剑客】1月12日&#xff0c;济南的潘先生反映2025年6月购买了一辆方程豹豹8&#xff0c;12月在内蒙古使用智能辅助驾驶时&#xff0c;侧面撞到牛身上。车辆提醒、躲闪及制动功能都没有启动&#xff0c;4S店表示&#xff1a;强光照射激光雷达导致短暂“失…

手搓HTML解析器:500行代码实现完整的DOM树构建

手搓HTML解析器&#xff1a;500行代码实现完整的DOM树构建引言&#xff1a;为什么需要理解HTML解析器&#xff1f;在Web开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;是我们与网页交互的核心接口。现代前端框架如React、Vue都构建在DOM之上&#xff0c;但很少有人…

三招速查本机端口占用

1.如何查看本机端口占用 查看本机端口占用情况是网络调试、服务部署和故障排查的常见需求。不同操作系统提供了不同的命令行工具&#xff0c;以下是 Windows、Linux、macOS 三大平台的详细方法&#xff1a; ✅ 一、通用原理 操作系统内核维护一张 “网络连接与监听表”&#…

护照阅读器:爱达魔都号邮轮的高效登船助力

爱达魔都号作为连接多国航线的邮轮&#xff0c;登船环节需完成旅客身份核验与出入境合规检查&#xff0c;护照阅读器的应用让这一流程更顺畅高效。根据邮轮出行的证件管理要求&#xff0c;旅客需凭有效护照及相关凭证登船&#xff0c;且护照需满足有效期等规范。以往人工核对护…

【读书笔记】《日常生活中的自我呈现》

《日常生活中的自我呈现》书籍解读整理 这是一本由加拿大社会学家欧文戈夫曼&#xff08;Erving Goffman&#xff09;撰写的经典著作&#xff0c;将戏剧表演框架引入社会学分析&#xff0c;提出“拟剧论”&#xff08;dramaturgical analysis&#xff09;。戈夫曼认为&#xff…

小程序毕设项目推荐-基于微信小程序的文化娱乐购票系统基于springboot+微信小程序的话剧票务管理系统【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

马斯克狂砸16亿「买」他五年!揭秘特斯拉2号人物,那个睡工厂的狠人

没有家庭、没有房子&#xff0c;只有一个使命——这就是朱晓彤。获授52万期权&#xff0c;他需坚守5年&#xff0c;完成累计2000万辆交付等KPI。最近&#xff0c;特斯拉向美国证券交易委员披露了一项重磅股权激励&#xff1a;授予全球汽车业务高级副总裁朱晓彤&#xff08;Tom …

【读书笔记】《傅雷家书》

《傅雷家书》精讲整理 《傅雷家书》是一本经典之作&#xff0c;记录了著名翻译家、文艺评论家傅雷与儿子、钢琴家傅聪之间长达十二年的书信往来。这些家书不仅是父子深情的真实流露&#xff0c;更是家庭教育、亲子关系、艺术修养与人生智慧的宝贵结晶。以下是对分享内容的系统整…

R8240数字电子计

R8240 数字电子计R8240 是一款高精度数字电子计&#xff0c;用于工业和实验环境中对电量、时间或其他参数进行精确测量和显示。它以可靠性高、操作简便和读数直观而著称。主要特点与应用&#xff1a;高精度测量&#xff1a;提供稳定、准确的数字读数&#xff0c;满足工业及科研…

双目摄像头:让人脸登录更安全可靠

人脸登录因无需密码、操作便捷&#xff0c;已广泛应用于手机解锁、APP登录等场景&#xff0c;但单目摄像头易被照片、视频等虚假手段破解&#xff0c;存在安全隐患。双目摄像头的出现&#xff0c;为解决这一问题提供了有效方案。 双目摄像头模拟人眼“双眼视物”的原理&#xf…

纽约时报:OpenAI或将在18个月内现金流枯竭

奥特曼的万亿豪赌或难以为继&#xff0c;OpenAI 恐面临被吞并结局&#xff0c;AI 泡沫时代即将硬着陆。 华尔街最近弥漫着一种「恐高症」。 AI 概念股已经涨到了让人眩晕的高度&#xff0c;似乎只要技术稍不达预期&#xff0c;崩盘就在眼前。 市值最高的 7 大科技巨头&#x…

手机也能跑AI?用DeepSeek-R1-Distill-Qwen-1.5B打造边缘计算助手

手机也能跑AI&#xff1f;用DeepSeek-R1-Distill-Qwen-1.5B打造边缘计算助手 1. 引言&#xff1a;当大模型走向终端设备 近年来&#xff0c;AI大模型的发展速度令人瞩目。从千亿参数的GPT系列到如今轻量级但性能强劲的小模型&#xff0c;边缘AI推理正成为技术演进的重要方向。…

盘点便宜好用的古籍识别OCR:6款古籍识别网站

做古籍研究这么多年&#xff0c;我跑过 17 个省份的古籍数字化项目&#xff0c;试过的古籍识别工具没有十几种也有七八种&#xff0c;论性价比和实用性&#xff0c;云聪古籍绝对是佼佼者。大家都清楚&#xff0c;简体字常用的也就六千多个&#xff0c;可古代繁体光异体字就有十…

英文文献检索技巧与高效策略:提升学术文献检索效率的实用指南

做科研的第一道坎&#xff0c;往往不是做实验&#xff0c;也不是写论文&#xff0c;而是——找文献。 很多新手科研小白会陷入一个怪圈&#xff1a;在知网、Google Scholar 上不断换关键词&#xff0c;结果要么信息过载&#xff0c;要么完全抓不到重点。今天分享几个长期使用的…

一个星期又赚了4387元

熟悉独孤的都知道。独孤今年全力all in AI供稿项目。所以在这个项目上&#xff0c;几乎投入了100%的力气。在过去的一个星期里。独孤除了带团队以外&#xff0c;还自己继续实操优化供稿内容。一个星期&#xff0c;干了4387元。这也是独孤说的。这个项目&#xff0c;没有上限。只…

AI 智能体工具与模型上下文协议 (MCP) 深度解析

我们将深入探讨 AI 工具的本质、设计原则&#xff0c;并对作为互操作性标准的模型上下文协议&#xff08;MCP&#xff09;进行深度解析。引言&#xff1a;为何工具是现代 AI 的基石即使是当今最先进的基础模型&#xff0c;若没有外部工具的辅助&#xff0c;本质上也仅仅是一个强…

Unsloth镜像免配置优势解析:10分钟完成Qwen微调部署

Unsloth镜像免配置优势解析&#xff1a;10分钟完成Qwen微调部署 1. Unsloth 简介 Unsloth 是一个开源的大型语言模型&#xff08;LLM&#xff09;微调与强化学习框架&#xff0c;致力于让人工智能技术更加准确、高效且易于获取。其核心目标是降低开发者在训练和部署主流大模型…

2026年山东土工格栅厂家实力榜:塑料土工格栅、玻纤土工格栅、钢塑土工格栅、高分子复合材料与生态护坡解决方案五家企业凭技术与工程应用脱颖而出 - 海棠依旧大

随着基础设施建设对生态环保与工程耐久性要求的不断提升,土工合成材料在边坡防护、路基加固、水土保持等场景中的作用日益凸显。其中,土工格室作为兼具结构稳定性与生态适应性的关键材料,其产品性能与施工适配性成为…

从文本到语音的极致加速|Supertonic ONNX Runtime性能实测

从文本到语音的极致加速&#xff5c;Supertonic ONNX Runtime性能实测 1. 引言&#xff1a;设备端TTS的新范式 1.1 背景与挑战 在人工智能驱动的语音交互场景中&#xff0c;文本转语音&#xff08;Text-to-Speech, TTS&#xff09;技术正被广泛应用于智能助手、有声读物、无…