【STM32嵌入式系统设计与开发】——17STM32Temper(ADC内部温度传感器应用)

news2024/11/23 3:52:53

这里写目录标题

    • STM32资料包: 百度网盘下载链接:链接:https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd=8888 提取码:8888
  • 一、任务描述
  • 二、任务实施
    • 1、工程文件夹创建
    • 2、函数编辑
      • (1)主函数编辑
      • (2)ADC初始化函数(T_Adc_Init())
      • (3)获得通道值函数(T_Get_Adc())
      • (4)获得ADC的平均值函数(T_Get_Adc_Average())
      • (4)获得ADC的平均值函数(T_Get_Adc_Average())
      • (5)ADC按键初始化函数(Get_Temperature())
    • 3、头文件添加
    • 4、头文件编辑
    • 4、知识链接
      • (1)内部温度工作原理
      • (2)编写步骤
    • 5、工程测试


STM32资料包:
百度网盘下载链接:链接:https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd=8888
提取码:8888

一、任务描述

在这里插入图片描述

二、任务实施

观察电路图:
TXD(底板) ————————> PA10
RXD(底板) ————————> PA9
读取内部温度传感器的值需要通过ADC进行模拟信号转换,并根据芯片的参考温度值进行转换为实际温度

在这里插入图片描述

1、工程文件夹创建

步骤1:复制工程模板“1_Template”重命名为“14_ADC”。
在这里插入图片描述

步骤2:修改项目工程名,先删除projects文件夹内除了Template.uvprojx文件外的所有内容并修改为“ADC.uvprojx”。并删除output/obj和output/lst中的所有文件。
在这里插入图片描述
步骤3:运行“PassiveBeep.uvprojx”打开目标选项“Options for Target”中的“Output”输出文件,并修改可执行文件名称为“ADC”点击“OK”保存设置。最后点击“Rebuild”编译该工程生成Usart文件。
在这里插入图片描述

步骤4:复制2_LEDTest中的"1_LED"和文件复制到hardware中。
在这里插入图片描述

步骤5:在system文件夹中新建一个adc文件夹并在该文件夹下新建adc.c和adc.h两个文件。
在这里插入图片描述
步骤6:工程组文件中添加“1_LED”和“2_ADCKEY”文件夹内的所有文件。
在这里插入图片描述
步骤7:工程组文件中添加“adc”文件夹内的所有文件。
在这里插入图片描述
步骤6:目标选项添加添加头文件路径。
在这里插入图片描述

2、函数编辑

(1)主函数编辑

基于STM32的检测定时器超时状态并翻转LED的状态,同时检测AD按键状态并输出按下的按键编号到串口。
在这里插入图片描述

步骤2:循环函数编写

	while(1)
	{	 								
		if(WaitTimerOut(3))
		{
			/*得到温度值*/
			temp=Get_Temprate();
			temp2 = temp*0.01;                             //缩小100倍
			
			/* 判断温度是否小于0 */
			if(temp<0)  
            printf("STM32 Temper: -%2.2f \r\n",temp2);    //负温度				
			else
				printf("STM32 Temper: %2.2f \r\n",temp2); //正温度

		}
	}	

在这里插入图片描述

(2)ADC初始化函数(T_Adc_Init())

步骤1:初始化ADC

/*********************************************************************
 @Function  : 初始化ADC
 @Parameter : N/A
 @Return    : N/A
**********************************************************************/
void T_Adc_Init(void) 
{
    ADC_InitTypeDef ADC_InitStructure; 
    // 定义 ADC_InitTypeDef 结构体变量,用于配置 ADC 参数

    /* 时钟使能 */	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);// 使能 GPIOA 和 ADC1 的时钟	   
    
    /* ADC 时钟配置 */	
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);                                          // 将 ADC 时钟设置为 APB2 时钟的 1/6,即 72MHz / 6 = 12MHz
    
    ADC_DeInit(ADC1);                                                          // 将 ADC1 寄存器恢复默认值,相当于复位 ADC1
    
    /* ADC 配置 */	
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	                       // 设置 ADC 工作模式为独立模式,即单个 ADC 工作
    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 数据右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 1;	                                   // 使用的 ADC 通道数目为 1
    ADC_Init(ADC1, &ADC_InitStructure);	                                       // 根据上述配置初始化 ADC1
	
    /* 开启内部温度传感器 */	
    ADC_TempSensorVrefintCmd(ENABLE);                                          // 开启 ADC 内部温度传感器

    /* 使能 ADC */	
    ADC_Cmd(ADC1, ENABLE);	                                                   // 使能 ADC1

    /* 复位 ADC */	
    ADC_ResetCalibration(ADC1);	                                               // 复位 ADC1 的校准寄存器
    while(ADC_GetResetCalibrationStatus(ADC1));	                               // 等待校准寄存器复位完成
    ADC_StartCalibration(ADC1);	                                               // 开始 ADC1 的校准
    while(ADC_GetCalibrationStatus(ADC1));	                                   // 等待校准完成
}

