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

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,有任何问题可随时沟通交流。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