GXT110——专为人体测温优化的高精度数字温度传感器,可替代CT1711,附STM32程序

GXT110——专为人体测温优化的高精度数字温度传感器,可替代CT1711,附STM32程序

  • GXT110传感器概述
  • 一、基本性能
  • 二、引脚说明
  • 三、参考电路
  • 四、温度读取
  • 1.通信说明
  • 2.读温流程
  • 五、驱动代码
  • GXT110传感器概述

    GXT110是一款专为人体测温优化的低成本、高精度数字式温度传感器,在30℃~45℃温度范围内具有小于 ± 0.1℃的测温误差,分辨率为16位(0.0078125℃)。

    一、基本性能

    • 专为人体测温优化
    • 测温精度:± 0.1°C(+30°C to +45°C)
    • 电源电压:1.6V ~ 5.5V
    • 工作温度:-55°C ~ +150°C
    • 转换电流:40μA
    • 待机电流:0.5μA
    • 分辨率:16位(0.0078125°C)
    • 通信接口:S-Wire

    二、引脚说明

    三、参考电路

    四、温度读取

    1.通信说明

    GXT110 采用了单线接口,仅使用单根信号线即可实现单个主机与多个从机之间的通信,最多可支持 16 个从机。单线上的所有从机都需要在适当的时机驱动信号线,因此必须以开漏输出的形式挂载到单线上。

    单线数据传输以时隙为单位,每次仅传 1 位数据。时隙由主机拉低单线启动,此时 GXT110 才能发送数据。时隙宽度≥65us ,相邻时隙间隔≥1us 。当传输1时从单线下降沿开始,GXT110 直接释放单线;当传输0时从单线下降沿开始,GXT110 拉低单线 15 – 60us 。主机需在数据有效时间(最短 15us)内的采样窗口接收数据,为最大化时序裕度,建议主机提前 1us 释放单线,延后 15us 采样。具体时序如下图所示。

    2.读温流程

    下面以读取单颗芯片温度为例进行介绍:

    1、主机发送启动脉冲(拉低单线并维持 480us~640us),控制GXT110启动温度转换;
    2、GXT110在温度转换期间会拉低总线,因此主机可以多次启动时隙,对转换情况进行轮询,直到主机读到连续两次结果为 1 ,表示GXT110转换完成;
    3、主机启动十六位时隙,读出最新的温度结果。

    温度结果为 16 位二进制补码,最低有效位代表 0.0078125℃。下表 列举了一些典型温度所对应的数字输出。

    五、驱动代码

    5.1 onewire110.c

    
    #include "onewire110.h"
    #include "delay.h"
    /*---------------------------------------------------------------------
      Function    : onewire_init
      Description : initialize 1-wire configuration
      Parameter   : none
      Return      : none
    ---------------------------------------------------------------------*/
    void gxt110_onewire_init(void)
    {	
      GPIO_InitTypeDef pin_cfg;
      RCC_APB2PeriphClockCmd(ONEWIRE_CLK, ENABLE);
      
      pin_cfg.GPIO_Pin   = ONEWIRE_PIN;
      pin_cfg.GPIO_Mode  = GPIO_Mode_Out_OD;	  // open-drain output
      pin_cfg.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(ONEWIRE_PORT, &pin_cfg);
      GPIO_SetBits(ONEWIRE_PORT, ONEWIRE_PIN);  // default HIGH
    }
    
    /*---------------------------------------------------------------------
      Function    : onewire_pulldown            
      Description : pull down the 1-wire bus
      Parameter   : none
      Return      : none
    ---------------------------------------------------------------------*/
    void gxt110_onewire_pulldown(void)
    {
      GPIO_ResetBits(ONEWIRE_PORT, ONEWIRE_PIN);
    }
    
    /*---------------------------------------------------------------------
      Function    : onewire_release            
      Description : release the 1-wire bus
      Parameter   : none
      Return      : none
    ---------------------------------------------------------------------*/
    void gxt110_onewire_release(void)
    {
      GPIO_SetBits(ONEWIRE_PORT, ONEWIRE_PIN);
    }
    
    /*---------------------------------------------------------------------
      Function    : onewire_receive
      Description : receive 1 bit of data from the bus
      Parameter   : none
      Return      : data received
    ---------------------------------------------------------------------*/
    uint8_t gxt110_onewire_receive(void)
    {
    	return GPIO_ReadInputDataBit(ONEWIRE_PORT, ONEWIRE_PIN);
    }
    
    /*---------------------------------------------------------------------
      Function    : onewire_reset             
      Description : transmit reset pulse
      Parameter   : none
      Return      : none
    ---------------------------------------------------------------------*/
    void gxt110_onewire_reset(void)
    {
    	gxt110_onewire_pulldown();
    	delay_ms(2);
    	gxt110_onewire_release();
        delay_us(100);
    }
    
    /*---------------------------------------------------------------------
      Function    : onewire_activate             
      Description : transmit activate pulse
      Parameter   : none
      Return      : none
    ---------------------------------------------------------------------*/
    void gxt110_onewire_activate(void)
    {
    	gxt110_onewire_pulldown();
    	delay_us(500);
    	gxt110_onewire_release();
        delay_us(100);
    }
    
    /*---------------------------------------------------------------------
      Function    : onewire_read_bit             
      Description : read one bit from the 1-wire bus
      Parameter   : none
      Return      : received bit
    ---------------------------------------------------------------------*/
    uint8_t gxt110_onewire_read_bit(void)
    {
      uint8_t rxd = 0;
      
    	gxt110_onewire_pulldown();	
    	delay_us(8);	// tRL
    	gxt110_onewire_release();
    	delay_us(7);	// tMSR - tRL
    	rxd = gxt110_onewire_receive();
    	delay_us(85);	// tSLOT - tMSR
        return rxd;
    }
    
    
    

    5.2 onewire110.h

    #ifndef __ONEWIRE_HEADER_FILE
    #define __ONEWIRE_HEADER_FILE
    
    // library reference
    #include "stdio.h"
    #include "stdint.h"
    #include "stm32f10x_gpio.h"
    #include "stm32f10x_rcc.h"
    
    #define ONEWIRE_CLK  RCC_APB2Periph_GPIOB 
    #define ONEWIRE_PORT GPIOB
    #define ONEWIRE_PIN  GPIO_Pin_7
    
    // function declaration
    void    gxt110_onewire_init       (void);
    void    gxt110_onewire_pulldown   (void);
    void    gxt110_onewire_release    (void);
    uint8_t gxt110_onewire_receive    (void);
    void    gxt110_onewire_reset      (void);
    void    gxt110_onewire_activate   (void);
    uint8_t gxt110_onewire_read_bit   (void);
    
    #endif
    
    

    5.3 gxt110.c

    #include "gxt110.h"
    #include "onewire110.h"
    #include "delay.h"
    /*---------------------------------------------------------------------
      Function    : gxt110_read_temp             
      Description : convert and read the temperature
      Parameter   : none
      Return      : received temperature
    ---------------------------------------------------------------------*/
    void gxt110_read_temp(void)    //读温函数
    {
      uint32_t dat = 0;
      uint8_t i;
      gxt110_onewire_activate();
      delay_ms(200); 
      // BUSY[1:0] -> TEMP[15:0] 
      for(i = 0; i < 18; i ++) {
        dat = dat << 1;
        dat = dat | ((gxt110_onewire_read_bit() == 0) ? 0x0000000000000000 : 0x0000000000000001);
      } 
      dat=(dat&0X0000FFFF); 
      if(dat&0x8000) 
      {
         dat=~(dat-1);
         printf("\r\ntemp=%f\r\n",-dat*0.0078125);
      }
      else printf("\r\ntemp=%f\r\n",dat*0.0078125);
    }
    

    5.4 gxt110.h

    #ifndef __GXT110_HEADER_FILE
    #define __GXT110_HEADER_FILE
    // library reference
    #include "stdio.h"
    #include "stdint.h"
    
    // function declaration
    void     gxt110_read_temp    (void);
    #endif
    

    欢迎各位伙伴咨询、测试GXT110,有任何问题可随时沟通交流。

    作者:weixin_44250170

    物联沃分享整理
    物联沃-IOTWORD物联网 » GXT110——专为人体测温优化的高精度数字温度传感器,可替代CT1711,附STM32程序

    发表回复