温度传感器调试(HDC1080,TMP275)

我们需要对100°C高温的金属进行温度测量。选择的传感器芯片HDC1080 和 TMP275。 HDC1080可以同时采集温湿度信息,但他主要是湿度传感器,老板说不用这个。于是最后我选择了单独的温度传感器 TMP275

整个调试过程太辛苦了,在网上没能找到驱动代码,于是只能自己写。幸运的是,这个传感器芯片的驱动程序编写起来还算简单,最终成功的显示出了温度数值。内附 TMP275 I2C 驱动代码。

1. 设计

1.1 选择温度传感器芯片

我在 TI公司官网 选择的数字温度传感器。本来想选择官网推荐的 TMP117,但是国内在线商城没卖的。于是,只能在在线商城(嘉立创商城)选择差不多的 现货温度传感器 ,最后选择了 TMP275.
在这里插入图片描述

1.2 绘制驱动电路板

参考 TMP275 的数据手册,获得驱动电路图。驱动电路图采用了 3 个 5KΩ 电阻和 1 个 0.01uF 电容。之后绘制 PCB 原理图和板子即可。
在这里插入图片描述
在这里插入图片描述

2. 调试

2.1 STM32 工程文件建立

找一个 STM32 的工程模板,确保里面涵盖了 I2C 的驱动程序即可。
在这里插入图片描述

2.2 TMP275 驱动思路

由于网上找不到驱动文件,或者要么就是要积分,要出钱的。被逼无奈,只能自己看 TMP275 的数据手册自己编写驱动程序。参考 数据手册 得到的驱动编写思路如下:

  • 初始化 I2C 接口
  • 配置 TM275 的 ConfigRegister 为 0x60
  • 配置 TM275 的 UpperLimit(温度上限寄存器)为 0x7FF0
  • 配置 TM275 的 LowerLimit(温度下限寄存器)为 0xC900
  • 读取 TM275 的 TempRegister 获取原始温度(16位值)
  • 温度换算
2.3 TMP275 核心驱动代码

不开源,对不起自己找不到驱动代码的心痛!

TMP275.c 如下:

#include "tmp275.h"
#include "sys.h"
#include "i2c.h"

void TMP275_Init(void){ 

	I2C_InitTypeDef  I2C_InitStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE); 

	GPIO_InitTypeDef  GPIO_InitStructure; 	
    GPIO_InitStructure.GPIO_Pin = TMP275_SCL | TMP275_SDA;                   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(TMP275_PORT, &GPIO_InitStructure);

	I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
	I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
	I2C_InitStructure.I2C_OwnAddress1 = TMP275_HostAddress; 
	I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
	
	I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; 
	I2C_InitStructure.I2C_ClockSpeed = TMP275_BusSpeed; 
	I2C_Init(I2C2,&I2C_InitStructure);
	I2C_Cmd(I2C2,ENABLE);

	TMP275_Config();
}

void TMP275_Config(void)
{

	uint8_t buf[1];
	buf[0] = 0x60; // R1:1 R2:1 -->  12 Bits (0.0625°C) 220ms
    I2C2_SAND_BYTE(TMP275_WriteAddress,TMP275_ConfigRegister,buf[0]);

    uint8_t buf_UpperLimit[2];
    buf_UpperLimit[0] = 0x7F; //128°C -->  0111 1111 1111 0000
    buf_UpperLimit[1] = 0xF0;
    I2C2_SAND_BUFFER(TMP275_WriteAddress,TMP275_UpperLimit,buf_UpperLimit,2);

    uint8_t buf_LowerLimit[2];
    buf_LowerLimit[0] = 0xC9; //-55°C --> 1100 1001 0000 0000
    buf_LowerLimit[1] = 0x00;
    I2C2_SAND_BUFFER(TMP275_WriteAddress,TMP275_LowerLimit,buf_LowerLimit,2);
 		
}

float TMP275_ReadTemp(void)
{
        float Temp;
        float Fraction;
        uint8_t tmp;
        uint8_t buf[2];
		
		I2C2_READ_BUFFER(TMP275_ReadAddress,TMP275_TempRegister,buf,2);

		Temp = buf[0];

        //参考:https://blog.csdn.net/zhangA/article/details/104137265?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164144519616781685371726%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=164144519616781685371726&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-7-104137265.nonecase&utm_term=%E6%B8%A9%E5%BA%A6%E6%8D%A2%E7%AE%97%E5%85%AC%E5%BC%8F&spm=1018.2226.3001.4450
        tmp = buf[1] >> 4;
        Fraction = tmp & 0x0F;
        Fraction = Fraction * 0.0625; //精度:0.5 0.25 0.125 0.0625

        Temp = Temp + Fraction;
    
		return Temp;
}

TMP275.h 如下:

#ifndef _TMP275_H
#define _TMP275_H

#include "sys.h"


#define TMP275_PORT	    	    GPIOB	//
#define TMP275_SCL		        GPIO_Pin_10	//
#define TMP275_SDA		        GPIO_Pin_11	//
#define TMP275_HostAddress	    0xd0	//0xc0   ->   0xd0. define which you like.
#define TMP275_BusSpeed	        100000	//

// get data address
#define TMP275_TempRegister          0x00
#define TMP275_ConfigRegister        0x01
#define TMP275_UpperLimit            0x02
#define TMP275_LowerLimit            0x03

#define TMP275_WriteAddress        0x90  
#define TMP275_ReadAddress         0x91  //A0 A1 A2 all connect to GND(0)


void TMP275_Init(void);
void TMP275_Config(void);
float TMP275_ReadTemp(void);

#endif

2.4 TMP275 温度显示实验

用 OLED 进行温度显示,效果还不错。但是由于芯片内部需要进行14bit的数据转换,数据手册上说至少需要220ms的时间,于是算上延时的时间,温度数据的更新相对较慢。最终显示效果如下: 我的大拇指温度在 31.625 度。

在这里插入图片描述

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HDC1080是一种具有高精度和低功耗的温湿度传感器,适用于许多应用场景。使用Arduino IDE配合HDC1080传感器可以轻松地采集环境温度和湿度数据。以下是具体的代码讲解: 第一步:导入库文件 使用Arduino IDE,需要先导入HDC1080库文件。 #include <Wire.h> #include "Adafruit_HDC1080.h" 以上代码导入了Wire库和Adafruit_HDC1080库,前者用于I2C通讯,后者是HDC1080库。 第二步:设置传感器 Adafruit_HDC1080 hdc = Adafruit_HDC1080(); 以上代码定义了一个Adafruit_HDC1080对象,用于操作HDC1080传感器。 void setup() { Serial.begin(9600); hdc.begin(); // 启动传感器 } 以上代码启动了串口通讯,并在setup()函数中调用begin()方法,开始使用HDC1080传感器。 第三步:读取温湿度数据 void loop() { float temp_hdc = hdc.readTemperature(); // 读取温度 float hum_hdc = hdc.readHumidity(); // 读取湿度 // 输出温湿度数据 Serial.print("Temperature = "); Serial.print(temp_hdc); Serial.print(" °C "); Serial.print("Humidity = "); Serial.print(hum_hdc); Serial.println(" %"); delay(2000); // 2秒后再次读取数据 } 以上代码在loop()函数中使用readTemperature()和readHumidity()方法读取温湿度数据,然后通过串口输出。 通过以上步骤,就可以使用HDC1080传感器采集环境温度和湿度数据了。需要注意的是,使用HDC1080库时,还可以设置一些参数,如温度和湿度的精度等。同时,HDC1080传感器也支持自动模式和手动模式,可以根据具体需求进行配置,实现更加灵活的数据采集。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值