311|1

56

帖子

2

TA的资源

一粒金砂(高级)

【STM32 H533RE】测评六_官方自带温度传感器的尝试 [复制链接]

本帖最后由 Zhao_kar 于 2025-3-19 19:56 编辑

【STM32 H533RE】测评六_官方自带温度传感器的尝试

备注:这一篇算是头一次尝试单片机自带的温度传感器,其实常用的h7也有,但是一直没用过,所以这一篇就简单按照当初计划说的试一试

一、内部温度传感器描述

首先在看h5的资料图的时候可以看到如下

image.png  

明显可以看到,这个温度传感器是内置在adc里面的,应该是一个内部数字传感器,然后我们打开cubemx部分,在adc部分开一个通道,可以看到一个设置

image.png  

再了解如何操作之前,先看一下官方文档内容,然后我们在这个文档去找资料

image.png

打开之后是一个h5的文档,在目录里面我们可以看到adc相关配置里面有内置温度传感器的资料

image.png  

详细的步骤在文档里面都有,这里补一个通道数,明显是16通道

image.png  

然后再看一下官方的算法 image.png   基本了解之后就可以开始配置了。

二、cubemx部分

这部分比较简单,首先是打开传感器部分,像前面一样,然后是周期按照需求改

image.png  

然后串口老样子

image.png  

时钟树核实一下

image.png  

基本上cubemx就操作好了

三、写代码

我这边先给一个函数库,这部分有两种方法,第一种直接按照官方文档来写,第二种是去调用寄存器存的内容,我这边用的第一种,第二种用的人比较多,我这边只是简单测试,就不用了。

void Read_Internal_Temperature()
{
    HAL_ADC_Start(&hadc1);  
    if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) // 确保转换成功
    {
        uint32_t ADC_Value = HAL_ADC_GetValue(&hadc1);  
        printf("ADC1_IN16 ADC value: %d\r\n", ADC_Value);

        float Vol_Value = ADC_Value * (VREF / ADC_RESOLUTION);  
        printf("ADC1_IN16 VOL value: %.2fV\r\n", Vol_Value);

        float Temperature = (TS_CAL1_VOLTAGE - Vol_Value) / TS_SLOPE + TS_CAL1_TEMP;
        printf("MCU Internal Temperature: %.2f°C\r\n", Temperature);
    }
    else
    {
        printf("ADC conversion timeout!\r\n");
    }
    HAL_Delay(1000);  
}

把这部分函数写好,然后在主函数开头做一个宏定义

#define VREF 3.3
#define ADC_RESOLUTION 4096.0
#define TS_CAL1_TEMP 25.0
#define TS_CAL1_VOLTAGE 0.4
#define TS_SLOPE 0.01  // 传感器斜率

然后补充一点,配置这部分可以去adc里面看一下初始化的代码确认一下,也就是这部分

void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  ADC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */

  /** Common config
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc1.Init.LowPowerAutoWait = DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.SamplingMode = ADC_SAMPLING_MODE_NORMAL;
  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  hadc1.Init.OversamplingMode = DISABLE;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

做完这些之后就可以在while循环里面调用函数了,具体操作如下

    /* USER CODE BEGIN 3 */
//		HAL_ADC_Start(&hadc1);
//		HAL_ADC_PollForConversion(&hadc1, 50);
//		
//		ADC_Value = HAL_ADC_GetValue(&hadc1);	//读取ADC转换数据(16位数据)
//		TS_CAL1 = *(__IO uint16_t *)(0x1FF1E820);
//		TS_CAL2 = *(__IO uint16_t *)(0x1FF1E840);
//		ADC_Value = ((110.0f - 30.0f) / (TS_CAL2 - TS_CAL1)) * (ADC_Value - TS_CAL1) + 30.0f;
//		printf("%f\n",ADC_Value);
//		HAL_Delay(1000);
		Read_Internal_Temperature();
		HAL_Delay(1000);
  }
  /* USER CODE END 3 */

然后我这部分是之前测试的按照地址读的方法,不同的芯片地址不一样,这边也不去试第二种方法了。

接下来就可以把代码烧录,然后看一下串口调试助手打印的数据(摄氏度那个句号稍微有点问题,不过无伤大雅)

image.png  

然后我把板子稍微靠近灯带,温度也会上升

image.png  

经过简单测试,内置温度器明显精读不够高,不够也就是测试玩玩,后面会上个专门的ds18b20和aht温湿度传感器测试

此帖出自stm32/stm8论坛

最新回复

实际上就是一个热敏电阻     详情 回复 发表于 2025-3-19 22:41

回复
举报

7032

帖子

9

TA的资源

版主

实际上就是一个热敏电阻  

此帖出自stm32/stm8论坛
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引


回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 3

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表