基于纳芯微 NST461-DQNR温度传感器芯片的设计完成本地温度和远程温度读取
该项目使用了NST461-DQNR,实现了本地温度和远程温度读取的设计,它的主要功能为:读取本地温度和远程温度,完成串口输出对应温度数据,并在串口软件上完成温度曲线图绘制。
标签
嵌入式系统
NST461-DQNR
STM32F103C8T6
本地温度和远程温度读取
勾结s
更新2025-12-02
10
KiCad文件
全屏

一、所选任务介绍

基础任务:

  • 使用NST461-DQNR制作电路模块和任意单片机,读取本地温度和远程温度。
  • 使用上述设计好的电路模块和任意单片机,完成串口输出对应温度数据,并在串口软件上完成温度曲线图绘制。

额外任务

  • 使用12指神探查看I2C的数据波形,与规格书的波形比较,并结合实际数据分析,完成报告书。

二、项目描述

本项目是一个基于STM32F103C8T6微控制器NST461-DQNR高精度数字温度传感器的温度监测系统。系统能够同时测量本地温度(芯片内部温度)和远程温度(通过外部晶体管测量),并通过串口实时输出温度数据,支持在FireWater等串口绘图软件上显示温度曲线。

系统架构

硬件组成

  • 主控制器:STM32F103C8T6(ARM Cortex-M3内核)
  • 温度传感器:NST461-DQNR(WQFN-10封装)
  • 通信接口:模拟I2C + USART串口
  • 电源:3.3V供电
  • 远程测温:外部NPN晶体管(如MMBT3904)

软件架构

  • 开发环境:Keil MDK 5 + STM32标准外设库
  • 通信协议:模拟I2C协议 + 自定义数据格式
  • 数据输出:FireWater兼容格式的串口数据

核心功能

1. 双通道温度监测

  • 本地温度:测量NST461芯片自身温度
  • 远程温度:通过外部晶体管测量远程目标温度
  • 高精度:0.0625°C分辨率
  • 宽范围:-40°C 到 +125°C

2. 智能温度管理

  • 可编程温度上下限报警
  • 传感器故障检测(开路/短路)
  • 数字滤波功能,抗干扰能力强
  • 自动串联电阻补偿

3. 实时数据输出

  • FireWater兼容格式:支持曲线图绘制
  • 多种数据格式:带标签格式和纯数据格式
  • 实时更新:每秒更新温度数据

技术特点

通信技术

  • 模拟I2C:软件模拟I2C时序,提高兼容性
  • 可配置地址:支持9种不同的I2C从机地址
  • 高速模式:支持最高3.2MHz通信速率
  • 超时保护:总线超时自动复位

精度保障

  • 高精度测量:本地±1°C,远程±1.2°C(-40~85°C)
  • 自动校准:支持n因子校正和偏移补偿
  • 噪声抑制:可编程数字滤波器
  • 热响应快:0.24秒热响应时间

低功耗设计

  • 工作电流:265μA(本地测量)
  • 待机模式:29μA
  • 关断模式:4μA
  • 电源范围:2.1V - 3.6V

三、芯片选型的硬件介绍

本项目采用的主要硬件及其简要介绍如下:

  1. NST461-DQNR(U1)
    这是一款QFN-10封装的集成芯片,NST461是一款远程温度传感器监视器,内置本地温度传感器。其远程温度传感器连接的晶体管通常是低成本的NPN或PNP类型晶体管或衬底热晶体管及二极管,这些器件是微控制器、微处理器或FPGA必不可少的组成部分。片上12bit的模数转换可以为本地和远程温度传感器提供高达0.0625℃的分辨率。
  2. BC807(Q1)
    一款PNP型小信号三极管,SOT-23封装,常用于开关、信号放大或电平转换。电路中通常用于控制或保护功能。
  3. 电阻(R1-R6)
    主要为10kΩ和1kΩ,0603封装。10kΩ多用于上拉、下拉或分压,1kΩ用于限流或信号调理。
  4. 电容(C1、C2)
    C1为100nF,C2为1nF,均为0603封装。C1一般用于电源去耦,C2用于信号滤波或噪声抑制。
  5. 连接器(H1)
    5Pin 2.54mm间距直插排针,用于外部信号或电源的输入输出,便于与主控板或其他模块连接。

1.png

硬件介绍电路图


方案框图 + 设计思路

方案框图

deepseek_mermaid_20251126_72025e.png

方案框图

设计思路

1. 核心设计理念

"精准监测 + 实时可视化 + 模块化架构"

  • 精准监测:利用NST461的高精度特性,实现0.0625°C分辨率的温度测量
  • 实时可视化:通过标准化的数据格式,支持FireWater等软件实时绘制温度曲线
  • 模块化架构:各功能模块独立,便于维护、调试和功能扩展

2. 硬件设计思路

