【正点原子STM32连载】 第三十一章 内部温度传感器实验摘自【正点原子】STM32F103 战舰开发指南V1.2

news2024/10/7 8:28:01

1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html

第三十一章 内部温度传感器实验

本章,我们将介绍STM32F103的内部温度传感器并使用它来读取温度值,然后在LCD模块上显示出来。
本章分为如下几个小节:
31.1 内部温度传感器简介
31.2 硬件设计
31.3 程序设计
31.4 下载验证

31.1 内部温度传感器简介

STM32有一个内部的温度传感器,可以用来测量CPU及周围的温度(内部温度传感器更适合于检测温度的变化,需要测量精确温度的情况下,应使用外置传感器)。对于STM32F103来说,该温度传感器在内部和ADC1_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值。温度传感器模拟输入推荐采样时间是17.1us。STM32F103内部温度传感器支持的温度范围为:-40~125度。精度为±1.5℃左右。
STM32内部温度传感器的使用很简单,只要设置一下内部ADC,并激活其内部温度传感器通道就差不多了。关于ADC的设置,我们在上一章已经进行了详细的介绍,这里就不再多说。接下来我们介绍一下和温度传感器设置相关的两个地方。
第一个地方,我们要使用STM32的内部温度传感器,必须先激活ADC的内部通道,这里通过ADC_CR2的AWDEN位(bit23)设置。设置该位为1则启用内部温度传感器。
第二个地方,STM32的内部温度传感器固定的连接在ADC1的通道16上,所以,我们在设置好ADC1之后只要读取通道16的值,就是温度传感器返回来的电压值了。根据这个值,我们就可以计算出当前温度。计算公式如下:
{ (V25-Vsense) / Avg_Slope}+25
式子中:
V25 = Vsense 在25度时的数值(典型值为:1.43)
Avg_Slope = 温度与Vsense曲线的平均斜率(单位:mv/℃或uv/℃)(典型值:4.3mv/℃)。
利用以上公式,我们就可以方便的计算出当前温度传感器的温度了。

31.2 硬件设计

  1. 例程功能
    通过ADC的通道16读取STM32F103内部温度传感器的电压值,并将其转换为温度值,显示在TFTLCD屏上。LED0闪烁用于提示程序正在运行。
  2. 硬件资源
    1)LED灯
    LED0 – PB5
    2)串口1(PA9/PA10连接在板载USB转串口芯片CH340上面)
    3)正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
    4)ADC1 通道16
    5)内部温度传感器
  3. 原理图
    ADC和内部温度传感器都属于STM32F103内部资源,实际上我们只需要软件设置就可以正常工作,我们需要用到TFTLCD模块显示结果。

31.3 程序设计

31.3.1 ADC的HAL库驱动
本实验用到的ADC的HAL库API函数前面都介绍过,具体调用情况请看程序解析部分。下面介绍读取内部温度传感器ADC值的配置步骤。
读取STM32内部温度传感器ADC值的配置步骤
1)开启ADC时钟
通过__HAL_RCC_ADC1_CLK_ENABLE函数开启ADC1的时钟。
2)设置ADC,开启内部温度传感器
调用HAL_ADC_Init函数来设置ADC1时钟分频系数、分辨率、模式、扫描方式等参数。
注意:该函数会调用:HAL_ADC_MspInit回调函数来完成对ADC底层的初始化,包括:ADC1时钟使能、ADC1时钟源的选择等。
3)配置ADC通道并启动AD转换器
调用HAL_ADC_ConfigChannel()函数配置ADC1通道16,根据需求设置通道、规则序列、采样时间等。然后通过HAL_ADC_Start函数启动AD转换器。
4)读取ADC值,计算温度。
这里选择查询方式读取,在读取ADC值之前需要调用HAL_ADC_PollForConversion等待上一次转换结束。然后就可以通过HAL_ADC_GetValue来读取ADC值。最后根据上面介绍的公式计算出温度传感器的温度值。
31.3.2 程序流程图
在这里插入图片描述

