前言:
我们在对任务进行了一定的了解的基础上,通过对器件资料的解读,选择纳芯微NST461作为本次活动的主要目标芯片。实际上其他芯片不管是压力传感器还是磁传感器都是挺不错的器件,资料也是非常全面的,很多纳芯微的器件的控制方式是大体一致的,我们可以通过单一器件的深入学习进一步了解工作模式和控制方法,会对我们以后使用纳芯微的器件有重大帮助。
一、任务介绍
1、项目描述
本项目的目标是使用NST461-DQNR温度传感器设计一款评估板,并通过单片机系统读取并处理温度数据。评估板将实现本地温度与远程温度的测量,通过串口输出温度数据,且能够在串口软件中绘制温度曲线图。项目包括了基础任务和额外任务,涵盖了传感器硬件设计、系统集成、数据处理和输出等多个方面。
项目的任务可分为以下几个主要部分:
电路模块设计:设计并搭建基于NST461-DQNR温度传感器的电路模块,确保温度传感器能够精准读取本地和远程温度,我们可以方便的进行数字接口的连接以及监测活动的进行;
单片机接口设计与温度数据处理:选择适当的单片机与温度传感器进行连接,处理传感器数据并通过串口进行数据传输,这里我们需要先行实现数据的读取在进行温度数据的关联。
温度曲线图绘制:通过串口软件对传感器采集到的温度数据进行实时显示,并绘制温度变化曲线,方便观察监测温度变化趋势。
额外任务(I2C波形分析):使用12指神探工具查看I2C的数据波形,并与传感器规格书中的波形进行比较,通过数据分析为传感器的性能提供反馈。
2、项目意义
本项目不仅涉及传感器硬件设计和单片机编程,还涵盖了数据传输与可视化分析等内容,这些工作有助于提高个人在硬件设计、嵌入式系统开发、编程调试等方面的综合能力。通过参与该项目,能够深入理解传感器的工作原理、信号处理及其与控制系统的集成,提高了个人的工程设计能力和解决问题的能力。此外,项目中的温度曲线图绘制与数据分析部分,能帮助个人在数据可视化和分析上获得更大的提升,对未来从事类似项目或研究提供了重要的技术积累。可以深入了解纳芯微的NST461-DQNR温度传感器及其技术优势。作为一种精确、可靠的温度传感器,NST461-DQNR不仅在性能上具有优越性,其在不同应用领域中的广泛适用性,也让我们更好地认识到纳芯微在传感器领域的技术积累与创新能力。这对未来在设计、研发和选择技术方案时,具有更高的决策支持和产品优化的潜力。
二、硬件介绍
本次项目我们会接触的硬件主要包含如下内容:
第一个就是我们本次项目的主角——NST461-DQNR,NST461是一款远程温度传感器监视器,内置本地温度传感器。其远程温度传感器连接的晶体管通常是低成本的NPN或PNP类型晶体管或衬底热晶体管及二极管,这些器件是微控制器、微处理器或FPGA必不可少的组成部分。片上12bit的模数转换可以为本地和远程温度传感器提供高达0.0625℃的分辨率。NST461可兼容 I2C 和 SMBus的接口,最多支持9个设备的可编程引脚地址,并具有可编程警报和SMBus重置功能。NST461包括了串联电阻消除、可编程非理想因子(η因子)、可编程的偏移量、可编程的温度限值、可编程数字滤波器、二极管故障检测和温度报警等功能,提高了输出精度与抗噪性,为热监测提供了可靠的解决方案。NST461的工作电压范围为2.1 V至3.6 V,温度范围为-40℃至125℃,是通信、计算、仪表和工业等众多应用中多位置、高精度温度测量的理想选择。
接下来使我们的主控系统,这里我们使用的是ST的开发板,NUCLEO-C071RB开发板带有板载STM32C071RB MCU。该板为用户提供了一种经济、灵活的方法,尝试新兴概念并创建原型。借助ARDUINO Uno V3连接支持和ST morpho排针,可通过各种专用扩展板轻松扩展STM32 Nucleo开放式开发平台的功能。
然后是我们的监测平台,带屏版的12指神探,配备了一块240*240分辨率的LCD彩屏以及两个可程控按键和一个拨轮,丰富了人机交互功能,方便信息观察、界面切换等使用方式。此外还配备了白色外壳,精心设计的包装不仅使板卡日常使用时更加美观也便于板卡的站立以及使用安全。实际上我们也可以用这个作为主控,不过只有一个,只能作为测试工具用了。
三、方案设计
1、设计思路
整体的设计思路是依据咱们使用的硬件决定的,双端温度采集模块将通过独立模块的方式存在,然后通过模块的设计方便与主控平台和测试平台同步连接,要尽可能的满足NST461的测试需求,实现双端温度采集的基本功能。
2、系统框图
主要展示项目的整体系统架构图,标明主要组件及其连接关系:
双端温度采集模块的接口主要是IIC,不管是主控平台还是监控平台都是通过串口传输的PC平台上进行监测的。
四、模块设计
本次的双端温度采集模块是基于纳芯微NST461进行的,主要设计的基本外设,比如接口器件的选择,地址的选择,测试接口的选择,远程温度接口的选择等等,具体的原理图如下:
在原理图设计中我们选用了PH2.0-4作为主要的控制接口,同时为了监测连接方便,我们将IIC的接口又通过2.54插针引出(这里主要是考虑十二指的外接接口便捷性),远程温度提供了板载三极管,同样支持远端接口的连接。
PCB绘制如下:
PCB设计主要考虑的是PCB的版型和走线,这里我们通过开槽的方式是远端温度采集感应器件进行了一下隔离,同时对各种引脚的引脚定义丝印的方式进行标明。
模块实物图如下:
系统整体的连接效果如下:
五、软件设计
1、硬件和软件接口的验证
到这里我们的硬件基本上都准备完毕了,接下来就是进行软件设计的时候,由于我们还没有具体实施软件设计,还需要进行一些基础的测试,比如IIC功能的实现,监测平台效果的调试等等的准备工作。
首先我们要实现的就是IIC通信的基础,我们这里选用的是寄存器参数比较固定的内容,比如:
通过尝试读取ID,我们可以实现整个硬件系统以及软件接口的测试,接下来我们使用STM32CubeMX创建我们的工程,根据功能需求的分析,实际上主要用到主控平台的功能是IIC接口和串口。
这个传感器的IIC地址是可以选择,这里我们通过实际的连接情况来选择,其中AI接到了VCC,A0接到了GND,我们可以通过跳线帽自由选择,确定地址的规则如下:
通过咱们的连接情况确定的IIC从机地址是0x4E;接下来我们读取ID数据,同时结合数据手册和检测平台的IIC波形进行对比分析,我们直接在初始化阶段进行读取,代码如下:
HAL_I2C_Master_Transmit(&hi2c1,(NST461_I2C_ADDR << 1), &ID_REG, 1, 1000);
HAL_I2C_Master_Receive(&hi2c1, (NST461_I2C_ADDR << 1), &ID_data, 1, 1000);
在线调试读取的数据如下(正确):
逻辑分析仪采集效果如下:
这里需要注意一下,我们配置的IIC的速率是100K,建议逻辑分析仪的采集速率不小于200K,300K以上效果会更好,这里我用的上位机是PulseView,其具有解码的能力,可以看到下面的数据直接就读出来了,IIC的过程一般是开始——设备写——寄存器地址——停止并开始——设备读——寄存器数据——停止,当然了不管是读还是写,在主发送后从机会有一个ACK的应答,从机发出后主机也要进行应答。通过逻辑分析仪就能能清晰看到这个过程了。这里我们算是已经实现了硬件以及软件接口的验证。
2、双端温度采集任务的软件实现
整体的温度数据上报流程如下:
我们这里就要开始进行软件功能的具体实现,这里我们主要配合串口调试功能进行软件实现,为了能够进行绘图功能查看趋势,需要满足一定条件,我们在设计串口数据上传的时候要满足:
主要涉及的是4个有关温度结果数据的采集,我们不需要太多的配置,使用的默认配置就可以,主要驱动配置代码如下:
void NST461_Read_LOCAlTempData(void)
{
uint8_t TempH = 0;
uint8_t TempL = 0;
REG = NST461_REG_REMOTETEMP_H;
HAL_I2C_Master_Transmit(&hi2c1,(NST461_I2C_ADDR << 1), ®, 1, 1000);
HAL_I2C_Master_Receive(&hi2c1, (NST461_I2C_ADDR << 1), &TempH, 1, 1000);
REG = NST461_REG_LOCAlTEMP_L;
HAL_I2C_Master_Transmit(&hi2c1,(NST461_I2C_ADDR << 1), ®, 1, 1000);
HAL_I2C_Master_Receive(&hi2c1, (NST461_I2C_ADDR << 1), &TempL, 1, 1000);
LocalTEMP = TempH;
LocalTEMP = (LocalTEMP<<4) | (TempL>>4);
LocalTEMP = LocalTEMP*100/16;
}
void NST461_Read_REMOTETempData(void)
{
uint8_t TempH = 0;
uint8_t TempL = 0;
REG = NST461_REG_LOCAlTEMP_H;
HAL_I2C_Master_Transmit(&hi2c1,(NST461_I2C_ADDR << 1), ®, 1, 1000);
HAL_I2C_Master_Receive(&hi2c1, (NST461_I2C_ADDR << 1), &TempH, 1, 1000);
REG = NST461_REG_REMOTETEMP_L;
HAL_I2C_Master_Transmit(&hi2c1,(NST461_I2C_ADDR << 1), ®, 1, 1000);
HAL_I2C_Master_Receive(&hi2c1, (NST461_I2C_ADDR << 1), &TempL, 1, 1000);
RemoteTEMP = TempH;
RemoteTEMP = (RemoteTEMP<<4) | (TempL>>4);
RemoteTEMP = RemoteTEMP*100/16;
}
循环采集代码如下:
while (1)
{
NST461_Read_LOCAlTempData();
printf("%d ",LocalTEMP);
NST461_Read_REMOTETempData();
printf("%d ",LocalTEMP);
printf("\r\n");
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
这个使我们直接读取的串口曲线,可以看到远端温度的数据和本地数据具有明显的差距,这里我们进行了一下处理,保留了温度数据的小数点两位,可以简单的看出来基本趋势是一样的,其中本地温度的PN结是纳芯微已经校准过的,可以看到红线采集的温度和实际温度基本相同,远程温度我们随意找的三极管PN结,相差的比较多了:
本地温度读取波形图如下:
远程温度读取波形图如下:
到这里我们需要一下温度修正以及最终的效果测试,远程温度偏差比较大,我们看了数据手册中有关修正的美容,有个偏差寄存器和系数调整,结果都是不理想,这个偏差给的是正偏差,也就是说最终结果是加上这个偏差,对于我们现在用的这个PN结是不适用的,那么只能用线性调整了,我们看到变化趋势是一致的,通过选取数据进行差值计算最后让两个温度接近(通过本地温度对远程温度进行校准)。只要在NST461_Read_REMOTETempData函数中直接对RemoteTEMP参数最后线性调整一下就可以,我们这里是减去了1300.
五、效果展示
我们在线调试IIC接口波形,100ms读取一起的间隔:

单次读取的测试:

双轨温度稳态曲线:

这里我们主要看一下曲线图,是变温测试曲线,由远端向本地温度传输,之后撤去温度开始下降,具体的讲解请参看视频:
六、总结
这次活动通过选取不同的传感器,我们可以接触很多不同类型的但是常用传感器,了解其基本的工作原理以及控制方法,可以对我们的工作和学习起到非常积极的作用,从数据手册的阅读开始,到模块的原理图设计再到最后的软件驱动,都是对个人非常好的锻炼,感谢本次活动的成功举办!