温度传感器调试(HDC1080,TMP275) |
您所在的位置:网站首页 › 松导温度传感器如何 › 温度传感器调试(HDC1080,TMP275) |
我们需要对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) 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 度。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |