STM32-内部温度传感器实验

news2025/1/19 3:34:36

STM32内部是有温度传感器的,以F1为例,它的温度采集范围是-40度到125度,精度为正负2度,采样通道为ADC1_INI6,上电控制位为TSVREFE位。

温度计算方式为:T(摄氏度) = (V25 - Vsense) / Avg_Slope + 25,其中V25为25摄氏度时的Vsense数值,一般取1.43;Avg_slope为温度与Vsense曲线的平均斜率,一般取0.0043;Vsense是内部传感器采集到的电压值。(以F1为例)

实验要求:ADC1通道16采集芯片内部温度传感器的电压,将电压转算为温度后显示在液晶屏上。

我们通过下表可以知道DMA1通道1的外设对应的就是ADC1的读取。

 

首先确定我们的最小刻度,Vref = 3.3V,所以0V <= Vin <= 3.3V,所以最小刻度是3.3V / 4096(2^12)。

接下来确定转换时间。采样时间239.5个ADC时钟周期为例,可以得到转换时间为21us。

时间转换公式参考如下公式:Tcvtmin=(12.5+X)周期=(12.5 + X)/(12MHz)=21us。

 接下来编写实验代码:

先编写函数文件adc_t.c:

#include "./BSP/ADC_T/adc_t.h"

ADC_HandleTypeDef g_adc_handle;

void adc_temperature_init(void){

    ADC_ChannelConfTypeDef adc_ch_conf;
 
    g_adc_handle.Instance = ADC1;
    g_adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT; //右对齐
    g_adc_handle.Init.ScanConvMode = ADC_SCAN_DISABLE; //不扫描
    g_adc_handle.Init.ContinuousConvMode = DISABLE; //单次模式
    g_adc_handle.Init.NbrOfConversion = 1; //转换通道数为1,单通道
    g_adc_handle.Init.DiscontinuousConvMode = DISABLE; //不用间断模式
    g_adc_handle.Init.NbrOfDiscConversion = 0; //无间断模式则无间断通道
    g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START; //外部软件触发
 
    HAL_ADC_Init(&g_adc_handle);
    HAL_ADCEx_Calibration_Start(&g_adc_handle);
 
    adc_ch_conf.Channel = ADC_CHANNEL_1;
    adc_ch_conf.Rank = ADC_REGULAR_RANK_1; //转换顺序
    adc_ch_conf.SamplingTime = ADC_SMAPLINGTIME_239CYCLES_5; //设置为最大值
 
    HAL_ADC_ConfigChannel(&g_adc_handle, &adc_ch_conf);
}

void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc){

    if(hadc->Instance == ADC1){
        GPIO_InitTypeDef gpio_init_struct;
        RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
 
        __HAL_RCC_GPIOA_CLK_ENABLE();  //使能ADC时钟
        __HAL_RCC_ADC1_CLK_ENABLE();   //使能GPIO时钟
 
        gpio_init_struct.Pin = GPIO_PIN_1;
        gpio_init_struct.Mode = GPIO_MODE_ANALOG; //模拟模式
        HAL_GPIO_Init(GPIOA, &gpio_init_struct);
 
        adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC; //选择ADC外设时钟设置
        adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6; //选择6分频,72/6=12MHz
 
        HAL_RCCEx_PeriphCLKConfig(&adc_clk_init, &g_adc_handle);
    }
}

uint32_t adc_get_result(void){

    HAL_ADC_Start(&g_adc_handle);
    HAL_ADC_PollForConversion(&g_adc_handle, 10); //第二个参数比1大就行
    return (uint16_t)HAL_ADC_GetValue(&g_adc_handle);
}

short adc_get_temperature(void){
    uint32_t adcx;
    short result;
    double temperature;

    adcx = adc_get_result();
    temperature = adcx * (3.3 / 4096);
    temperature = (1.43 - temperature) / 0.0043 + 25;
    result = temperature *= 100;

    return result;
}

接下来编写函数头文件代码adc_t.h:

#ifndef __ADC_T_H
#define __ADC_T_H

#include "./SYSTEM/sys/sys.h"

void adc_temperature_init(void);
void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc);
uint32_t adc_get_result(void);
short adc_get_temperature(void);

#endif