图31.3.2.1 内部温度传感器实验程序流程图
31.3.3 程序解析

  1. adc驱动代码
    这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。内部温度传感器驱动源码包括两个文件:adc.c和adc.h。本实验和ADC章节实验用的都是同一个adc.c和adc.h代码。
    在adc.h头文件再加入温度传感器的相关宏定义,该宏定义如下:
    /* ADC温度传感器通道 定义 */
    #define ADC_TEMPSENSOR_CHX ADC_CHANNEL_16
    ADC_CHANNEL_16就是ADC通道16连接内部温度传感器的通道16宏定义。我们在定义为ADC_TEMPSENSOR_CHX,可以让大家更容易理解这个宏定义的含义。
    下面我们直接介绍与内部温度传感器相关的adc.c的程序,首先是ADC内部温度传感器初始化函数,其定义如下:
/**
 * @brief    ADC 内部温度传感器 初始化函数
 * @note     本函数还是使用adc_init对ADC进行大部分配置,有差异的地方再单独配置
 *            注意: STM32F103内部温度传感器只连接在ADC1的通道16上, 其他ADC无法进行转换.
 *
 * @param       无
 * @retval      无
 */
void adc_temperature_init(void)
{
adc_init(); /* 先初始化ADC */
/* TSVREFE = 1, 启用内部温度传感器和Vrefint */
    SET_BIT(g_adc_handle.Instance->CR2, ADC_CR2_TSVREFE);  
}

该函数调用adc_init函数配置了ADC的基础功能参数,由于前面实验中的adc_init实验是对ADC_CHANNEL_1进行配置的,而我们对内部温度传感器的初始化步骤与普通ADC类似,为了不重复编写代码,我们用位操作函数进行修改ADC通道,把ADC_CR2的TSVREFE位置1,即SET_BIT(g_adc_handle.Instance->CR2, ADC_CR2_TSVREFE);这样子就可以完成对内部温度传感器通道的初始化工作。adc_init的实现代码,可以回顾以下ADC章节内容。
下面讲解一下获取内部温度传感器温度值函数,其定义如下:

/**
 * @brief       获取内部温度传感器温度值
 * @param       无
 * @retval      温度值(扩大了100倍,单位:℃.)
 */
short adc_get_temperature(void)
{
    uint32_t adcx;
    short result;
    double temperature;

/* 读取内部温度传感器通道,10次取平均 */
adcx = adc_get_result_average(ADC_TEMPSENSOR_CHX, 20); 
    temperature = (float)adcx * (3.3 / 4096);           	/* 转化为电压值 */
    temperature = (1.43 - temperature) / 0.0043 + 25; 	/* 计算温度 */
    result = temperature *= 100;    						/* 扩大100倍. */
    return result;
}

该函数先是调用前面ADC实验章节写好的adc_get_result_average函数取获取通道ch的转换值,然后通过温度转换公式,返回温度值。
2. main.c代码
在main.c里面编写如下代码:

