一、任务介绍
本次的任务是使用压力传感器设计一款相关的测试项目,我们使用本次的相对压力传感器——NSPGD1M006DT04,主要实现的任务是通过这个传感器和任意单片机进行数字接口的数据通信,使用IIC的接口进行数据获取。这个传感器是防水的,我们可以记录不同水压的值并使用串口进行输出,压力值存储在24位的一个寄存器里面,读取之后进行相关系数的转化。在此期间,我们使用12指神探进行数字接口波形的查看,可以和规格书进行一下对比,看一下数据波形的采集情况。我们需要设计一下传感器版以实现接口的转化。
二、硬件介绍
本次活动的项目围绕着NSPGD1M006DT04压力传感器进行,整体的体积还是挺大,实物的如下
本次项目我们会接触的硬件主要包含如下内容:
NSPGD1M 是纳芯微针对家电医疗等市场推出的经过校准的表压传感器系列产品。该系列产品采用高性能信号调理芯片对MEMS 压阻芯体输出进行温度和压力的校准和补偿,保证性能和可靠性的同时对封装进行了集成,易于使用。NSPGD1M系列集成压力传感器可选量程为-10kPa-10kPa,带气嘴的DIP8 封装形式方便客户焊接和使用,适合于压力敏感元件结构材料相兼容的非腐蚀性气体的表压检测,特别适用于非接触式液位检测等领域,同时也适用于工业及物联网等领域。该系列支持模拟输出/I2C 数字输出以及特有的频率输出功能,应用更加灵活。本次提供的具挺型号是NSPGD1M006DT04,其测量的量程为0到6kpa,IIC数字接口。
本次核心的控制器件,我们选用的是ST官方的Nucleo开发版,其板载的ST link支持虚拟串口,我们可以通过其外设的连接,然后直接通过ST link的连接线进行数据的打印,这样我们就可以省掉一些连接线。ST的官方历程也是非常的全面使用初始化配置软件,可以快速进行外设配置。我们本次属于极限开发一下所以越简单越方便越好。
检测设备是带屏版的12指神探,主要是这款设备可以通过刷固定的固件变成一个逻辑分析仪为我们的扩展进行支持。化身为逻辑分析仪的12指神探,机屏幕会根据具体的引脚进行一定的指示,这就让我们可以很方便的选择对应的线路进行测量。
三、方案设计
设计思路
我们整体的设计思路就是围绕着传感器,首先需要设计的是传感器板,进行对应接口的引出,然后其他方面我们都是使用杜邦线进行快速链接,毕竟主控开发板和逻辑分析仪的引线都是杜邦线的接口。在实际测试方面,需要准备一定的容器来进行水压测试,这种底部带接口的容器主要还要防水。生活中并不多见,这里我们找了一个大容量点的注射器作为测试容器。
组成框图
我们看一下基本的组成框图,传感器板和主控板以及测试设备之间通过电气连接,传感器和测试容器之间通过空管连接:
四、原理图和PCB设计
原理图如下:
PCB绘制如下:
模块实物图如下:
五、软件设计
我们进行设计的前提就是我们传感器的数据手册需要在里面了解基本的寄存器的构成以及通信的基本控制模式。本次的数字接口在寄存器中也进行了详细的介绍,有一定的上升或者是下降方面的要求:
而数字接口主要也就是对内部寄存器的访问,下图我们可以看到,我们需要访问的寄存器的地址以及传感器对应的转化,本次测试的传感器正好是下图中用到的传感器,其AB值也给出了我们可以用这个公式去反推出我们实际的压力值:
接下来,我们根据上面的寄存器地址以及后面提供的一个驱动代码,转化一下单片机可用的驱动文件:
void NSPGD1M_Write_Byte(uint8_t REG,uint8_t data)
{
uint8_t SandData[2] = {0};
SandData[0] = REG;
SandData[1] = data;
HAL_I2C_Master_Transmit(&hi2c1,(I2C_ADDR << 1), SandData, 2, 1000);
}
void NSPGD1M_Read_Byte(uint8_t REG,uint8_t *data)
{
HAL_I2C_Master_Transmit(&hi2c1,(I2C_ADDR << 1), ®, 1, 1000);
HAL_I2C_Master_Receive(&hi2c1,(I2C_ADDR << 1), data, 1, 1000);
}
void NSPGD1M_Read_3Byte(uint8_t REG,uint8_t *data)
{
HAL_I2C_Master_Transmit(&hi2c1,(I2C_ADDR << 1), ®, 1, 1000);
HAL_I2C_Master_Receive(&hi2c1,(I2C_ADDR << 1), data, 3, 1000);
}
void NSPGD1M_Read_PreData(void)
{
uint8_t number = 25;
uint8_t CONFIG[3] = {0};
uint8_t Pdata[3] = {0};
uint32_t PCode = 0;
uint32_t data = 0;
NSPGD1M_Write_Byte(REG_CONFIG,0x0A);
for(uint8_t i = 0;i<number;i++)
{
NSPGD1M_Read_Byte(REG_CONFIG,CONFIG);
HAL_Delay(1);
if(CONFIG[0] == 0x02)
{
NSPGD1M_Read_3Byte(REG_DATA,Pdata);
PCode=(Pdata[0]*65536+Pdata[1]*256+Pdata[2]);
if (PCode >8388607)
data= PCode-16777216;
else
data= PCode;
NSPAD1MData = ((float)data/8388607-0.1)/0.13333;
break;
}
}
}
这也是我们本次项目设计或者是活动要求的最主要的内容,其他例如串口打印等等,主要是一个可视化的,一个直观的显示,最后的数据就是我们的一个float的数据,单位是kPa。
咱们用逻辑分析仪看一下,单次采集的命令数据:
首先发0x0A启动:
然后读取采集到的是0x02后就能读取24位数据了:
五、效果展示
整体的连接效果如下图:

下面是我们进行测试的不同水量的压力值:
无水的输出:
10ml的输出:
20ml的输出:
30ml的输出:
40ml的输出:
50ml的输出:
可以看到,在20毫升以后,每10毫升增加量的压力增加值基本上是差不多的,在最少的时候的量相对变化比较低,这个可能是管路的空气被压缩起到了一些缓冲,这个具体可能需要进一步的测试才能验证。
六、心得体会
本次活动实际上主要让我们对新器件进行一下体验,以我这次用的相对压力传感器来说,更多的是对传感器的驱动进行了解,性能方面的话只是进行了一些简单的验证,有一些力学方面的知识可能需要进一步的验证,活动可以让我们非常有效快速的了解相关的器件,感谢电子森林与纳芯微组织的本次活动,我这次参加的相对比较晚,所以设计的相对比较潦草一点,不过也可以对器件有了基本的了解,再次感谢活动的成功举办!