传感器选型考量:

  • NST461优势
    • 同时支持本地和远程温度测量
    • 高精度(±1°C)和分辨率(0.0625°C)
    • 小封装(2mm×2mm WQFN),节省空间
    • 低成本远程测温方案(使用廉价晶体管)

主控选型考量:

  • STM32F103C8T6优势
    • 丰富的GPIO资源,支持模拟I2C
    • 足够的处理能力处理温度数据
    • 成本效益高,生态系统完善
    • 内置USART,便于串口通信

五、原理图、PCB设计

原理图设计要点

  1. 核心芯片(NST461-DQNR)连接
    • SCL(U1.9)、SDA(U1.8)分别通过R1、R2(10kΩ)上拉到VCC,并连接到H1.1、H1.2,实现I²C通信。
    • THM2(U1.7)通过R3(10kΩ)上拉到VCC,并连接到H1.3,用于信号输入。
    • D+(U1.2)、D-(U1.3)分别通过C2(1nF)滤波,并与R4、R5(1kΩ)及Q1(BC807)组成滤波读取远程温度电路。
    • THM(U1.4)通过R6(10kΩ)上拉到VCC。
  2. 三极管(Q1: BC807)应用
    • Q1基极(B)通过R5(1kΩ)与D-连接,发射极(E)通过R4(1kΩ)与D+连接,集电极(C)接地,实现读取远程温度
  3. 电源与去耦
    • C1(100nF)靠近U1电源引脚,做电源去耦,抑制高频干扰。
    • H1.4、H1.5为VCC和GND,供电及地线分布合理。
  4. 接口(H1)
    • 5Pin排针,分别为SCL、SDA、THM2、VCC、GND,便于与主控板连接。


1.png

原理图

PCB设计

  1. 布局原则
    • U1(NST461-DQNR)放置在板中心,外围元件(电阻、电容)紧贴相关引脚,减少走线长度。
    • Q1(BC807)靠近D+/D-信号线,便于信号调理。
    • H1接口靠近PCB边缘,便于外部连接。
  2. 走线与层次
    • 采用双面板设计,信号线与电源线分层布线,优先保证I²C、D+/D-等高速/敏感信号的完整性。
    • 电源与地线尽量宽,减少压降和噪声。
    • 关键信号(如I²C、D+/D-)避免与高噪声电源线平行走线,必要时加地线隔离。
  3. 去耦与滤波
    • C1(100nF)紧贴U1电源脚,C2(1nF)靠近D+/D-信号输入端。
    • 所有上拉电阻靠近芯片引脚,减少干扰。
  4. 焊盘与丝印
    • 采用0603封装,保证焊盘尺寸标准,便于贴片。
    • 关键元件丝印清晰,便于后期调试和维护。

2.png

PCB

image.png

实物模块图

六、软件介绍

软件流程图

image.png

软件流程图

调试软件说明

1. FireWater串口绘图软件

软件特点:

  • 实时数据绘图:支持多通道实时曲线显示
  • 数据格式灵活:支持带标签和纯数据格式
  • 配置简单:即插即用,无需复杂配置
  • 免费开源:完全免费使用

安装与配置:

  1. 下载安装
    • 从GitHub下载最新版本
    • 解压后直接运行可执行文件
  2. 基本配置
    串口设置:
    - 端口:选择对应的COM
    - 波特率:115200
    - 数据位:8
    - 停止位:1
    - 校验位:None
    - 流控制:None
  3. 数据格式配置
    • 带标签格式
      数据前缀:temperature:
      通道数量:2
    • 纯数据格式
      数据前缀:(留空)
      通道数量:2
  4. 曲线显示配置
    • 通道0:本地温度(蓝色曲线)
    • 通道1:远程温度(红色曲线)
    • X轴范围:自动调整或固定范围
    • Y轴范围:根据温度范围设置(如0-100°C)

关键代码说明

1. 主程序核心代码 (main.c)

#include "delay.h"
#include "sys.h"
#include "led.h"
#include "lcd_init.h"
#include "lcd.h"
#include "pic.h"
#include "nst461.h"
#include "usart.h"

