基于纳芯微NSPGD1M006DT04设计一个模块以及 Arduino 库
该项目使用了NSPGD1M006DT04,实现了模块以及Arduino库的设计,它的主要功能为:测量当前的气压。
标签
Arduino
I2C
PX logic 逻辑分析仪
Zoologsit
更新2025-12-02
24
KiCad文件
全屏

一、项目介绍

本项目使用表压传感器NSPGD1M006DT04,制作了一个模块,能够获得当前的气压。

很多年前,如果需要制作“吹气熄灯项目”,通常只能使用声音传感器,使用获取声音的方法来判断是否进行了吹气,显而易见这种方法要受到诸多影响。现在可以使用NSPGD1M006DT04 这种传感器来来完成。

二、项目设计思路

1、芯片选型

NSPGD1M006DT04是表压传感器。表压传感器(Gauge Pressure Sensor)是一种测量相对压力的传感器,即相对于大气压力的压力值。相对的还有绝压传感器(Absolute Pressure Sensor)是一种测量相对于真空或绝对零点的压力的传感器。与表压传感器不同,绝压传感器不仅测量被测介质的压力,还考虑到环境中的气压。绝压传感器的工作原理与表压传感器类似,但其参考点是绝对真空或绝对零点而不是大气压力。

2、测试主控选型

为了方便进行测试,选择使用 Arduino 来作为主控,它可以方便的实现 I2C 通讯,同时我们还会设计一个 Arduino 的库,方便日后的使用。

3、原理图绘制

作为模块,非常简单,严格按照Datasheet设计。下图是 DataSheet 中给出的参考:

image.png

据此设计的模块电路图:

image.png

4PCB绘制与制板

image.png

5、焊接与调试

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

image.png


image.png

三、开发过程中遇到的问题与解决方式

为了方便的进行调试,我使用了一款国产开源逻辑分析仪:章鱼哥出品的 PX logic 逻辑分析仪

image.png

这款逻辑分析仪主打高速采集,性能指标如下:

最大32通道逻辑分析仪

•buff模式最大支持8ch@1G,总带宽8G,存储深度4Gbits

•usb3.0stream最大2ch@1G,总带宽2G,存储深度1024Gbits

采样usb3.0进行传输,兼容usb2.0

输入采样阈值0-6v可调

开源解码协议库200+,使用python进行开发,可自行开发编写

硬件核心部分采用国产器件:

  • USB3.0 Phy 采用南京沁恒微的WCH569W
  • FPGA采用国产FPGA 紫光同创PGL22G

其中的 Buffer 模式意思是:内部自带了缓冲,可以将采集的信号直接传输存储在内部,存储多少数据取决于当前采样数量居和板载内存的大小;Stream的意思是随时将当前采样到的数据发送到电脑上,理论上只要你的电脑性能足够,可以不停的进行采样。

在动手之前首先在面包板上动手实验(NSPGD1M006DT04这种封装非常友好,便于实验)。这里无需额外的上拉I2C 即可工作


image.png

设置采样20秒,采样率5Mhz(I2C 400KHz, 相当于10倍采样率)

A screenshot of a graph

AI-generated content may be incorrect.

Buffer 模式,2V 阈值,只要2个通道即可抓取

A screenshot of a computer screen

AI-generated content may be incorrect.

解码器选择 I2C

A screenshot of a computer

AI-generated content may be incorrect.

指定0 通道是 SCL, 1通道是 SDA

A screenshot of a computer

AI-generated content may be incorrect.

接下来就可以抓到结果了:

A screenshot of a computer

AI-generated content may be incorrect.

四、实现结果展示


A screenshot of a computer screen

AI-generated content may be incorrect.

五、关键代码及说明

读取的代码数据需要和 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次(之前上学的时候,英文会有改错的题目,其中一种不为人知的方法是将错误通过排版的方法,放在换行或者换页的地方,看到这里忽然让我想起来被这种题目支配的恐惧)

image.png


于是,我也修改代码多次读取,然后问题就解决了。总结下来之前碰到问题的原因是:

1.      为了便于调试,只尝试一次;

2.      代码中间隔2秒才进行一次尝试;

3.      我逻辑分析仪设置采样20秒,通常我也只会观察20秒;

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



附件下载
NSPGD1Test.zip
Arduino库和一个测试程序
团队介绍
Lab-z.com
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号