STM32 DS18B20温度传感器

红尘紫陌 2024-08-27 ⋅ 15 阅读

简介

STM32 DS18B20温度传感器是一种数字温度传感器, 使用1-Wire总线协议进行通信。该传感器具有精确度高、稳定可靠以及体积小的特点,适用于各种温度监测应用。本文将介绍如何在STM32微控制器上使用DS18B20温度传感器。

硬件连接

首先,将DS18B20传感器与STM32微控制器进行连接。将传感器的VCC引脚连接到STM32的3.3V电源引脚,将传感器的GND引脚连接到STM32的地引脚,将传感器的DATA引脚连接到STM32的GPIO引脚。此外,需要在DATA引脚上使用一个4.7K欧姆的上拉电阻。

软件配置

接下来,在STM32的开发环境中进行软件配置。首先,需要启用相关的GPIO引脚作为输入模式,并使能对应的GPIO时钟。然后,配置GPIO引脚的上拉电阻。之后,在主程序中初始化1-Wire总线,并实现读取温度数值的函数。

读取温度数值

在代码中,需要实现一些1-Wire总线的函数,包括初始化总线、发送复位信号、发送读取指令、接收数据等。然后,通过这些函数可以读取DS18B20传感器返回的温度数值。将读取到的原始数据转换为实际温度值,可通过以下公式计算:

temperature = (raw_data_high << 8 | raw_data_low) * 0.0625;

示例代码

以下是一个使用STM32 HAL库的示例代码,实现读取DS18B20传感器温度的功能:

#include "main.h"
#include "ds18b20.h"

DS18B20_HandleTypeDef ds18b20;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    
    ds18b20.GPIO_Pin = GPIO_PIN_0;
    ds18b20.GPIOx = GPIOA;
    
    DS18B20_Init(&ds18b20);

    float temperature;
    
    while (1)
    {
        DS18B20_ReadTemperature(&ds18b20, &temperature);
        printf("Temperature: %.2f C\r\n", temperature);
        
        HAL_Delay(1000);
    }
}

void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
    __HAL_RCC_PWR_CLK_ENABLE();
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
    
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.LSIState = RCC_LSI_ON;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    RCC_OscInitStruct.LSIState = RCC_LSI_ON;
    
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.HSICalibrationValue = 16;
    
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;
    RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV4;
    
    HAL_RCC_OscConfig(&RCC_OscInitStruct);
  
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
  
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
  
    __HAL_RCC_GPIOA_CLK_ENABLE();
  
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
  
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
  
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

总结

通过本文,我们学习了如何在STM32微控制器上使用DS18B20温度传感器。可以根据实际需求进行相关的硬件连接和软件配置,并通过读取传感器的原始数据来获取温度数值。这为各种温度监测系统的设计和实施提供了便利。

希望以上内容对您有所帮助!如有任何问题或疑问,请随时留言。


全部评论: 0

    我有话说: