NSPGD1M006DT04 测试模块

一、项目介绍

本项目使用表压传感器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秒;

修改库函数,多尝试问题就解决了。

==================================================

本项目是参考电子森林的活动项目,原始链接在 https://www.eetree.cn/project/4719

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注