非接触式测温模块

JX90614 红外温度传感器 × STM32F103C8T6 HAL库开发

5V
工作电压
IIC
通信方式
-70~380°C
测温范围
0.01°C
分辨率
500ms
刷新间隔
↓ 向下滚动浏览

1传感器原理与功能

JX90614 非接触式红外温度传感器的工作原理、核心功能与引脚定义

1.1 工作原理

JX90614 是一款由精讯畅通研发并生产的无接触式红外线温度感应芯片,采用工业标准TO-39封装,在同一封装内整合了红外热电堆感应器(AMT0922)与信号处理芯片(NSA3300)。任何温度高于绝对零度(-273.15°C)的物体都会向外辐射红外能量,辐射能量的大小与物体表面温度遵循斯特藩-玻尔兹曼定律(Stefan-Boltzmann Law)。

传感器通过内部光学系统汇聚目标物体发出的红外辐射(滤光片可透过波长5.5~14µm的红外光,消除可见光和近红外光干扰),照射到热电堆感应器上产生微弱的温差电动势。信号处理芯片内部集成了低噪声仪表放大器PGA、24位Σ-ΔADC以及校准DSP算法,对采集数据进行线性化补偿和出厂校准,最终通过IIC协议输出数字化温度值。出厂校准覆盖-40~125°C环境温度及-70~380°C目标温度范围,在室温范围内精度达±0.2°C,人体温度范围(35~42°C)内精度可达±0.1°C,分辨率达0.01°C/LSB。

1.2 核心功能

🌡️

非接触测温

通过检测目标物体发出的红外辐射能量计算温度,无需物理接触,适用于运动部件、带电设备等场景。

⚡

高精度测量

集成了低噪声PGA和24位Σ-ΔADC,出厂已完成校准和线性化,分辨率达0.01°C/LSB,全温度范围精度1%,人体测温范围±0.1°C。

🔌

IIC数字接口

支持IIC和PWM两种数字输出方式(出厂设定为IIC),IIC最大频率400KHz,仅需SDA和SCL两根信号线,支持软件模拟驱动。

🌡️

宽量程应用

目标温度测量范围覆盖-70°C至+380°C,工作温度-40~125°C,可用于人体体温筛查、工业设备监控、家用电器温控等多种场景。

1.3 引脚定义

引脚名称功能STM32连接
1VDD电源输入端(底板供电5V,底板自带降压电路)5V
2GND接地端,同时连接金属封装GND
3SCLIIC时钟输入端(底板已自带上拉电阻)PB1(开漏输出)
4SDAIIC数据输入/输出端(底板已自带上拉电阻)PB0(开漏输出)

2模块外观展示

HB-T25 非接触式测温模块各角度实物照片与尺寸图

正面
模块正面
背面
模块背面
实物图1
实物图(一)
实物图2
实物图(二)
尺寸图
尺寸图

3原理图与PCB封装

模块电路原理图与PCB封装设计

原理图
电路原理图
PCB封装
PCB封装

4程序分析

基于 STM32F103C8T6 HAL库的 JX90614 驱动程序逐模块解析

4.1 系统时钟配置

使用外部高速晶振(HSE)8MHz,通过PLL倍频9倍获得72MHz系统时钟。APB1总线分频为36MHz,APB2总线保持72MHz。

Core/Src/main.c — SystemClock_Config()
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /* HSE 8MHz 外部晶振使能 */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;  // 8MHz × 9 = 72MHz
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /* SYSCLK = 72MHz, AHB = 72MHz, APB1 = 36MHz, APB2 = 72MHz */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                             |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;  // APB1 = 36MHz
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;  // APB2 = 72MHz

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

4.2 GPIO初始化

使能GPIOD和GPIOA时钟。GPIOA用于ADC通道(本工程中ADC已配置但未在主程序中使用),JX90614和OLED的引脚在其各自的驱动文件中单独初始化。

Core/Src/gpio.c — MX_GPIO_Init()
void MX_GPIO_Init(void)
{
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
}

4.3 JX90614 软件I2C初始化

使用软件模拟IIC通信,SCL接PB1,SDA接PB0,均配置为开漏输出模式(GPIO_MODE_OUTPUT_OD),高速频率。模块底板已自带SDA/SCL上拉电阻和5V降压电路,初始化后将两根线拉高释放总线即可正常通信。

HAL/JX90614/JX90614.c — JX90614_I2C_Init()
#define JX90614_W_SCL_Port  GPIOB
#define JX90614_W_SCL_Pin   GPIO_PIN_1   // SCL -> PB1
#define JX90614_W_SDA_Port  GPIOB
#define JX90614_W_SDA_Pin   GPIO_PIN_0   // SDA -> PB0

void JX90614_I2C_Init(void)
{
  JX90614_SCL_RCC_ENABLE();
  JX90614_SDA_RCC_ENABLE();

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* SCL: PB1, 开漏输出 */
  GPIO_InitStruct.Pin = JX90614_W_SCL_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(JX90614_W_SCL_Port, &GPIO_InitStruct);

  /* SDA: PB0, 开漏输出 */
  GPIO_InitStruct.Pin = JX90614_W_SDA_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(JX90614_W_SDA_Port, &GPIO_InitStruct);

  /* 释放总线 */
  JX90614_I2C_W_SCL(1);
  JX90614_I2C_W_SDA(1);
}

4.4 JX90614 传感器初始化