int main(void)
{

float localTemp, remoteTemp;
// 系统初始化
// 使能AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
delay_init();
USART1_Init();
NST461_Init();
LED_Init();//LED初始化
LCD_Init();//LCD初始化
LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
LED=0;
// // 打印启动信息
// USART_Printf(USART1, "NST461 Temperature Monitor Started\r\n");
// USART_Printf(USART1, "Local Temp(C)\tRemote Temp(C)\r\n");
// USART_Printf(USART1, "--------------------------------\r\n");
while(1)
{
LCD_ShowChinese(30,0,"纳芯微",RED,WHITE,24,0);
LCD_ShowChinese(0,40,"本地",RED,WHITE,24,0);
LCD_ShowChinese(0,80,"远程",RED,WHITE,24,0);
LCD_ShowString(48,40,":",RED,WHITE,16,0);
LCD_ShowString(48,80,":",RED,WHITE,16,0);

// 读取本地温度
localTemp = NST461_ReadLocalTemperature();
// 读取远程温度
remoteTemp = NST461_ReadRemoteTemperature();

LCD_ShowFloatNum1(64,40,localTemp,4,RED,WHITE,24);
LCD_ShowFloatNum1(64,80,remoteTemp,4,RED,WHITE,24);
// 通过串口输出温度数据

USART_Printf(USART1, "temperature:%.2f,%.2f\n", localTemp, remoteTemp);
delay_ms(1000); // 每1秒读取一次
}
}

关键点说明

  • 系统初始化顺序:严格按照时钟→延时→串口→I2C→传感器的顺序
  • 数据格式:使用FireWater兼容的带标签格式
  • 采样频率:1秒间隔,平衡实时性和数据量

2. 温度读取核心代码 (nst461.c)

float NST461_ReadLocalTemperature(void)
{
int16_t rawTemp = ReadTemperatureRaw(REG_LOCAL_TEMP_HIGH, REG_LOCAL_TEMP_LOW);
return ConvertRawToTemperature(rawTemp);
}

static int16_t ReadTemperatureRaw(uint8_t tempHighReg, uint8_t tempLowReg)
{
uint8_t highByte, lowByte;
int16_t rawTemp;

// 读取温度高字节
highByte = SOFT_I2C_ReadRegByte(NST461_ADDR, tempHighReg);

// 读取温度低字节
lowByte = SOFT_I2C_ReadRegByte(NST461_ADDR, tempLowReg);

// 组合温度数据(12位有效数据)
rawTemp = (int16_t)((highByte << 8) | lowByte);
rawTemp = rawTemp >> 4; // 右移4位,得到12位有符号温度数据

return rawTemp;
}

static float ConvertRawToTemperature(int16_t rawTemp)
{
return rawTemp * 0.0625f; // 分辨率0.0625°C
}

关键点说明

  • 数据组合:将两个8位寄存器组合成16位数据
  • 位操作:右移4位提取12位有效温度数据
  • 精度转换:乘以0.0625转换为摄氏度值

3. I2C通信核心代码 (soft_i2c.c)

uint8_t SOFT_I2C_ReadRegByte(uint8_t devAddr, uint8_t regAddr)
{
uint8_t data;

// 1. 发送起始条件
SOFT_I2C_Start();

// 2. 发送设备地址(写模式)
SOFT_I2C_SendByte(devAddr << 1);
SOFT_I2C_WaitAck();

// 3. 发送寄存器地址
SOFT_I2C_SendByte(regAddr);
SOFT_I2C_WaitAck();

// 4. 发送重复起始条件
SOFT_I2C_Start();

// 5. 发送设备地址(读模式)
SOFT_I2C_SendByte((devAddr << 1) | 1);
SOFT_I2C_WaitAck();

// 6. 读取数据
data = SOFT_I2C_ReadByte();

// 7. 发送非应答
SOFT_I2C_NAck();

// 8. 发送停止条件
SOFT_I2C_Stop();

return data;
}

关键点说明

  • 标准I2C读时序:严格按照写地址→写寄存器→读地址→读数据的顺序
  • 应答机制:每个字节后检查应答信号
  • 错误处理:通过WaitAck函数检测通信错误

4. 串口通信核心代码 (usart.c)

void USART_Printf(USART_TypeDef* USARTx, char* format, ...)
{
char buffer[256];
va_list args;

va_start(args, format);
vsprintf(buffer, format, args);
va_end(args);

USART_SendString(USARTx, buffer);
}

void USART_SendString(USART_TypeDef* USARTx, char* str)
{
while (*str)
{
USART_SendChar(USARTx, *str++);
}
}

void USART_SendChar(USART_TypeDef* USARTx, char ch)
{
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
USART_SendData(USARTx, ch);
}

关键点说明

  • 格式化输出:支持printf风格的格式化字符串
  • 非阻塞发送:检查发送缓冲区状态,避免数据丢失
  • 缓冲区管理:使用256字节缓冲区,确保数据完整性

七、实物演示及说明

1. 模块实物外观

0740f6cf6200e43939f198ca4f207a0b.jpg

实物外观图
  • 正面:可见中心为QFN-10封装的NST461-DQNR芯片,周围分布有0603封装的电阻、电容。H1为5Pin排针接口,位于PCB一侧边缘,便于插拔连接。
  • 背面:一般为地层或部分过孔,若有丝印则标注元件位号,便于调试。
2. 接线与上电

步骤1:电源连接

  • DC12V面包板电源5V → STM32核心板5V输入
  • STM32 3.3V → NST461模块VCC
  • 所有模块GND连接在一起

步骤2:信号线连接

  • STM32 PB6 → NST461 SCL(黄色线)
  • STM32 PB7 → NST461 SDA(绿色线)
  • STM32 PA9 → USB转串口RX(白色线)
  • STM32 PA10 → USB转串口TX(灰色线)

步骤3:远程测温连接

  • NST461 D+ → 晶体管集电极
  • NST461 D- → 晶体管基极
  • 晶体管发射极 → GND

步骤4:调试接口

  • ST-Link连接STM32的SWD接口

结果展示

以下的实物温度展示图和我自己做的温湿度温度计误差在范围内,清晰展示出本地和远程的温度。

967bbe4beedb599444ea994d255829b8.jpg

实物温度展示图

以下的串口温度波形展示图清晰展示出一段时间内的本地和远程温度的变化状态波形。

串口.png

串口温度波形展示图

以下的I2C信号波形图展示图展示出SCL一个周期信号内SDA的数据值,读取温度传感器芯片内存寄存器的地址和数据。

I2C.png

I2C信号波形图

遇到的难点及解决方法

难点一:I2C通信时序控制

问题描述:初期使用硬件I2C时频繁出现通信失败,温度数据读取不稳定。

解决方法

  • 改用软件模拟I2C,精确控制SCL/SDA时序
  • 增加I2C超时检测和重试机制
  • 通过示波器验证时序参数,确保满足NST461要求
  • 优化延时函数,提高通信可靠性

难点二:温度数据格式解析

问题描述:读取的温度值异常,出现大幅度跳变或固定值。

解决方法

  • 深入研究数据手册,确认12位数据格式和符号位处理
  • 修正数据组合算法:(highByte << 8 | lowByte) >> 4
  • 添加原始数据打印功能,便于调试分析
  • 实现数据有效性验证,过滤异常读数

难点三:系统资源冲突

问题描述:SysTick中断处理函数重复定义导致编译错误。

解决方法

  • 统一中断处理函数位置,移除重复定义
  • 改用非中断方式的循环延时
  • 通过实际测试校准延时精度
  • 优化代码结构,避免资源竞争

难点四:FireWater软件兼容性

问题描述:串口数据无法被FireWater正确识别和绘图。

解决方法

  • 详细分析FireWater数据格式规范
  • 测试多种输出格式,选择最佳兼容方案
  • 确保数据格式严格符合"label:data1,data2\n"规范
  • 添加详细的启动提示信息,方便用户配置

难点五:测量精度保障

问题描述:远程温度测量存在较大误差和波动。

解决方法

  • 优化PCB布局,采用差分对布线远程测温线
  • 在D+/D-引脚添加滤波电容抑制噪声
  • 启用NST461内置的数字滤波功能
  • 通过软件算法实现数据平滑处理

难点六:硬件调试困难

问题描述:初期硬件故障定位困难,无法确定问题根源。

解决方法

  • 分模块测试,先验证STM32基本功能
  • 使用逻辑分析仪捕捉I2C通信波形
  • 添加丰富的调试信息输出
  • 制作测试夹具,便于信号测量

难点七:电源噪声干扰

问题描述:电源噪声影响传感器测量精度。

解决方法

  • 增加电源退耦电容,改善电源质量
  • 采用星型接地,减少地回路干扰
  • 分离模拟和数字电源
  • 优化PCB层叠结构,提供完整地平面

总结与收获

通过系统性地分析每个技术难点,从硬件设计、软件算法到系统调试多个层面寻找解决方案,最终成功构建了稳定可靠的温度监测系统。这个过程让我深刻认识到嵌入式开发需要硬件与软件的紧密配合,调试技巧和问题分析能力同样重要。每个难点的突破都加深了对系统工作原理的理解,为后续项目积累了宝贵经验。

九、心得体会

通过本次NST461温度监测系统的设计与实现,我深刻体会到理论与实践结合的重要性。最初在数据手册中理解的I2C时序,在实际调试中遇到了诸多挑战,特别是模拟I2C的时序控制需要反复调整。当首次在FireWater上看到平滑的温度曲线时,所有的调试艰辛都化为了成就感。

这个项目让我认识到,一个完整的嵌入式系统需要硬件设计、软件编程和调试技巧的完美配合。从STM32的GPIO配置到NST461的寄存器操作,每个细节都直接影响系统性能。特别是在PCB布局时,差分信号线的布线技巧对温度测量精度起到了关键作用。

这次经历不仅提升了我的技术能力,更培养了我解决复杂问题的系统思维。当温度数据稳定输出、曲线平滑变化时,我真正感受到了嵌入式开发的魅力所在。


附件下载
温度传感器.kicad_sch
原理图文件
温度传感器.kicad_pcb
PCB文件
代码.zip
代码文件
团队介绍
个人
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号