GXT110——专为人体测温优化的高精度数字温度传感器,可替代CT1711,附STM32程序
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,有任何问题可随时沟通交流。
作者:weixin_44250170