登录/注册

外部温度传感器stm32实验

外部温度传感器stm32实验

更多

以下是基于STM32的外部温度传感器实验步骤(以DS18B20为例),包含硬件连接、代码实现和关键注意事项:


1. 硬件连接

DS18B20引脚 STM32F103引脚
VDD (3.3V) 3.3V
GND GND
DQ (数据线) PA0 (或其他GPIO)
注意:DQ线需接4.7KΩ上拉电阻到VCC!

2. 代码实现 (HAL库 + 单总线协议)

(1) 微秒级延时函数

void delay_us(uint16_t us) {
    __HAL_TIM_SET_COUNTER(&htim1, 0);  // 假设使用TIM1
    while (__HAL_TIM_GET_COUNTER(&htim1) < us);
}

(2) DS18B20初始化

uint8_t DS18B20_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // 配置PA0为开漏输出
    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;  // 开漏模式
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 复位脉冲(拉低480us)
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
    delay_us(480);

    // 释放总线(拉高)
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
    delay_us(70);

    // 检测应答信号(传感器拉低60-240us)
    if (!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)) {
        delay_us(400);  // 等待复位完成
        return 1;       // 初始化成功
    }
    return 0;  // 初始化失败
}

(3) 写一位数据

void DS18B20_Write_Bit(uint8_t bit) {
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
    delay_us(bit ? 2 : 60);      // 写"1"时短时拉低,写"0"时保持60us
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
    delay_us(bit ? 60 : 2);      // 恢复时间
}

(4) 读一位数据

uint8_t DS18B20_Read_Bit(void) {
    uint8_t bit = 0;
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
    delay_us(2);  // 拉低2us
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
    delay_us(10); // 等待10us后采样
    bit = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
    delay_us(50); // 等待时隙结束
    return bit;
}

(5) 读取温度值

float DS18B20_Read_Temp(void) {
    uint8_t temp_l = 0, temp_h = 0;
    uint16_t temp_raw = 0;

    DS18B20_Init();               // 初始化总线
    DS18B20_Write_Byte(0xCC);     // 跳过ROM(单个传感器)
    DS18B20_Write_Byte(0x44);     // 启动温度转换
    HAL_Delay(750);               // 等待转换完成(12位精度)

    DS18B20_Init();
    DS18B20_Write_Byte(0xCC);
    DS18B20_Write_Byte(0xBE);     // 读取暂存器

    temp_l = DS18B20_Read_Byte(); // 读取低字节
    temp_h = DS18B20_Read_Byte(); // 读取高字节

    temp_raw = (temp_h << 8) | temp_l;
    return (float)temp_raw * 0.0625f;  // 转换为℃(精度0.0625)
}

3. 主函数调用

int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_TIM1_Init();  // 初始化定时器(用于delay_us)

    while (1) {
        float temp = DS18B20_Read_Temp();
        printf("Temperature: %.2f ℃\n", temp);  // 通过串口输出
        HAL_Delay(2000);  // 每2秒读取一次
    }
}

4. 关键注意事项

  1. 上拉电阻:DQ线必须接4.7KΩ上拉电阻!
  2. 时序精度:单总线协议对时序敏感,用示波器调试时序。
  3. 中断干扰:操作期间禁用中断(__disable_irq()/__enable_irq())。
  4. 电源模式
    • 寄生电源:DQ线供电,需强上拉(不推荐新手)。
    • 外部电源:VDD接3.3V(推荐)。
  5. 多传感器:需实现ROM搜索算法(需唯一64位地址)。

5. 实验结果

通过串口输出温度值:

Temperature: 25.50 ℃
Temperature: 26.12 ℃
...

可根据需求扩展功能:温度报警、多传感器网络、低功耗模式等。建议使用STM32CubeMX配置GPIO和定时器。

基于STM32U5片内温度传感器正确测算温度实战经验分享

STM32 在内部都集成了一个温度传感器,STM32U5 也不例外。这个

2024-02-22 17:27:36

如何通过STM32来读取外部数字温度传感器温度

STM32虽然内部自带了温度传感器,但是因为芯片温升较大等问题,与实际温度

2022-01-10 07:34:54

STM32内部温度传感器简介

实验概述文章目录实验概述一.概述二.实验平台(1)硬件平台ALIENTEK MiniS

2021-12-17 06:21:09

基于STM32单片机内部温度传感器实验使用库文件设计源代码

基于STM32单片机内部温度传感器实验使用库文件设计源代码

资料下载 木头1233 2023-04-26 14:41:28

STM32 DS18B20温度传感器实验(HAL库)

STM32学习记录:DS18B20温度传感器实验(HAL库)

资料下载 李名扬 2022-01-18 10:08:15

STM32 外部中断实验参考程序

STM32 外部中断实验程序,供STM32初学者参考。

资料下载 郑兵 2021-12-30 10:46:50

STM32的ADC采集内部温度传感器数据,并以DMA的方式传输

stm32 ADC测量内部温度传感器温度值,使用DMA方式传输,并通过串

资料下载 吴湛 2021-11-15 20:36:06

Arduino的实验例程之温度传感器DS18B20实验的资料详细说明

Arduino的实验例程之温度传感器DS18B20实验的资料详细说明

资料下载 佚名 2021-03-01 11:42:30

STM32内部温度传感器概述

记录一下,方便以后翻阅~主要内容:1)STM32内部温度传感器概述;2)相关实验

2021-12-10 06:11:04

STM32内部温度传感器简介

STM32 内部温度传感器1、 STM32 内部

2021-12-06 06:40:31

如何用ADC测量内部温度传感器温度

stm32 ADC测量内部温度传感器温度值,使用DMA方式传输,并通过串

2021-11-24 06:11:35

DS18B20温度传感器实验

STM32学习记录:DS18B20温度传感器实验(HAL库)

2021-08-18 07:44:51

STM32的内部温度传感器

实验目的STM32内部集成了一个温度传感器,可以用来测量芯片的

2021-08-12 06:40:58

光敏传感器实验原理

光敏传感器实验原理,STM32F103ZET6之光敏传感器

2021-08-05 07:34:41

关于stm32外部传感器程序

`大家好,本人刚刚学习stm32,程序也不是很熟,不过正在努力学习当中^_^。对于外部温度

2020-01-07 16:25:01
7天热门专题 换一换
相关标签