我们需要对100°C高温的金属进行温度测量。选择的传感器芯片是 HDC1080 和 TMP275。 HDC1080可以同时采集温湿度信息,但他主要是湿度传感器,老板说不用这个。于是最后我选择了单独的温度传感器 TMP275。
整个调试过程太辛苦了,在网上没能找到驱动代码,于是只能自己写。幸运的是,这个传感器芯片的驱动程序编写起来还算简单,最终成功的显示出了温度数值。内附 TMP275 I2C 驱动代码。
文章目录
- 1. 设计
- 1.1 选择温度传感器芯片
- 1.2 绘制驱动电路板
- 2. 调试
- 2.1 STM32 工程文件建立
- 2.2 TMP275 驱动思路
- 2.3 TMP275 核心驱动代码
- 2.4 TMP275 温度显示实验
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) 220msI2C2_SAND_BYTE(TMP275_WriteAddress,TMP275_ConfigRegister,buf[0]);uint8_t buf_UpperLimit[2];buf_UpperLimit[0] = 0x7F; //128°C --> 0111 1111 1111 0000buf_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 0000buf_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.4450tmp = buf[1] >> 4;Fraction = tmp & 0x0F;Fraction = Fraction * 0.0625; //精度:0.5 0.25 0.125 0.0625Temp = 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 度。