中科银河芯GX0011脉冲式温度传感器,兼容LMT01、CT1721、NST1001,附STM32程序
一、资源说明
二、基本参数
三、参考驱动
四、注意事项
一、资源说明
GX0011 单线脉冲输出数字温度传感器支持计数式通信,仅需单根信号线即可同时完成芯片供电和通信输出功能,有效降低MCU开销和成本。中科银河芯自主研发设计的产品GX0011可直接替代NTC热敏电阻,无需任何外部感温单元即可实现12位(0.0625℃)温度输出,在-50°C~ +150°C的正常工作范围内,测温精度误差< ±1℃,并具有良好的温度线性度曲线,适用于通信、计算机、消费电子、环境、工业和仪器仪表等应用场景。
二、基本参数
三、参考驱动
1、GX0011引脚功能
2、GX0011单点应用
GX0011 支持两种连接方式:上拉连接和下拉连接。需要注意的是,当采用下拉连接时,脉冲将从 GND 引脚(即拉电阻侧)输出,且总线极性与上拉连接方式相反,上电时 GND 引脚为低电平,温度转换完成后 GND 引脚周期发送高脉冲(占空比 25%)。
在单点应用中,上位机 MCU 仅需要一个 GPIO 口来对脉冲次数进行计数,可以有效节省 GPIO 资源。单点应用参考电路如下:
3、 GX0011零待机功耗应用
零待机功耗应用方案占用两个 GPIO口。其中,GPIO0 用于脉冲计数,GPIO1 用于使能和关断 GX0011。当 GPIO1 拉高(下拉连接则为拉低),GX0011 使能并开始正常工作;当 GPIO 拉低(下拉连接则为拉高),芯片关断实现零待机功耗。
4、GX0011多点应用
在多点应用中,所有 GX0011 共享 GPIO0 作为脉冲计数端口,并且共用同一上下拉电阻。通过将 GPIO1 到GPIOn 中的一个拉低(下拉连接则为拉高)可以使能相应的 GX0011 测温节点。其余不用节点必须设置为高阻(或 两脚短接)状态。注意:如果同时使能两个及以上节点,相互之间会产生数据冲突。
5、GX0011脉冲通信时序
6、GX0011驱动程序(基于STM32)
6.1 GX0011.h
#ifndef _GX0011_H
#define _GX0011_H
#include "stm32f10x.h"
#include "delay.h"
#define GX0011_DQ PAin(0) //GX0011数据输入脚
void GX0011_Init(void);
void GET_TEMP_GX0011(void);
#endif
6.2 GX0011.c
#include "stm32f10x.h"
#include "GX0011.h"
#include "delay.h"
void GX0011_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 10000-1; //和此配置关系不大
TIM_TimeBaseStructure.TIM_Prescaler =(72-1);
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //下降沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x00; //不滤波
TIM_ICInit(TIM2, &TIM_ICInitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_CC1)!=RESET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1); //清除捕获中断标志
GX0011CNT = GX0011CNT + 1;
hightime = 0;
}
}
//*****本demo使用定时器捕获功能计数,也可以使用外部中断计数*****//
uint8_t hightime = 0; //高电平时间
uint16_t GX0011CNT = 0; //捕获GX0011脉冲的次数
void GET_TEMP_GX0011(void)
{
u32 _time=0;
GX0011CNT = 0;
hightime = 0;
TIM_Cmd(TIM2,ENABLE ); //使能定时器
TIM_ITConfig(TIM2,TIM_IT_CC1,ENABLE);
while(1) //等待转换结束
{
if(GX0011CNT > 0) break;
delay_us(1);
_time++;
if(_time>=500000) break;
}
while(1) //高电平持续时间大于50us则判断脉冲发送结束
{
if(GX0011_DQ) hightime++;
else hightime = 0;
if(hightime >= 50) break;
delay_us(1);
}
TIM_Cmd(TIM2,DISABLE ); //关闭定时器
TIM_ITConfig(TIM2,TIM_IT_CC1,DISABLE);
al_debug_log("脉冲数:%d",GX0011CNT);
if(GX0011CNT != 0)
g_sysconfig.gx0011 = GX0011CNT * 0.0625 - 50.0625;
else
g_sysconfig.gx0011 = 0;
}