器件I2C通配7-bit地址为 0x7F(可通过寄存器0x92的Chip_Address配置)。初始化时先向命令寄存器 CMD(0x30) 写入 0x00 执行软复位,再写入 0x08 启动温度测量状态机。

HAL/JX90614/JX90614.c — JX90164_Init()
#define CMD               0x30    // 命令寄存器地址
#define JX90164_ADDRESS   0x7F    // 器件地址

void JX90164_Init(void)
{
  JX90614_I2C_Init();           // 初始化软件I2C引脚
  JX90164_WriteReg(CMD, 0x00);  // 软复位
  JX90164_WriteReg(CMD, 0x08);  // 启动测量状态机
}

4.5 温度数据读取与计算

芯片内部DSP通过TaCal(环境温度校准数据)和To1Cal(热电堆校准数据)计算输出最终目标温度值To。程序从 DATA1_MSB(0x10)、DATA1_CSB(0x11)、DATA1_LSB(0x12) 三个寄存器分别读取24位温度数据的高、中、低字节,拼接后除以 214(16384)再乘以10,得到放大10倍的温度值(便于OLED显示小数)。

HAL/JX90614/JX90614.c — JX90164_Get_T_Data()
#define DATA1_MSB  0x10   // 温度数据高字节
#define DATA1_CSB  0x11   // 温度数据中字节
#define DATA1_LSB  0x12   // 温度数据低字节

void JX90164_Get_T_Data(int32_t* Temp)
{
  uint8_t DataH, DataC, DataL;

  /* 分别读取三个字节 */
  DataH = JX90164_ReadReg(DATA1_MSB);
  DataC = JX90164_ReadReg(DATA1_CSB);
  DataL = JX90164_ReadReg(DATA1_LSB);

  /* 拼接为24位原始数据 */
  *Temp = (DataH << 16) | (DataC << 8) | DataL;

  /* 转换: 原始值 / 2^14 × 10 = 温度×10 */
  *Temp = *Temp / (pow(2, 14)) * 10;
}
温度计算公式
Traw = (DATA1_MSB << 16) | (DATA1_CSB << 8) | DATA1_LSB
T×10 = Traw ÷ 214 × 10 = Traw ÷ 16384 × 10
T实际 = T×10 ÷ 10.0   (°C)

例如:读取24位原始值 = 0x012C00(76800),则 T = 76800 ÷ 16384 × 10 = 46.8(×10),实际温度 = 46.8 ÷ 10 = 4.68°C

寄存器地址名称说明
0x10DATA1_MSB温度数据最高字节(Bits 23~16)
0x11DATA1_CSB温度数据中间字节(Bits 15~8)
0x12DATA1_LSB温度数据最低字节(Bits 7~0)
0x30CMD命令寄存器(软复位/启动测量)

4.6 OLED显示驱动

使用0.96寸OLED显示屏(128×64),软件I2C驱动,SCL接PB15,SDA接PB14,I2C地址0x78。OLED_CenterPrintf函数实现字符串居中显示。

HAL/OLED/OLED.c — OLED_CenterPrintf()
#define SCL_Port  GPIOB
#define SCL_Pin   GPIO_PIN_15   // OLED SCL -> PB15
#define SDA_Port  GPIOB
#define SDA_Pin   GPIO_PIN_14   // OLED SDA -> PB14

void OLED_CenterPrintf(int16_t Y, char *format, ...)
{
  char String[256];
  va_list arg;
  va_start(arg, format);
  vsprintf(String, format, arg);
  va_end(arg);
  // 居中显示: X = 64 - 字符串像素宽度/2
  OLED_ShowString(64 - strlen(String) * 8 / 2, Y, String, OLED_8X16);
}

4.7 主循环逻辑

使用 HAL_GetTick() 获取系统毫秒时间戳,每 500ms 读取一次温度数据,清屏后在OLED中央居中显示温度值(保留1位小数),最后更新时间戳。

Core/Src/main.c — main() while(1)
uint32_t Time_Now;   // 系统时间戳
int32_t temp;       // 温度值(×10)

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  OLED_Init();           // OLED初始化
  JX90164_Init();        // JX90614初始化

  while (1)
  {
    if (HAL_GetTick() - Time_Now >= 500)   // 500ms更新一次
    {
      JX90164_Get_T_Data(&temp);              // 读取温度

      OLED_Clear();                            // 清屏
      OLED_CenterPrintf(24, "%.1f°C", temp / 10.0);  // 居中显示
      OLED_Update();                           // 更新显示

      Time_Now = HAL_GetTick();               // 更新时间戳
    }
  }
}

5程序流程图

主程序执行流程,包含初始化序列与 while(1) 主循环

开始 HAL_Init() SystemClock_Config() MX_GPIO_Init() OLED_Init() JX90164_Init() while(1) HAL_GetTick() - Time_Now ≥ 500? 是 否 JX90164_Get_T_Data(&temp) OLED_Clear() OLED_CenterPrintf("%.1f°C", temp/10.0) OLED_Update() Time_Now = HAL_GetTick()

6交互式动画演示

模拟 JX90614 非接触式测温过程,调节目标温度观察传感器响应与OLED显示

传感器模拟

☕
目标物体
JX90614探头
36°C
点击"开始测量"启动传感器,拖动滑块调节目标物体温度,观察红外波传输与温度读数变化。传感器每500ms刷新一次读数。

OLED显示 & 数据仪表

--.-°C
JX90614 Ready
--.-
°C
DATA1_MSB
0x00
DATA1_CSB
0x00
DATA1_LSB
0x00