STM32H750外设ADC之MCU内部温度传感器

发布于:2024-04-23 ⋅ 阅读:(29) ⋅ 点赞:(0)

目录

概述

1. 内部温度传感器

1.1 功能介绍

1.2 读取温度方法

1.3 计算温度值

2 STM32Cube生成工程

2.1 配置参数

2.2 生成工程文件 

3 功能实现 

3.1 初始化ADC

3.2 功能函数

4 测试 


代码下载地址:

stm32-h750-proj-ADC-Read-temp资源-CSDN文库

概述

本文主要介绍关于使用STM32H750外设ADC读取MCU内部温度传感器的方法,文中首先介绍STM32H750内部温度传感器的读取原理,实现方法。并使STM32Cube工具设计一个工程,以实现读取温度数据的功能。

1. 内部温度传感器

1.1 功能介绍

温度传感器可测量器件的结温 (TJ),温度范围为 -40 °C 到 125 °C。温度传感器内部连接到 ADC3 VINP[18] 输入通道,该通道用于将传感器输出电压转换为数字值。温度传感器模拟引脚的采样时间必须大于产品数据手册中指定的稳定时间。不使用时可将传感器置于掉电模式。

注意:必须将 VSENSEEN 位置 1 才能使能内部通道 ADC3 VINP[18] 的转换(温度传感器, VSENSE)。

ADC x 通用控制寄存器 (ADCx_CCR)( x=12 或 3)
ADC x common control register
偏移地址: 0x08(该偏移地址与主 ADC 基址 + 0x300 相关)
复位值: 0x0000 0000
ADC1 和 ADC2 由相同的接口控制,而 ADC3 单独控制。
 

位 23 VSENSEEN:温度传感器电压使能 (Temperature sensor voltage enable)
此位由软件置 1 和清零,用于控制 VSENSE 通道。
0:禁止温度传感器通道
1:使能温度传感器通道


注意:

仅当 ADC 已禁止时(ADCAL=0、 JADSTART=0、 ADSTART=0、 ADSTP=0、 ADDIS=0且 ADEN=0),才允许通过软件对此位执行写操作。
 

1.2 读取温度方法

读取温度数据的操作步骤如下:

step-1:   选择 ADC3 VINP[18] 输入通道(使用合适的采样时间)。
step-2:   设定合适的采样时间(请参见器件数据手册中的电气特性部分)。
step-3:    在 ADCx_CCR 寄存器中将 VSENSEEN 位置 1,以便将温度传感器从掉电模式中唤醒。
step-4:   开始 ADC 转换。
step-5:   读取 ADC 数据寄存器中生成的 VSENSE 数据

1.3 计算温度值

使用以下公式计算实际温度:

参数说明:

TS_CAL2 :是在 110°C 下获得的温度传感器校准值
TS_CAL1: 是在 30°C 下获得的温度传感器校准值
TS_DATA: 是由 ADC 转换得到的实际温度传感器输出值

2 STM32Cube生成工程

2.1 配置参数

1) 使能温度传感器功能

2)配置通道参数

3)ADC模块工作时钟配置

 

2.2 生成工程文件 

完成参数配置后,点击GENERATE生成项目工程,项目产生后,打开项目文件:

3 功能实现 

3.1 初始化ADC

在adc.c文件中,已经实现ADC通道的初始化,下面详细介绍每条语句的含义

代码45行: 使用ADC3实现AD转换功能

代码46行: 数据位为16bit

代码47行: 禁止扫描功能

代码48行: 单通道转换

代码49行: 禁止低功耗自动延迟特性

代码50行:  禁止不连续模式 

代码51行:  禁止不连续模式,此位无效

代码52行:使用连续转换模式

代码53行:采用软件触发 

代码54行:采用软件触发,此位无效

代码55行:数据存放在DR

代码56行: ADC转换溢出的话,覆盖ADC的数据寄存器 

代码57行: 数据不偏移

代码58行: 禁止过度采样

代码59行: 初始化ADC功能

代码66行:采样通道为ADC_CHANNEL_TEMPSENSOR

代码67行:采样序列里的第1个

代码68行:采样周期 

代码69行:单端输入

代码70行:无偏移

代码71行:无偏移的情况下,此参数忽略

代码72行:禁止有符号饱和 

代码73行: 初始化通道参数

3.2 功能函数

代码60行:启动ADC转换数据

代码61行:等待数据转换完成

代码62行:获取ADC转换的结果

代码63行:判断数据转换的状态

代码67行:计算实际温度值

代码72行:如果本次数据转换失败,关闭ADC,准备下次重新启动ADC

详尽代码如下:

void test_get_adc_tempvalue( void )
{
    uint16_t TS_CAL1;
    uint16_t TS_CAL2;
    HAL_StatusTypeDef status;
    uint32_t value;
    float conv_value;

    HAL_ADC_Start( &hadc3 );
    status = HAL_ADC_PollForConversion( &hadc3, 100);
    value = HAL_ADC_GetValue( &hadc3 );
    if( status == HAL_OK) 
    {
        TS_CAL1 = *(__IO uint16_t *)(0x1FF1E820);
        TS_CAL2 = *(__IO uint16_t *)(0x1FF1E840);
        conv_value = (110.0 - 30.0) * (value - TS_CAL1)/ (TS_CAL2 - TS_CAL1) + 30;  
        printf(" get conv_value: %04f \r\n", conv_value);
    }
    else
    {
       HAL_ADC_Stop( &hadc3 );
    }
}

4 测试 

编写完成代码后编译,下载代码至板卡,并在PC上打开终端工具,监控运行结果: