第21章 STM32F4 内部温度传感器介绍

第二十一章 STM32F4 内部温度传感器介绍

1. STM32F4 内部温度传感器简介

STM32F4 有一个内部的温度传感器,可以用来测量 CPU 及周围的温度(TA)。该温度传感器在内部和 ADC1_IN16(STM32F40xx/F41xx 系列)或 ADC1_IN18(STM32F42xx/F43xx系列) 输入通道相连接,此通道把传感器输出的电压转换成数字值。 STM32F4 的内部温度传感器支持的温度范围为: -40~125 度。精度为±1.5℃左右。

STM32F4 内部温度传感器的使用很简单,只要设置一下内部 ADC,并激活其内部温度传感器通道就差不多了。关于 ADC 的设置,我们在上一章已经进行了详细的介绍,这里就不再多说。接下来我们介绍一下和温度传感器设置相关的 2 个地方。

第一个地方,我们要使用 STM32F4 的内部温度传感器,必须先激活 ADC 的内部通道,这里通过 ADC_CCR 的 TSVREFE 位(bit23)设置。设置该位为 1 则启用内部温度传感器。

第二个地方, STM32F407ZGT6 的内部温度传感器固定的连接在 ADC1 的通道 16 上,所以,我们在设置好 ADC1 之后只要读取通道 16 的值,就是温度传感器返回来的电压值了。根据这个值,我们就可以计算出当前温度。计算公式如下:

T(℃)={(Vsense - V25) /Avg_Slope}+25

上式中:

  • V25=Vsense 在 25 度时的数值(典型值为: 0.76)。

  • Avg_Slope=温度与 Vsense 曲线的平均斜率(单位为 mv/℃或 uv/℃)(典型值为2.5mV/℃)。

利用以上公式,我们就可以方便的计算出当前温度传感器的温度了。

2. 配置内部温度传感器基本步骤

2.1 设置ADC1,开启内部温度传感器

关于如何设置 ADC1,上一章已经介绍了,我们采用与上一章一样的设置。在 HAL 库中开启内部温度传感器,只需要将 ADC 通道改为 ADC_CHANNEL_TEMPSENSOR 即可,调用 HAL_ADC_ConfigChannel()函数配置通道的时候,会自动检测如果是温度传感器通道会在函数中设置 TSVREFE 位。

2.2 读取通道16的AD值,计算结果

在设置完之后,我们就可以读取温度传感器的电压值了,得到该值就可以用上面的公式计算温度值了。 具体方法跟上一讲是一样的。

以下是一个简单的示例代码,展示了如何配置和读取 STM32F4 内部温度传感器。

#include "main.h"

ADC_HandleTypeDef hadc1;
UART_HandleTypeDef huart1;

// 函数声明
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART1_UART_Init(void);

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_ADC1_Init();
    MX_USART1_UART_Init();

    while (1) {
        // 启动 ADC 转换
        HAL_ADC_Start(&hadc1);
        
        // 等待 ADC 转换完成
        HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
        
        // 读取 ADC 转换值
        uint32_t adcValue = HAL_ADC_GetValue(&hadc1);
        
        // 计算温度值,假设 Vref = 3.3V, 分辨率为 12 位
        // 此公式中的系数需要根据具体的传感器进行调整
        float voltage = (3.3f * adcValue) / 4095.0f;
        float temperature = (voltage - 0.76f) / 0.0025f + 25; // 0.76是offset, 0.0025是温度系数(°C/V)

        // 将温度值发送到串口
        char buffer[50];
        snprintf(buffer, sizeof(buffer), "Temperature: %.2f C\r\n", temperature);
        HAL_UART_Transmit(&huart1, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
        
        HAL_Delay(1000); // 延时1秒
    }
}

// ADC 初始化函数
static void MX_ADC1_Init(void) {
    ADC_ChannelConfTypeDef sConfig = {0};
    __HAL_RCC_ADC1_CLK_ENABLE();

    hadc1.Instance = ADC1;
    hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
    hadc1.Init.ContinuousConvMode = ENABLE;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
    HAL_ADC_Init(&hadc1);

    // 配置温度传感器通道
    sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; // 配置为温度传感器通道
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
    HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}

// 其余初始化函数省略,和前面的代码相同

posted @ 2024-10-14 09:22  hazy1k  阅读(11)  评论(0编辑  收藏  举报