超、超、超小型温度传感器TMP118

1、特性

超小型,超薄 PicoStar™ 封装,尺寸:0.55 × 0.61 × 0.24mm

电源电压范围:1.4V 至 5.5V

16 位分辨率:0.0078125°C (LSB)

1.4μA 平均电流,1Hz 转换周期 -- 睡眠电流 65nA

I2C接口

2、引脚与封装

3、I2C地址

TMP118,不同的后缀,地址不同,本次测试的是TMP118B,所以I2C地址为0x49。

4、寄存器说明

寄存器也很简洁,只有8个寄存器,主要需要关注温度寄存器(0h)、配置寄存器(1h)、器件ID寄存器(Bh)。

读出来的数据是数字量,乘以0.0078125,就是实际测量的温度。

配置寄存器主要配置转换速率、平均使能位等,使用默认配置也可以。

器件ID是0x1180,可以用于检查设备是否在线,验证i2c通讯时序。

5、核心代码

寄存器、i2c地址、设备id等定义如下:

复制代码
#define TMP118_I2C_BUS        1 /* I2C总线 */

#define TMP118_I2C_ADDR       0x49      /* TTMP118B 0x49 */
#define TMP118_DEV_ID         0x1180    /* 器件ID */
#define TMP118_LSB_VAL        0.0078125 /* 分辨率 */

#define TMP118_REG_RES        0x00 /* 结果寄存器 */
#define TMP118_REG_CONF       0x01 /* 配置寄存器 */
#define TMP118_REG_LOW_LIMIT  0x02 /* 下限寄存器 */
#define TMP118_REG_HIGH_LIMIT 0x03 /* 上限寄存器 */
#define TMP118_REG_DEV_ID     0x0B /* ID寄存器 */

#define TMP118_REG_UNQ_ID0    0x0C /* 唯一ID寄存器0 */
#define TMP118_REG_UNQ_ID1    0x0D /* 唯一ID寄存器1 */
#define TMP118_REG_UNQ_ID2    0x0E /* 唯一ID寄存器2 */

/* TMP118_REG_CONF */
#define TMP118_ONE_SHOT       (1 << 15) /* 单次触发 */

/* 故障计数 */
/* 0:1个故障
   1:2个故障
   2:4个故障
   3:6个故障
*/
#define TMP118_FAULT_CNT(x)   (((x) & 0x3) << 11)

#define TMP118_ALERT_POLARITY (1 << 9) /* 极性为高电平有效 */
#define TMP118_SHUT_DOWN      (1 << 8) /* 关断模式 */

/* 转换速率 */
/* 0:0.25HZ
   1:1HZ
   2:4HZ
   3:8HZ
*/
#define TMP118_CON_RATE(x)    (((x) & 0x3) << 6)

/* 平均使能位 */
/* 0:无均值计算
   1:4次
   2:8次
   3:移动4次
*/
#define TMP118_AVE_CNT(x)     (((x) & 0x3) << 2)

读写函数实现如下:

复制代码
//tmp118读
static int tmp118_read(int bus, uint8_t reg, void *buff, int len) {
    int ret;

    /* 传输开始 */
    si2c_start(bus);

    /* 传输从设备地址以进行写操作 */
    if (si2c_select(bus, TMP118_I2C_ADDR, SI2C_OP_WRITE) != 0) {
        si2c_stop(bus);
        return 0;
    }

    /* 写设备地址 */
    if (si2c_tx(bus, &reg, sizeof(reg)) != sizeof(reg)) {
        si2c_stop(bus);
        return 0;
    }

    /* 传输开始 */
    si2c_start(bus);

    /* 传输从设备地址以进行读操作 */
    if (si2c_select(bus, TMP118_I2C_ADDR, SI2C_OP_READ) != 0) {
        si2c_stop(bus);
        return 0;
    }

    /* 接收数据 */
    ret = si2c_rx(bus, buff, len);

    /* 传输停止 */
    si2c_stop(bus);

    return ret;
}

