一、项目介绍
任务介绍:
基础任务(必须完成):
使用NST461-DQNR制作电路模块和任意单片机,读取本地温度和远程温度。
使用上述设计好的电路模块和任意单片机,完成串口输出对应温度数据,并在串口软件上完成温度曲线图绘制。
额外任务(可完成全部额外任务,或者其中部分,也可以自行扩展):
使用12指神探查看I2C的数据波形,与规格书的波形比较,并结合实际数据分析,完成报告书。
本项目是使用了纳芯微的NST461传感器设计的快速验证板,使用STM32H533开发板进行软件开发,并搭配十二指神探逻辑分析仪进行数据追踪和调试。我们可以通过这个传感器快速验证板快速进行NST461传感器的驱动验证,同时通过串口进行NST461传感器温度数据的输出(本地和远程),根据一定的规则,可以在串口调试工具中进行温度数据的双线曲线绘制。
二、项目设计思路
整体的方案框图如下:

1、芯片选型

本次的任目标就是NST461,所以这个开发板就是对其的验证,根据外设要求进行的设计。NST461是一款远程温度传感器监视器,内置本地温度传感器。其远程温度传感器连接的晶体管通常是低成本的NPN或PNP类型晶体管或衬底热晶体管及二极管,这些器件是微控制器、微处理器或FPGA必不可少的组成部分。片上12bit的模数转换可以为本地和远程温度传感器提供高达0.0625℃的分辨率。NST461可兼容IC和 SMBus的接口,最多支持9个设备的可编程引脚地址,并具有可编程警报和SMBus重置功能。NST461包括了串联电阻消除、可编程非理想因子(n因子)、可编程的偏移量、可编程的温度限值、可编程数字滤波器、二极管故障检测和温度报警等功能,提高了输出精度与抗噪性,为热监测提供了可靠的解决方案。NST461的工作电压范围为2.1V至3.6 V,温度范围为-40℃至125℃,是通信、计算、仪表和工业等众多应用中多位置、高精度温度测量的理想选择。
2、板卡选型

主控我们选择的是常用的STM32H533开发板,主要是根据个人情况选择的最适合的主控单片机,相信大家也有不上选择这次任务里面的纳芯微开发板,也是完全没有问题的。个人来说对于STM32的应用更加丝滑一些,推荐使用自己擅长的开发板。
监控设备为十二指神探:

为了连接方便,我们使用了一个转接板使这些板子的IIC接口连载一起:

3、原理图绘制
我们原理图的绘制是根据数据手册的基本选择进行的,其中R3-R6为10K上拉,主要是IIC接口和报警输出接口;C2电容为0.1uf去耦电容;用到的PN结是8050三极管提供的。
模块的接口为IIC,使用的HY2.0的座。
4、PCB绘制与制板
原理图绘制好后就可以开始绘制PCB并制板了,本次任务实际上只用到了一个传感器,相对来说还是比较简单的,主要的PCB尺寸也是和之前任务保持了一直,整体模块还是挺小巧的,绘制好的PCB如下图:
5、焊接与调试
传感器模块小,传感器更加的小,普通的焊接手段是不行了,只能通过加热台的方式进行,非常有效。焊接好之后的首要任务需要验证一下是否存在短路情况,然后就是通过开发板先进行一下功能性验证,至少能进行基本的IIC沟通。
模块实物图:
三、关键代码及介绍
本次使用的传感器是NST461,其接口是IIC,同时串口需要进行输出发送,所以首先的任务是配置STM32CubeMX,使用的接口是IIC1和串口(串口使用的是BSP):
接下来就是IIC接口的适配传感器读写操作:
int NST461_Send_Data(uint8_t REG,uint8_t data)
{
uint8_t SandData[2] = {0};
int result;
SandData[0] = REG;
SandData[1] = data;
result = HAL_I2C_Master_Transmit(&hi2c1,(NST461_I2C_ADDR << 1), SandData, 2, 1000);
if (result!=HAL_OK)
return -1; //error
else
return 0; //Success
}
int NST461_Read_Data(uint8_t REG,uint8_t *data)
{
int result;
result = HAL_I2C_Master_Transmit(&hi2c1,(NST461_I2C_ADDR << 1), ®, 1, 1000);
result = HAL_I2C_Master_Receive(&hi2c1, (NST461_I2C_ADDR << 1), data, 1, 1000);
if (result!=HAL_OK)
return -1; //error
else
return 0; //Success
}
然后是传感器初始化以及读取温度的函数:
void NST461_Init(void)
{
NST461_Read_Data(NST461_REG_ID,&NST461.ID);
NST461_Read_Data(NST461_REG_CONVER_R,&NST461.ConRate);
// NST461_Send_Data(NST461_REG_REMOTEOFFSET_H,0x08);
// NST461_Send_Data(NST461_REG_REMOTEOFFSET_L,0xE0);
// NST461_Send_Data(NST461_REG_FACTOR,0x00);
NST461_Send_Data(NST461_REG_REMOTEOFFSET_H,0x00);
NST461_Send_Data(NST461_REG_REMOTEOFFSET_L,0x00);
NST461_Send_Data(NST461_REG_FACTOR,0x00);
}
uint16_t NST461_Read_TempData(uint8_t TempType)
{
uint8_t TempRegH = 0;
uint8_t TempRegL = 0;
uint8_t TempH = 0;
uint8_t TempL = 0;
uint16_t datat = 0;
if(TempType == NST461_TEMP_LOCAl)
{
TempRegH = NST461_REG_LOCAlTEMP_H;
TempRegL = NST461_REG_LOCAlTEMP_L;
}
else
{
TempRegH = NST461_REG_REMOTETEMP_H;
TempRegL = NST461_REG_REMOTETEMP_L;
}
NST461_Read_Data(TempRegH,&TempH);
NST461_Read_Data(TempRegL,&TempL);
datat = TempH;
datat = (datat<<4) | (TempL>>4);
datat = datat*10/16;//扩大十倍的温度(整数)
return datat;
}
最后在while中延时1s循环调用,同时串口打印:
while (1)
{
NST461.LocalTEMP = NST461_Read_TempData(NST461_TEMP_LOCAl);
printf("%d\n",NST461.LocalTEMP);
NST461.RemoteTEMP = NST461_Read_TempData(NST461_TEMP_REMOTE)-76;
printf("%d\n",NST461.RemoteTEMP);
printf("\r\n");
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
整体的软件流程图如下:
四、效果展示
1、整体调试系统的硬件连接图
本次使用了一个转接装置,把十二指逻辑分析仪和通信用的IIC接口进行连接,串口打印直接通过ST的开发板板载的调试器进行转发。
2、串口调试工具连续采集
3、串口调试工具绘制温度曲线
其中红色为本地温度数据,蓝色为外部温度数据,实际上是在一个板子上的,本地温度数据还是挺准的,毕竟是经过校准的,远程温度数据是随意找的一个三极管,利用它的PN节进行的连接,进行了一些线性调整,不过可以看到基本趋势是一样的。
4、十二指逻辑分析仪单次数据采集

5、在线调试转化的单次数据

五、遇到的难点及解决方法
本次遇到的主要问题是NST461的规格书中对应的本地温度低字节数据寄存器的地址前后不一致,导致本地温度读取的进度一直上不去,后来通过前辈们的指导才发现这个错误,修改后就正常了。
六、心得体会
本次在体验了纳芯微优秀的具有远程温度采集功能的NST461传感器之外,也体验了一把十二指逻辑分析仪的妙用,确实是非常的方便,以前都是通过示波器进行查看,或者就是纯靠运行不断调试,这次又有了一个新的利器。