在最近的一个新项目中,板材尺寸有限,传感器功耗要求高。以前使用的插件是RW如果1820温度传感器位置不够,则更换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); //发送配置寄存器地址x01[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] &bsp; 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所有,任何人未经允许禁止转载。