TMP100温度传感器

本文介绍了TI的TMP100温度传感器在尺寸受限且对功耗要求高的项目中的使用。该传感器采用SOT23-6封装,精度±1℃,工作电流仅为150uA。通过初始化为9bit并设置关断模式,实现了低功耗运行,待机功耗仅0.1uA。博主分享了初始化和读取温度的I2C代码,并指出实际测试中延时40ms即可正常采集12bit温度数据。 TMP100适用于IoT等对功耗敏感的场景。
摘要由CSDN通过智能技术生成

最近一个新项目,板子尺寸有限,对传感器功耗要求也高,之前用的插件是RW1820温度传感器,位置不够了,就换成立TMP100贴片式的SOT23-6封装,完整的料号是TMP100AQDBVRQ1,TI出品的。看了一下资料精度±1℃,实际测试差不多2℃的样子,不过一般测温项目够用了。
详细参数:
供电电压:2.7V~5V
接口类型:I2C
分辨率:9 bit to 12 bit
工作温度:-40℃~125℃
工作电流:150uA

操作频率:100 KHz /400KHz/3.4MHz


[size=14.0000pt]你如果需要低功耗的话,直接初始化为9bit,关断模式。关断模式就是采集转换一次温度数据之后,传感器自动进入cut down模式。
[size=13.3333px]uint8 TMP100_init(void)
[size=13.3333px]{
[size=13.3333px]    I2CStart();                             //启动I2C总线
[size=13.3333px]

[size=13.3333px]          I2CWriteByte(slaveaddr);                //发送从器件地址 90 写寄存器
[size=13.3333px]          if(I2CWaitACK()==0)                                 //从地址无响应
[size=13.3333px]          {
[size=13.3333px]                  return 0;
[size=13.3333px]          }                  
[size=13.3333px]          I2CWriteByte(0x01);                            //发送配置寄存器地址0x01
[size=13.3333px]          if(I2CWaitACK()==0)                                 //从地址无响应
[size=13.3333px]          {
[size=13.3333px]                  return 0;
[size=13.3333px]          }
[size=13.3333px]          I2CWriteByte(0x01);                                //写配置寄存器0x81????  0x01  设置为关断模式 读9bit
[size=13.3333px]          if(I2CWaitACK()==0)                                 //从地址无响应
[size=13.3333px]          {
[size=13.3333px]                  return 0;
[size=13.3333px]          }      
[size=13.3333px]          I2CStop();
[size=13.3333px]    return 1;
[size=13.3333px]}
然后每次读就转换一次,这样功耗是非常低的。
[size=13.3333px]uint8 Read_TMP100(void)
[size=13.3333px]{
[size=13.3333px]        volatile uint8 tempH,tempL;
[size=13.3333px]    uint8 i=0;
[size=13.3333px]    uint8 Tmp[2];
[size=13.3333px]     /*--设置温度探头寄存器--*/
[size=13.3333px]        I2CStart();                             //启动I2C总线
[size=13.3333px]

[size=13.3333px]          I2CWriteByte(slaveaddr);                //发送从器件地址 90 写寄存器
[size=13.3333px]          if(I2CWaitACK()==0)                                 //从地址无响应
[size=13.3333px]          {
[size=13.3333px]                  return 0;
[size=13.3333px]          }                  
[size=13.3333px]          I2CWriteByte(0x01);                            //发送配置寄存器地址0x01
[size=13.3333px]          if(I2CWaitACK()==0)                                 //从地址无响应
[size=13.3333px]          {
[size=13.3333px]                  return 0;
[size=13.3333px]          }
[size=13.3333px]          I2CWriteByte(0x81);                                //写配置寄存器0x81????  0x81  设置为读9bit
[size=13.3333px]          if(I2CWaitACK()==0)                                 //从地址无响应
[size=13.3333px]          {
[size=13.3333px]                  return 0;
[size=13.3333px]          }      
[size=13.3333px]          I2CStop();
[size=13.3333px]

[size=13.3333px]  /*--开始读取数据操作--*/
[size=13.3333px]          I2CStart();                             //启动I2C总线        
[size=13.3333px]          //I2CWriteByte(slaveaddr+1);              //发送从器件地址
[size=13.3333px]    I2CWriteByte(slaveaddr);                  //发送从器件地址
[size=13.3333px]          if(I2CWaitACK()==0)                                 //从地址无响应
[size=13.3333px]          {
[size=13.3333px]                  return 0;
[size=13.3333px]          }
[size=13.3333px]    I2CWriteByte(0x00);                      //读取温度寄存器
[size=13.3333px]          if(I2CWaitACK()==0)                                 //从地址无响应
[size=13.3333px]          {
[size=13.3333px]                  return 0;
[size=13.3333px]          }
[size=13.3333px]                        
[size=13.3333px]///**********************等待转换完毕**************************/         
[size=13.3333px]        DelayMCU_ms(40);
[size=13.3333px]         
[size=13.3333px]/***********************读取温度***************************/
[size=13.3333px]    I2CStart();
[size=13.3333px]   
[size=13.3333px]    I2CWriteByte(slaveaddr+1);                      //读取温度寄存器
[size=13.3333px]          if(I2CWaitACK()==0)                                 //从地址无响应
[size=13.3333px]          {
[size=13.3333px]                  return 0;
[size=13.3333px]          }
[size=13.3333px]          tempH = I2CReadByte();                                //读取温度高字节        
[size=13.3333px]          I2CSendAck();
[size=13.3333px]

[size=13.3333px]          tempL = I2CReadByte();                                //读取低字节        
[size=13.3333px]          I2CSendNoAck();         
[size=13.3333px]   
[size=13.3333px]          I2CStop();
[size=13.3333px]//    RealTemp = (int16)(((uint16)tempH<<8)+tempL);
[size=13.3333px]    RealTemp = (int16)(((uint16)tempH<<3)+((tempL>>7)*4));
[size=13.3333px]          return 1;
[size=13.3333px]}
9bit采集的话,主要就是0.5为一个采集间隔,按着这个传感器的精度,其实也差不多了。  [size=18.6667px]
待机功耗确实非常低,官方标称的0.1uA,确实是的,不需要另外加电源控制了。
 [size=10.5000pt]
[size=10.5000pt]

温度寄存器和温度计算方法。

对应的计算公式:

温度值= T11×27 + T10×26 +T9×25 +T8×24+T7×23+T6×22+T5×21+

T4×20+T3×2-1+T2×2-2+T1×2-3+T0×2-4

选择12 Bits 位精度时,有效位为T11~T0,最低位从T0开始,故分辨率为0.0625

选择11 Bits 位精度时,有效位为T11~T1,最低位从T1开始,故分辨率为0.125

选择10 Bits 位精度时,有效位为T11~T2,最低位从T2开始,故分辨率为0. 25

选择9 Bits 位精度时,有效位为T11~T3,最低位从T3开始,故分辨率为0.5

我这个项目使用的是9位数据,这样的转换时间是最短的。

实际测试我都是延时40ms,去采集12bit的温度,也是可以正常采集的。

IIC的程序我就暂时不贴了,如果有需要可以留言。现在流行IOT产品越来越多了,温度是一个常规的参数,这个传感器也是一个好选择。

在电路上,只需要在通讯线上接上拉电阻就行了,如下图:


---------------------
作者:laocuo1142
链接:https://bbs.21ic.com/icview-3067126-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值