中科银河芯GX0011脉冲式温度传感器,兼容LMT01、CT1721、NST1001,替代传统NTC热敏电阻

中科银河芯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;
}

四、注意事项

 1、DQ通信引脚必须加上拉电阻,建议1~10K,一般选择4.7K即可;

友情提示:

欢迎各位伙伴咨询、测试GX0011,有任何问题可随时交流沟通。 TEL : 13128272535。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
STM32微控制器中使用温度传感器通常涉及到I2C、SPI或其他接口来读取外部传感器的数据。以下是一个简化的示例,展示如何在STM32F103C8T6(假设使用的是CubeMX配置)上通过I2C连接一个常见温度传感器如DS18B20或LMT85,并读取其测量值: ```c #include "stm32f10x.h" #include "i2c.h" #include "ds18b20.h" // 假设是DS18B20库 // I2C初始化函数 void i2cInit(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; // ... (这里设置I2C的相关GPIO配置) // 初始化I2C I2C_DeInit(I2C1); // 假设使用I2C1 I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; // 配置为I2C模 I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; // 配置拉低电平时间 I2C_InitStructure.I2C_OwnAddress1 = 0x00; // 设置地址(取决于传感器) I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; // 应答模 I2C_InitStructure.I2C_AutoStart = I2C_AutoStart_Enable; I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable; I2C_InitStructure.I2C_DigitalFilter = I2C_DigitalFilter_Enable; HAL_I2C_Init(&hi2c1, &I2C_InitStructure); } // 读取温度传感器数据 float readTemperature(void) { uint16_t data; float temperature; // ... (这里设置I2C从设备地址和读取命令) HAL_I2C_Master_Transmit(&hi2c1, slave_address, data, 2,延时ms); // 延时可能根据具体协议调整 // ... (解析收到的16位数据,计算温度) temperature = ((data << 8) | data) * DS18B20_TO_CELSIUS_FACTOR; return temperature; } int main(void) { i2cInit(); while (1) { float temp = readTemperature(); printf("Temperature: %.2f°C\n", temp); } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值