在这里插入图片描述

(3)获得通道值函数(T_Get_Adc())

/*********************************************************************
 @Function  : 获得某个通道值 
 @Parameter : ch :通道号
 @Return    : 对应通道的ADC值
**********************************************************************/
uint16_t T_Get_Adc(uint8_t ch)   
{ 
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	//ADC1通道3,第一个转换,采样时间为239.5周期	  			     
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		                        //使能ADC1软件转换启动功能
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));                     //等待转换结束
	return ADC_GetConversionValue(ADC1);	                            //返回最近一次ADC1规则组的转换结果
}

在这里插入图片描述

(4)获得ADC的平均值函数(T_Get_Adc_Average())

/*********************************************************************
 @Function  : 得到ADC采样内部温度传感器的值
 @Parameter : N/A
 @Return    : 取10次的平均温度值
**********************************************************************/
uint16_t T_Get_Temp(void)
{
    uint16_t temp_val = 0;                        // 初始化变量 temp_val,用于存储采样值的累加结果
    uint8_t t;                                    // 循环计数器

    for (t = 0; t < 10; t++)
    {
        temp_val += T_Get_Adc(ADC_Channel_16);	  // 获取内部温度传感器采样值并累加到 temp_val 中
        delay_ms(5);                              // 延时 5 毫秒,确保 ADC 转换完成
    }

    return temp_val / 10;                         // 返回 10 次采样的平均值
}

在这里插入图片描述

(4)获得ADC的平均值函数(T_Get_Adc_Average())

/*********************************************************************
 @Function  : 获取通道 ch 的转换值
 @Parameter : ch :通道号
              times :获取 ADC 通道值的次数
 @Return    : 取 times 次的平均值
**********************************************************************/
uint16_t T_Get_Adc_Average(uint8_t ch, uint8_t times)
{
    u32 temp_val = 0;                // 定义用于累加 ADC 值的变量,类型为无符号32位整数
    uint8_t t;                       // 循环计数器

    for (t = 0; t < times; t++)
    {
        temp_val += T_Get_Adc(ch);   // 调用 T_Get_Adc 函数获取通道 ch 的 ADC 值,并累加到 temp_val 中
        delay_ms(5);                 // 延时 5 毫秒,等待 ADC 转换完成
    }

    return temp_val / times;         // 返回累加值的平均值,即取 times 次采样的平均值
}

在这里插入图片描述

(5)ADC按键初始化函数(Get_Temperature())

/*********************************************************************
 @Function  : 得到温度值
 @Parameter : N/A
 @Return    : 温度值(扩大了100倍,单位:℃)
**********************************************************************/
short Get_Temperature(void)	
{
    u32 adcx;           // 定义用于存储 ADC 平均值的变量
    short result;       // 定义最终温度值的变量
    double temperature; // 定义温度变量,类型为双精度浮点数

	  /* 读取通道 16,进行 20 次采样取平均值 */
    adcx = T_Get_Adc_Average(ADC_Channel_16, 20); 

    /* 计算电压值(假设 ADC 参考电压为 3.3V,分辨率为 12 位,即 4096 个刻度 */
    temperature = (float)adcx * (3.3 / 4096);

    /* 根据传感器特性将电压值转换为温度值(假设转换公式为温度 = (1.43V - 电压值) / 0.0043 + 25℃)*/
    temperature = (1.43 - temperature) / 0.0043 + 25;

	  /* 将温度值扩大 100 倍,并转换为整数类型 */
    result = temperature * 100; 

    return result;     // 返回扩大了 100 倍的温度值
}

在这里插入图片描述

3、头文件添加

步骤1:adc所需头文件添加

#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_adc.h"
#include ".\adc\adc.h"
#include ".\delay\delay.h"

步骤2:添加STM32Temper源文件所需的头文件

#include "stm32f10x_adc.h"
#include ".\adc\adc.h"
#include "STM32Temper.h"

