一、项目介绍
本项目使用表压传感器NSPGD1M006DT04,制作了一个模块,能够获得当前的气压。
很多年前,如果需要制作“吹气熄灯项目”,通常只能使用声音传感器,使用获取声音的方法来判断是否进行了吹气,显而易见这种方法要受到诸多影响。现在可以使用NSPGD1M006DT04 这种传感器来来完成。
二、项目设计思路
1、芯片选型
NSPGD1M006DT04是表压传感器。表压传感器(Gauge Pressure Sensor)是一种测量相对压力的传感器,即相对于大气压力的压力值。相对的还有绝压传感器(Absolute Pressure Sensor)是一种测量相对于真空或绝对零点的压力的传感器。与表压传感器不同,绝压传感器不仅测量被测介质的压力,还考虑到环境中的气压。绝压传感器的工作原理与表压传感器类似,但其参考点是绝对真空或绝对零点而不是大气压力。
2、测试主控选型
为了方便进行测试,选择使用 Arduino 来作为主控,它可以方便的实现 I2C 通讯,同时我们还会设计一个 Arduino 的库,方便日后的使用。
3、原理图绘制
作为模块,非常简单,严格按照Datasheet设计。下图是 DataSheet 中给出的参考:

据此设计的模块电路图:

4、PCB绘制与制板

5、焊接与调试
为了便于使用,焊接了 2.54mm 排母,方便插拔测试。


三、开发过程中遇到的问题与解决方式
为了方便的进行调试,我使用了一款国产开源逻辑分析仪:章鱼哥出品的 PX logic 逻辑分析仪

这款逻辑分析仪主打高速采集,性能指标如下:
•最大32通道逻辑分析仪
•buff模式最大支持8ch@1G,总带宽8G,存储深度4Gbits
•usb3.0下stream最大2ch@1G,总带宽2G,存储深度1024Gbits
•采样usb3.0进行传输,兼容usb2.0
•输入采样阈值0-6v可调
•开源解码协议库200+,使用python进行开发,可自行开发编写
硬件核心部分采用国产器件:
- USB3.0 Phy 采用南京沁恒微的WCH569W
- FPGA采用国产FPGA 紫光同创PGL22G
其中的 Buffer 模式意思是:内部自带了缓冲,可以将采集的信号直接传输存储在内部,存储多少数据取决于当前采样数量居和板载内存的大小;Stream的意思是随时将当前采样到的数据发送到电脑上,理论上只要你的电脑性能足够,可以不停的进行采样。
在动手之前首先在面包板上动手实验(NSPGD1M006DT04这种封装非常友好,便于实验)。这里无需额外的上拉I2C 即可工作

设置采样20秒,采样率5Mhz(I2C 400KHz, 相当于10倍采样率)
Buffer 模式,2V 阈值,只要2个通道即可抓取
解码器选择 I2C
指定0 通道是 SCL, 1通道是 SDA
接下来就可以抓到结果了:
四、实现结果展示


五、关键代码及说明
读取的代码数据需要和 Datasheet 上的 Demo 完成相同:
float NSPGD1M006DT04::readPressure() {
uint32_t PData;
_i2cPort->beginTransmission(_i2cAddress);
_i2cPort->write(0x30);
_i2cPort->write(0x0A);
_i2cPort->endTransmission(true);
int number = 0;
while (number < 50) {
number++;
delay(1);
//NSPGD1M006DT04_Read_Byte(0x30,Reg30);
_i2cPort->beginTransmission(_i2cAddress);
_i2cPort->write(0x30);
_i2cPort->endTransmission(false);
_i2cPort->requestFrom(_i2cAddress, 1, true);
if (_i2cPort->read() == 0x02) {
//NSPGD1M006DT04_Read_3Byte(0x06,PData);
_i2cPort->beginTransmission(_i2cAddress);
_i2cPort->write(0x06);
_i2cPort->endTransmission(false);
_i2cPort->requestFrom(_i2cAddress, 3, true);
PData = _i2cPort->read();
PData = (PData << 8) | _i2cPort->read();
PData = (PData << 8) | _i2cPort->read();
if (PData > 8388607) {
PData = PData - 16777216;
}
return (((float)PData) / 8388607 - 0.1) / 0.13333;
}
}
return 0.0;
}
取得的数值以 float 返回给调用者。
六、难点以及解决方法
在调试过程中,我发现根据文档要求,发送指令之后,一直会出现 I2C 的 NA ,无法取得设备的数据。搜索资料也无果,无奈之下继续研究Datasheet, 忽然发现它给出的例子是多次操作的,下面这一块发送 0x0A 之后,发0x30 然后尝试50次(之前上学的时候,英文会有改错的题目,其中一种不为人知的方法是将错误通过排版的方法,放在换行或者换页的地方,看到这里忽然让我想起来被这种题目支配的恐惧)

于是,我也修改代码多次读取,然后问题就解决了。总结下来之前碰到问题的原因是:
1. 为了便于调试,只尝试一次;
2. 代码中间隔2秒才进行一次尝试;
3. 我逻辑分析仪设置采样20秒,通常我也只会观察20秒;
修改库函数,多尝试问题就解决了。