int main(void)
{
    short temp;
    HAL_Init();                            		/* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);  	/* 设置时钟, 72Mhz */
    delay_init(72);                         	/* 延时初始化 */
    usart_init(115200);                    	/* 串口初始化为115200 */
    led_init();                               	/* 初始化LED */
    lcd_init();                             		/* 初始化LCD */
    adc_temperature_init();                 	/* 初始化ADC内部温度传感器采集 */
    lcd_show_string(30,  50, 200, 16, 16, "STM32", RED);
    lcd_show_string(30,  70, 200, 16, 16, "Temperature TEST", RED);
    lcd_show_string(30,  90, 200, 16, 16, "ATOM@ALIENTEK", RED);
    lcd_show_string(30, 120, 200, 16, 16, "TEMPERATE: 00.00C", BLUE);
    while (1)
    {
      temp = adc_get_temperature();   		/* 得到温度值 */
      if (temp < 0)
      {
          temp = -temp;
          lcd_show_string(30 + 10 * 8, 120, 16, 16, 16, "-", BLUE);/* 显示负号 */
      }
      else
      {
          lcd_show_string(30 + 10 * 8, 120, 16, 16, 16, " ", BLUE); /* 无符号 */
      }
      lcd_show_xnum(30 + 11 * 8, 120,temp/100, 2, 16, 0, BLUE);  /* 显示整数部分 */
      lcd_show_xnum(30 + 14 * 8, 120,temp%100, 2, 16,0X80, BLUE);/* 显示小数部分 */
      LED0_TOGGLE();  /* LED0闪烁,提示程序运行 */
      delay_ms(250);
    }
}

该部分的代码逻辑很简单,先是得到温度值,再根据温度值判断正负值,来显示温度符号,再显示整数和小数部分。
31.4 下载验证
将程序下载到开发板后,可以看到LED0不停的闪烁,提示程序已经在运行了。LCD显示的内容如图31.4.1所示:
在这里插入图片描述

图31.4.1 内部温度传感器实验测试图
大家可以看看你的温度值与实际是否相符合(因为芯片会发热,所以一般会比实际温度偏高)?

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

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

相关文章

【多线程进阶】JUC下的常用类

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 ReentrantLock Semaphore(信号量) 计数器——…

阿里发布Java岗春招面试总结(复盘版)GitHub一经上传火爆全网!

Java面试都只是背答案吗? Java 八股文面试当然要背&#xff0c;不背就通过不了面试。 因为经济环境的问题&#xff0c;互联网行业竞争越来越严峻&#xff0c;面试也是越来越难。需要我们掌握的技术也是越来越多、要求是越来越高。作为一个资深的互联网码农&#xff0c;今天给…

公司招人面了一个00后测试,可以说是内卷届的天花板.....

公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资也不低&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。令我印象最深的是一个00后测试员&#xff0c;他…

cpu、gpu的区别

1、CPU和GPU的内部构成 如上图所示&#xff0c;CPU和GPU的内部构成&#xff0c;可以看出是由不同的架构所组成 CPU&#xff1a;叫做中央处理器&#xff08;central processing unit&#xff09;作为计算机系统的运算和控制核心&#xff0c;是信息处理、程序运行的最终执行单元…

Splashtop 荣获两项“TrustRadius 2023年最受欢迎奖”

2023年5月10日 加利福尼亚州库比蒂诺 Splashtop 在简单易用的随处办公远程解决方案领域处于领先地位&#xff0c;该公司自豪地宣布&#xff0c;在远程桌面和远程支持这两个类别中荣获“TrustRadius 2023年最受欢迎奖”。这项知名奖项完全基于用户评论和客户情绪&#xff0c;强…

嵌入式软件实现定时器的两种方式

简介 在一般的嵌入式产品设计中&#xff0c;介于成本、功耗等&#xff0c;所选型的MCU基本都是资源受限的&#xff0c;而里面的定时器的数量更是有限。在我们软件设计中往往有多种定时需求&#xff0c;例如脉冲输出、按键检测、LCD切屏延时等等 &#xff0c;我们不可能让每一个…

JavaWeb__VUE

文章目录 概述快速入门Vue指令v-bindv-modelv-on条件判断v-for 概述 Vue是一套前端框架&#xff0c;免除原生JavaScript中的DOM操作&#xff0c;简化书写 基于MVVM(Model-View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上。 Model是数…

ArduPilot之H743快速加减油门抬头现象分析

ArduPilot之H743快速加减油门抬头现象分析 1. 源由2. 现象分析3. 改善方法4. 验证5. 总结6. 参考资料 1. 源由 最近一直折腾再ArduCopter快速加减油四轴模型抬头的问题。 具体情况详见下面视频&#xff1a; 猛加油&#xff0c;机头后仰&#xff0c;然后点头&#xff1b; 快速…