步骤3:函数声明

  short temp=0;
  float temp2; 
	delay_init();                   //启动滴答定时器
    usart1_init(9600);              //USART1初始化
	SystemTinerInit(1000-1,3600-1); //系统时间初始化 定时100ms
	LED_Init();                     //板载LED初始化
	T_Adc_Init();		  		    //ADC初始化	

4、头文件编辑

//bord.h
#ifndef __BORD_H_
#define __BORD_H_
#include "system_config.h"

//头文件包含
/*************SYSTEM*****************/
/*#include ".\sys\sys.h"*/
#include ".\delay\delay.h"
#include ".\usart\usart.h"
#include ".\timer\timer.h"
#include ".\adc\adc.h"

/***********Hardweare***************/
#include "led.h"
#include "STM32Temper.h"
 

/***********Funlibrary***************/





#endif


步骤2:主函数添加函数的声明

//adc.h
#ifndef __ADC_H
#define __ADC_H
#include <stdint.h>

/* 函数声明 */
void T_Adc_Init(void); 
uint16_t  T_Get_Adc(uint8_t ch); 
uint16_t  T_Get_Adc_Average(uint8_t ch,uint8_t times);	 

#endif


!

步骤2:添加STM32Temper的头文件

//STM32Temper.h
#ifndef __STM32TEMPER_H
#define __STM32TEMPER_H
#include "stdint.h"

short Get_Temperature(void)	;

#endif

4、知识链接

(1)内部温度工作原理

STM32内部温度传感器在芯片内部与ADCx_IN16输入通道相连接,此通道把传感器输出的电压转换成数字值,继而换算成温度值。因此,我们只需设置一下内部ADC,并激活其内部通道就可以了。

(2)编写步骤

1、配置ADC
2、获取某个通道值
3、内部温度传感器的值计算

5、工程测试

在这里插入图片描述

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

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

相关文章

大数据之ClickHouse

大数据之ClickHouse 简介 ClickHouse是一种列式数据库管理系统&#xff0c;专门用于高性能数据分析和数据仓库应用。它是一个开源的数据库系统&#xff0c;最初由俄罗斯搜索引擎公司Yandex开发&#xff0c;用于满足大规模数据分析和报告的需求。 特点 开源的列式存储数据库…

计算机网络---第九天

以太网交换机的工作原理 以太网定义&#xff1a; 定义&#xff1a;输出标准Ethernet2类型帧的网络 以太网特征&#xff1a; 特征&#xff1a;多路访问&#xff0c;广播式的网络 mac地址: 每台设备都有一个唯一的物理地址&#xff0c;全球唯一 48位长度&#xff0c;16禁止…

浏览器工作原理与实践--HTTP/1:HTTP性能优化

谈及浏览器中的网络&#xff0c;就避不开HTTP。我们知道HTTP是浏览器中最重要且使用最多的协议&#xff0c;是浏览器和服务器之间的通信语言&#xff0c;也是互联网的基石。而随着浏览器的发展&#xff0c;HTTP为了能适应新的形式也在持续进化&#xff0c;我认为学习HTTP的最佳…

mac上如何安装python3

mac上如何安装python3&#xff1f; 安装homebrew 在终端执行命令 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 执行完成后&#xff0c;homebrew和pip等工具就自动安装好了。 接下来安装python3.在终端…

nfs服务器详解

nfs&#xff08;网络文件系统&#xff09;---------- 其实就是通过网络将文件共享出去。 通过TCP/IP网络去共享资源的。在NFS的应用中&#xff0c;本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件&#xff0c;就像访问本地文件一样。 客户端和服务端需要去读写共…

Let‘s Encrypt

创建文件夹 mkdir /usr/local/develop/ 安装Certbot客户端 yum install certbot 首先确保example.com和www.example.com这两个域名通过DNS解析绑定了你的web 服务器的公网 IP 就是说先要完成域名解析到服务器 下面命令会验证 /var/www/example 他会将一些命令文件存在…

国芯科技(C*Core)双芯片汽车安全气囊解决方案

汽车安全气囊是20世纪汽车上的十大发明之一&#xff0c;是目前汽车的法定标准配置&#xff0c;成为汽车驾乘人员生命安全的保护神。随着人们对汽车安全性要求的进一步提高&#xff0c;已形成前排驾驶员气囊、前排副驾驶员气囊、前排侧气囊、后排侧气囊、膝部气囊、安全气帘等等…

7、Qt--QLabel使用小记

