温度传感器调试(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
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值