一文搞清楚 Docker 镜像、容器、仓库

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

【服务器数据恢复】EXT3文件系统下Oracle数据库数据恢复案例

服务器数据恢复环境&#xff1a; 华为OceanStor某型号存储&#xff0c;十几块FC硬盘组建一组RAID5磁盘阵列&#xff0c;配备了一块热备盘&#xff1b;上层使用EXT3文件系统&#xff0c;配置了oracle数据库。 服务器故障&#xff1a; 该存储RAID5中的一块硬盘未知原因离线&…

从软件测试到自动化测试,待遇翻倍,我整理的超全学习指南!

因为我最近在分享自动化测试技术&#xff0c;经常被问到&#xff1a; 功能测试想转自动化&#xff0c;请问应该怎么入手&#xff1f;有没有好的资源推荐&#xff1f; 那么&#xff0c;接下来我就结合自己的经历聊一聊我是如何在工作中做自动化测试的。&#xff08;学习路线和…

教你该如何写单元测试

目录 前言&#xff1a; 到底什么是单元测试 为什么单测这么难写 写个单测例子 道阻且长 前言&#xff1a; 编写单元测试是软件开发中非常重要的一环&#xff0c;它可以确保代码的质量&#xff0c;减少Bug的产生&#xff0c;提高代码的可维护性&#xff0c;同时也能够大大…

ts自定义迭代器

key 为 [Symbol.iterator]

软考A计划-系统架构师-案例分析知识点整理

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

【数据结构】24王道考研笔记——栈、队列和数组

三、栈、队列和数组 目录 三、栈、队列和数组栈基本概念顺序栈链式栈 队列基本概念顺序存储链式存储双端队列 应用括号匹配前中后缀表达式栈在递归中的运用队列的运用 数组数组的存储对称矩阵三角矩阵三对角矩阵稀疏矩阵 栈 基本概念 栈是只允许在一端进行插入或删除操作的线…

朋友拿下字节27K的offer,实名羡慕了....

最近有朋友去字节面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

Redux异步解决方案 1. Redux-Thunk中间件

简单介绍一下thunk&#xff0c;这是一个中间件&#xff0c;是解决redux异步问题产生的。我们都知道&#xff0c;在使用redux的时候&#xff0c;通过dispatch一个action 发生到reducer 然后传递给store修改状态 一系列都是同步的&#xff0c;那如果说我dispatch一个action 这个a…

blockchain layer区块链分层

目录 1.layer0 2.layer1 3.layer2 ​4.layer3 1.layer0 第0层的定义目前行业还没有完全一致的理解。多数人认为第0层是 加密数据连接层及其硬件&#xff0c;对应上图下半部分。 也有一些人把跨链或可以创建链的基础设施为作为第0层&#xff0c;他们的代表有: LayerZero、S…

一文讲清后摩尔时代国产高性能并行应用软件生态建设

摘自《后摩尔时代国产高性能并行应用软件生态建设综述》 作者&#xff1a; 龚春叶1&#xff0c;刘杰1&#xff0c;包为民2&#xff0c;潘冬梅1&#xff0c;甘新标1&#xff0c;李胜国1 陈旭光1&#xff0c;肖调杰1&#xff0c;杨博1&#xff0c;王睿伯1 (1.国防科技大学 并…

基于stm32作品设计:多功能氛围灯、手机APP无线控制ws2812,MCU无线升级程序

文章目录 一、作品背景二、功能设计与实现过程三、实现基础功能&#xff08;一&#xff09;、首先是要选材&#xff08;二&#xff09;、原理图设计&#xff08;二&#xff09;、第一版本PCB设计&#xff08;三&#xff09;、焊接PCB板&#xff08;四&#xff09;编写单片机程序…