前言&#xff1a;QLabel作为QT中基础的控件&#xff0c;功能简单使用方便频繁&#xff0c;主要用于显示文本、图片等信息。笔者这里记录下一些开发使用心路&#xff0c;方便小白快速入手。 一、添加背景图片 首先需要在资源中添加好图片资源&#xff0c;图片资源的添加参考4.1…

工智能图像降噪软件 ON1 NoNoise AI 2024 for Mac激活版

ON1 NoNoise AI 2024 for Mac是一款专为Mac用户设计的先进人工智能图像降噪软件。其核心功能在于能够利用机器学习技术&#xff0c;快速并智能地消除图像中的噪点&#xff0c;无论是亮度噪点还是颜色噪点&#xff0c;都能得到显著的改善。 软件下载&#xff1a;ON1 NoNoise AI …

自定义协议:序列化与反序列化的深度解析与实践

⭐小白苦学IT的博客主页⭐ ⭐初学者必看&#xff1a;Linux操作系统入门⭐ ⭐代码仓库&#xff1a;Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 1.引言 协议是一种 "约定". socket api的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的. 如…

Java基于微信小程序的高校体育场管理小程序,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

什么是态势感知?

什么是态势感知&#xff1f; 同学&#xff0c;听说过态势感知吗&#xff1f;啥&#xff1f;不知道&#xff1f;不知道很正常&#xff0c;因为态势感知是一个比较小众、比较神秘的概念。为什么态势感知很神秘&#xff0c;首先是因为这是来自军事情报领域的概念&#xff0c;然后…

python与设计模式之工厂模式的那些事儿

一、工厂模式 工厂模式实现了按需创建的最佳模式&#xff0c;其目的是为了隐藏创建类的细节与过程&#xff0c;通过一个统一的接口来创建所需的对象。 话说没了皇位争夺权的皇三接到了一个外征的工作&#xff0c;始皇给了5个亿的经费让皇三组建一个军队。打权总是要进行武器采…

测试用例的编写评审

1、什么叫软件测试用例 什么是测试用例 测试用例(TestCase) 是为项目需求而编制的一组测试输入、执行条件 以及预期结果&#xff0c;以便测试某个程序是否满足客户需求。–测试依据 可以总结为:每一个测试点的数据设计和步骤设计。–测试用例 2、测试用例的重要性(了解) 2.1…

从IoTDB的发展回顾时序数据库演进史

面向工业物联网时代&#xff0c;以 IoTDB 为代表的时序数据库加速发展。 时序数据的主要产生来源之一是设备与传感器&#xff0c;具有监测点多、采样频率高、存储数据量大等多类不同于其他数据类型的特性&#xff0c;从而导致数据库在实现高通量写入、存储成本、实时查询等多个…

【数学建模】2024认证杯C题完整思路和代码论文解析

经过不懈的努力&#xff0c;2024认证杯数学建模C题的完整论文和代码已完成&#xff0c;代码为A题全部4问的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立与求解、问题2模型的建立与求解、问题3模型的建…

Rockchip Android13 Vold(一):Native层

一:概述 Vold全称Volume Daemon是用于管理存储类设备的守护进程,负责接收驱动层设备挂载和卸载消息以及与Framework层之间的通信。Vold作为一个守护进程位于Android的Native Daemons层。 二:Vold框架图 三:Vold Sevice Android13的init.rc位于/system/etc/init/hw/其中使…

域名网络、

http://www.localhost:8080/hello http://127.0.0.1:8080/hello 一般在本机的C:\Windows\System32\drivers\etc的host文件里都有 在这个hosts配置文件中有一个127.0.0.1和默认的用户名locahost&#xff0c;在tomcat启动后输入的地址就是localhost端口号&#xff0c;默认的…

跟bug较劲的第n天,undefined === undefined

前情提要 场景复现 看到这张图片&#xff0c;有的同学也许不知道这个冷知识&#xff0c;分享一下&#xff0c;是因为我在开发过程中踩到的坑&#xff0c;花了三小时排查出问题的原因在这&#xff0c;你们说值不值。。。 我分享下我是怎么碰到的这个问题&#xff0c;下面看代码…

可视化大屏的应用(12):在智慧制造中的十大价值

一、什么是智慧制造 智慧制造是指通过信息技术、物联网、人工智能等先进技术的应用&#xff0c;实现生产过程的数字化、网络化、智能化&#xff0c;从而提高生产效率、降低成本、提高产品质量和灵活性的一种制造模式。 智慧制造的核心是将传统的制造过程与先进的信息技术相结合…