接下来编写主函数代码main.c:

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./USMART/usmart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/ADC/adc.h"
#include "./BSP/ADC_T/adc_t.h"


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);
    }
}

到这里我们的函数代码就写完了。

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

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

相关文章

数据库管理-第七十六期 如何升级19c RAC(20230516)

数据库管理 2023-05-16 第七十六期 如何升级19c RAC1 回头处理2 升级AHF3 升级GI及DB3.1 拷贝所需文件3.2 升级OPatch3.3 升级GI与DB3.4 应用SQL变更 4 升级OJVM4.1 解压补丁4.2执行补丁冲突检查&#xff1a;4.3 升级OJVM4.4 应用SQL变更 5 最终验证总结 第七十六期 如何升级19…

NC 人力薪酬管理怎么结账?

NC 人力薪酬管理结账流程 1、先在【薪资发放】节点选择相应的薪资方案进行查询操作&#xff0c;然后进行计算操作&#xff1b; 2、计算操作完后&#xff0c;再进行审核操作&#xff1b; 3、如果薪资方案勾选了“发放数据需要审批”属性&#xff0c;则需要在【发放申请】节点…

【NB 2023】从一般蛋白质语言模型中高效进化人类抗体

Efficient evolution of human antibodies from general protein language models 哈佛大学化学与化学生物学系和圣路易斯华盛顿大学的研究人员共同完成的一篇论文&#xff0c;发表在Nature Biotechnology上。 抗体是一种大分子&#xff0c;属于免疫球蛋白家族&#xff0c;它…

springboot 启动后,调用接口时报错404问题汇总(层层推进、超全面)

线上环境 确保项目启动成功 看到这条日志才能判定项目是启动成功的 确保controller类被成功注册到了springboot容器中 首先&#xff0c;按springboot的类扫描规则来说&#xff0c;启动类和被扫描的组件类应该要在同一包下的 验证策略 从springboot容器中尝试去获取到contro…

【Springboot】yaml配置文件多环境切换

关于配置文件的详细说明可以看官方文档&#xff1a; 24. Externalized Configuration 以下是个人学习过程中的笔记&#xff0c;如有错误&#xff0c;请多指教&#xff01; 目录 &#xff08;一&#xff09;配置文件 &#xff08;二&#xff09;yaml的概述及基本使用 yaml基本…

TCP与UDP相关知识(详细)

目录 一、UDP 和 TCP 的特点与区别 二、UDP 与TCP 首部格式 三、TCP 的三次握手和四次挥手 四、TCP 短连接和长连接的区别 五、TCP粘包、拆包及解决办法 六、TCP 可靠传输 七、TCP 滑动窗口 八、TCP 流量控制 九、TCP 拥塞控制 十、提供网络利用率 一、UDP 和 TCP 的特…

yolov8 pycharm运行(predict,不用command line)

yolov8就不介绍了&#xff0c;见主页 这里说下用pycharm运行。 代码参考segment页 from ultralytics import YOLO# Load a model model YOLO(yolov8n-seg.pt) # load an official model# Predict with the model results model(test_img.jpg) # predict on an image不通过…

Cube Map 系列之:手把手教你 实现 环境光贴图

什么是环境光贴图 下面先看两个例子&#xff1a; 使用左侧的纹理 渲染茶壶&#xff0c;得到茶壶对真实空间的反射效果 同样使用左侧的纹理&#xff0c;得到中心的球对四周物体的反射效果 所以&#xff0c;环境光贴图指的是通过构建物体周围世界的纹理&#xff0c;使用纹理贴…

25的大学生转行学云计算,能拿到10k+的月薪,是真的吗?

25的大学生转行学云计算&#xff0c;能拿到10k的月薪&#xff0c;是真的吗&#xff1f; 对于IT行业来说&#xff0c;月薪上万并不少见&#xff0c;毕竟互联网常年占据行业薪资排行榜首。作为技术行业&#xff0c;由于其发展的前沿性&#xff0c;引导性&#xff0c;也是作为其他…

26-2 vue-router

原始的方式好多东西需要我们自己去写&#xff0c;vue-router是一个集成好了的路由包&#xff0c;vue-router 官网 Vue Router | Vue.js 的官方路由 并非原始的东西就不好&#xff0c;只要是包就可能存在版本兼容问题&#xff0c;如果是简单的需求就建议用原始的方法 目录 1 …