//tmp118写
static int tmp118_write(int bus, uint8_t reg, void *buff, int len) {
    int ret;

    /* 传输开始 */
    si2c_start(bus);

    /* 传输从设备地址以进行写操作 */
    if (si2c_select(bus, TMP118_I2C_ADDR, SI2C_OP_WRITE) != 0) {
        si2c_stop(bus);
        return 0;
    }

    /* 写寄存器地址 */
    if (si2c_tx(bus, &reg, sizeof(reg)) != sizeof(reg)) {
        si2c_stop(bus);
        return 0;
    }

    /* 写数据 */
    ret = si2c_tx(bus, buff, len);

    /* 传输停止 */
    si2c_stop(bus);

    return ret;
}

读设备ID:

复制代码
static int tmp118_read_id(int bus) {
	uint8_t val_8[2];
    uint16_t val_16;

    tmp118_read(bus, TMP118_REG_DEV_ID, (uint8_t *)&val_8, 2);
	val_16=(val_8[0] << 8) + val_8[1];
    if (val_16  != TMP118_DEV_ID) {
        return -1;
    }
    return 0;
}

复位tmp118:

复制代码
static void tmp118_reset(int bus) {
    uint8_t val[2];

    val[0] = 0x00;
    val[1] = 0x06;

    si2c_start(bus);
    si2c_tx(bus, val, sizeof(val));
    si2c_stop(bus);
}

读温度,周期性调用即可:

复制代码
void tmp118_temp_read(void) {
    int8_t val[2];
    int    bus = TMP118_I2C_BUS;
    float temp;
    
    tmp118_read(bus, TMP118_REG_RES, (uint8_t *)&val, 2);
    temp = ((val[0] << 8) + val[1]) * TMP118_LSB_VAL;
	dbg_info("  %0.2f", temp);

}

初始化:

复制代码
 void tmp118_init(void) {
    uint8_t  val_8[2];
    uint16_t val_16 = 0;
    int      bus    = TMP118_DEV_START;

     si2c_init(bus); //i2c接口初始化

     tmp118_reset(bus);
     delay_ms(10);

     if (tmp118_read_id(bus)) {
		dbg_info("tmp118B %d err \r\n", bus);
        return;
     }
      
     tmp118_read(bus, TMP118_REG_CONF, &val_8, 2);
     val_16 = (val_8[0] << 8) + val_8[1];
     val_16 |= TMP118_CON_RATE(3); //配置转换速率
     val_8[0] = (val_16 >> 8) & 0xff;
     val_8[1] = (val_16 >> 0) & 0xff;
     tmp118_write(bus, TMP118_REG_CONF, &val_8, 2);

}

6、I2C驱动

可以看出TMP118对时序要求不高,在I2C标准模式下,支持1KHZ到100KHZ的速率。因此本文使用软件模拟I2C,抓取时序如下:

7、现象

实际测试的时候,接了3个tmp118,温度测量输出如下:

相关推荐
周周记笔记2 小时前
ESP32 初识:WiFi MCU 新时代与国产芯片生态(一)
单片机·嵌入式硬件
驴友花雕3 小时前
【花雕学编程】Arduino BLDC 之群体机器人协同探索
c++·单片机·嵌入式硬件·arduino bldc·群体机器人协同探索
驴友花雕3 小时前
【花雕学编程】Arduino BLDC 之仿人机器人膝关节稳定系统
c++·单片机·嵌入式硬件·arduino bldc·仿人机器人膝关节稳定系统
linweidong8 小时前
嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
stm32·单片机·算法
Zero_Era9 小时前
高性价比安全MCU——LKT6830C
单片机·嵌入式硬件·安全
国科安芯10 小时前
卫星通讯导航FPGA供电单元DCDC芯片ASP4644S2B可靠性分析
单片机·嵌入式硬件·fpga开发·架构·安全性测试
0欧姆10 小时前
I2C 驱动 --- 设备,AHT10
i2c·qnx·aht10·raspi
易水寒陈12 小时前
单片机实现的工厂模式
单片机
点灯小铭13 小时前
双积分AD转换电路
单片机·毕业设计·课程设计·期末大作业
youcans_13 小时前
【动手学STM32G4】(8)STM32G431之 DAC进阶
stm32·单片机·嵌入式硬件·dma·定时器