如何进行远程控制电脑

电脑在我们日常生活中的作用是非常大的&#xff0c;尤其是在信息时代地位非常高。 其中&#xff0c;最常见、最具代表性的功能是实现远程控制功能。它可以直接解决一些问题&#xff0c;而不需要去现场&#xff0c;在一定程度上提高了工作效率。但是有很多朋友不知道如何实现远…

边缘计算盒子有哪些?边缘计算应用场景

边缘计算&#xff08;Edge Computing&#xff09;是一种分布式计算模型&#xff0c;旨在将数据处理和计算功能从中心数据中心移到数据源附近的边缘设备上。它的目标是在接近数据生成的地方进行实时数据处理和分析&#xff0c;减少数据传输延迟和网络拥塞&#xff0c;提高应用程…

计算机图形学-GAMES101-2

Vectors向量 一、向量的介绍 表示一个方向。计算向量的方法&#xff1a;AB &#xff08;B-A&#xff09;。向量对应的单位向量 AB / ||AB|| 。向量具有平移性&#xff0c;我们不关心它的开始位置。向量求和&#xff1a;三角形法则和平行四边形法则。在代数上计算直接把向量的…

如何防止网站被黑客攻击?黑客是怎样炼成的?

现在的黑客网站可谓是多如牛毛&#xff0c;不管在哪里只要你愿意学&#xff0c;都可以学到一招半式。看过别人的个性签名:卖菜的王大妈是黑客&#xff0c;烤红薯的李大爷也是黑客&#xff0c;对面成人用品店的老板&#xff0c;挖日&#xff0c;还是黑客-_-~!..黑客还真多啊!!!据…

关于对自动化测试的理解:目的与本质!(新手必看)

其实自动化测试很好理解&#xff0c;由两部分组成&#xff0c;“自动化”和“测试”&#xff0c;所以我们要理解自动化测试&#xff0c;就必须理解“自动化”和“测试”&#xff0c;只有理解了这些概念&#xff0c;才能更轻松的做好的自动化测试。其中“自动化”可以想象成通过…

晶飞FLA5000光谱仪.FlaSpec格式解析批处理导出CSV文件

引言 首先说明下晶飞上位机软件存在的问题&#xff0c;实验所采用的FLA5000型号光谱仪&#xff0c;光谱波段从280-970nm&#xff0c;FWHM值为2.4nm。 1、上位机软件中的光谱数据复制功能基本是废的&#xff0c;最多只能到599.9nm&#xff0c;后面的数据全部消失。 2、上位机软…

2023系统分析师---软件工程、系统规划高频错题

系统规划---成本效益分析 评价信息系统经济效益常用的方法主要有成本效益分析法,投入产出分析法和价值工程方法。盈亏平衡法常用于销售定价; 可行性分析 系统规划是信息系统生命周期的第一个阶段,其任务是对企业的环境、目标以及现有系统的状况进行初步调查,根据企业目标…

示波器的数据处理怎么记录?

示波器的使用 - 记录和保存示波器测试结果 安泰测试为您分享如何记录示波器的数据。 "从您把示波器探头连接到器件的那一刻起&#xff0c;信号就开启了一次瞬间即可完成的重大旅程。它必须 跨过五个不同的“模块”&#xff0c;才能完成从器件到示波器&#xff0c;最后返回…

Vue电商项目--开发floor模块

获取floor组件mock数据 开发floor组件 在开发之前&#xff0c;说一下之前存在的一些小毛病 那就是在开发vue中还需要通过dom这种方式来操作元素吗&#xff1f; 我们用ref来做这个 我们先写api 然后去找仓库 getFloorList这个action在哪里触发&#xff0c;是需要在Home路由组件…

计算机组成原理硬件实验 - 计算机组成实验FAQ作业

一、 Quartus II 9.0 (32-Bit) 使用问题&#xff1a; Q1【示例】: 显示【未授权】或者【编译成功不能生成SOF文件】 A1&#xff1a; 在quartus中点击【TOOLS】→【license setup】,在license.DAT中修改“HOSTID”后的字段&#xff0c;设置为“你的电脑最新显卡ID” Q2【示例】…