最近在手头一个穿戴设备项目里要用到防水气压计,选了ST的LPS28DFW。这颗料比较新,网上资料不多,中文应用笔记就更少了,踩了几个坑之后总算把数据稳定读出来了。想着应该有不少人也在选型或者调试这颗传感器,就把整个过程中涉及到的双重满量程配置、防水封装注意事项、软件驱动和常见问题整理成一篇应用笔记,给后面做方案的朋友省点时间。
LPS28DFW是意法半导体推出的一款绝对数字输出气压传感器,最大的两个卖点就是双重满量程和防水封装。简单说就是它既能当普通高度计用,也能在4个大气压以内当水深计用,而且封装本身针对冷凝、进水场景做了强化。它采用22位ADC,输出走I2C或SPI,支持中断和FIFO,整体功耗很低,非常适合手表、手环、潜水电脑、户外定位器这类由电池供电又对防水有硬性要求的设备。
1. 为什么选LPS28DFW:双重满量程与防水设计的底层逻辑
1.1 双重满量程解决了什么痛点
先说说双重满量程这个概念,因为这是选这颗料最核心的理由。
传统气压计一般只有一个量程,比如常见的BMP280是300-1100 hPa,MS5611是10-1200 mbar,基本都围绕海平面附近的大气压范围设计。用在无人机定高、室内定位、手机海拔计算这些场景没问题,但一旦涉及潜水或深水环境,这些传感器就会直接饱和,读数废掉。
LPS28DFW的全量程范围是260到4060 hPa,但这里的关键是它内部提供了两种测量模式。第一种模式下量程被限制在260-1260 hPa,分辨率做得非常高,适合做高度计;第二种模式放开到260-4060 hPa,专门应对水下或高压环境。这种设计不是简单地把同一个测量链路换个放大倍数,而是内部真的有两套增益和偏移校准参数,切换模式后精度表现差异很大。
我在实测中确认过,在低量程模式下,1260 hPa量程内分辨率可以达到约0.16 Pa,这对应的高度分辨率大约是1.3厘米左右,完全够消费级无人机定高使用。而切换到高压模式后,虽然单位压力对应的LSB变小了,但依然能在4060 hPa满量程范围内保持足够的绝对精度,用于水下10米、20米甚至30米的水深测量都还有余量。
这个设计等于用一颗芯片覆盖了两个完全不同的应用方向,硬件上不用再为了防水和压力量程来回换料。如果你做了水深相关的产品,一般防水等级要求高,而普通气压计封装不防水;如果用压力变送器那种工业级方案,体积和功耗又完全不是穿戴设备能接受的。LPS28DFW正好卡在这个中间地带。
1.2 防水封装不是“加了层胶水”那么简单
关于防水封装,很多人以为就是芯片外面涂了层三防漆或者加了点密封胶,实际上完全不是这么回事。
LPS28DFW的封装比较特殊,它的外壳采用了金属盖加内部凝胶填充的结构。光刻出来的压力传感器裸片在内部通过凝胶层与外部环境隔开,气体压力可以透过凝胶传递到感应膜片上,但液态水和腐蚀性物质进不去。这个结构在业内一般叫gel-filled package,是MEMS压力传感器做防水最主流的方案之一。
这里要强调一下,这个防水是针对传感器本体而言的。设计PCB时如果只是把LPS28DFW焊在板上,然后在传感器周围的透气孔旁边涂上红胶,那防水效果是会打折的。我在量产项目中遇到过一个问题——传感器本身确实是好的,但电路板是普通FR4,长期在潮湿环境下,水汽会从PCB的层间缝隙慢慢渗透,最后导致传感器焊盘氧化、读数漂移。所以真正的防水设计一定是“传感器防水封装 + PCB整体三防 + 结构件密封”三层配合,缺一环都不行。
另外有朋友问能不能用LPS28DFW直接泡在水里测水深,这个我建议动手前先看数据手册里关于防水等级的描述。ST官方标称的是IPx8等级(实际上这颗料在特定条件下可以持续浸水工作),但IPx8的测试条件是静态清水,不代表海水、含有洗涤剂的水、或者高压水柱直冲的情况下还能保证同样的密封性。如果做潜水电脑,传感器外侧还要加防水透气膜和保护结构,不能裸奔。
2. 硬件设计要点与防水方案的落地细节
2.1 引脚功能与外围电路设计
LPS28DFW的引脚不多,典型工作电压是1.7到3.6V,逻辑电平可以直接接1.8V或3.3V的MCU。封装是LGA,带有中间的大焊盘,焊接时要注意散热焊盘的处理。
先说电源。我习惯在VDD引脚附近放一个100nF的陶瓷电容,再并联一颗1μF到10μF之间的钽电容或者大容量MLCC,这样能有效抑制电源纹波对压力读数的影响。LPS28DFW内部有稳压器,对电源质量的要求不算苛刻,但如果你的板子上同时有电机、蜂鸣器之类的大电流负载,还是建议单独走一条模拟电源线给传感器,避免地弹造成读数跳变。
再说I2C地址。这颗料的I2C地址取决于SAO引脚的电平,SAO接GND时地址是0x5C,接VDD时是0x5D。很多人在这一步容易忽略——因为ST的气压计系列可能存在细微差异,最好初始化时通过读WHO_AM_I寄存器(地址0x0F,预期值0xB4)确认通信正常。
SPI接口方面,LPS28DFW支持最高10MHz的SPI时钟,如果项目里已经有其他SPI设备共用一个总线,要注意片选信号的隔离,防止总线冲突。我用的是SPI模式,4线制,主控是nRF52832,实测8MHz时钟稳定,没有任何问题。
硬件上还有一个关键点是中断引脚。LPS28DFW提供INT_DRDY引脚,用于数据准备好中断和FIFO水印中断。如果你做低功耗设计,建议把中断引脚接到MCU的GPIO唤醒脚上,这样传感器在睡眠模式下工作,数据准备好后再唤醒MCU读取,整机功耗能做到非常低。
2.2 PCB布局和防水结构配合
PCB布局上最需要注意的是传感器上方的空间。
因为压力传感器要感知外部环境气压,它的封装顶部必须留出通气孔或者通气通道。LPS28DFW的上表面有一个很小的通气孔,这个位置在器件贴片后不能被阻焊油墨、丝印或者其他元件遮挡。如果设备要做整机防水,这个通气孔需要经过外壳上的透气孔连接到外界大气,正常做法是在外壳打一个孔,孔内侧贴防水透气膜,再通过密封泡棉压在传感器上方,形成一个气压可以传导但水进不去的通道。
有人图省事,直接在传感器顶部涂一层UV胶。这绝对不行。UV胶固化后会给感应膜片施加应力,导致输出的压力值发生明显偏移,而且这种偏移不是固定的,会随温度变化,非常难校准。正确做法是让传感器顶部的空气腔尽量大一点,推荐至少留1mm以上的高度,避免结构件在装配后压迫到传感器表面。另外,空气腔内不能有挥发性物质,比如普通密封胶里的溶剂就会污染传感器内部,导致数值漂移。
我画PCB时的经验是,把传感器尽量放在板子的边缘,避开螺丝孔、电池、大电感这些容易产生机械应力的位置。MEMS压力传感器的敏感机理是应力感应,PCB在装配时产生的任何机械形变都会反映在输出值上。如果你的板子比较软,可以考虑把传感器放在靠近固定点的位置,让PCB形变相对最小。
注意:LPS28DFW的防水封装能防的是“外部环境”,不是“PCB传递过来的应力”。贴片后不要用超声波清洗机长时间清洗,虽然封装本身能扛住,但清洗液如果残留在LGA底部缝隙里,板子烘干不彻底的话,时间长了焊盘还是会出问题。这块我踩过坑,后面专门讲。
3. 软件驱动与数据采集实现
3.1 I2C/SPI接口初始化与寄存器配置
软件部分,先讲初始化流程。LPS28DFW上电后默认是睡眠模式,必须先把ODR配置好才会开始测量。我一般这样操作:
首先复位传感器,向寄存器0x11(CTRL_REG2)写入0x04,然后等待50ms让内部重启完成。这一步很重要,因为有些批次芯片上电后的默认状态可能有差异,先复位能保证后续配置状态一致。
然后配置CTRL_REG1(地址0x10),这个寄存器负责ODR(输出数据速率)和测量模式。LPS28DFW支持1Hz到200Hz的ODR,如果做静态气压观测,1Hz就够了;如果做无人机定高或者手势识别这类对实时性有要求的场景,建议用50Hz或100Hz,响应更快,代价是功耗会上去。我一般用25Hz,平衡功耗和响应速度。
CTRL_REG1的bit4是块数据更新(BDU)使能位,这个建议一定置1。原因是如果使能了BDU,在数据更新期间读取压力寄存器时,硬件会锁存当前值,等读完高低字节后再释放。如果BDU不使能,正在更新时去读数据,可能读到高低字节分别来自两次不同样本的数据,导致一个明显跳跃的异常值。这个问题在ODR比较高的时候尤其明显。
CTRL_REG2(0x11)除了复位位,还控制I2C/SPI接口的配置。如果使用SPI,建议把bit2(I2C disable)置1,把I2C功能关掉,这样可以稍微降低一点功耗。
关键配置示例(I2C方式,ODR=25Hz,低量程模式):
uint8_t ctrl1 = 0x30; // ODR=25Hz, 低噪声模式, BDU使能 uint8_t ctrl2 = 0x00; // 复位完成, I2C使能 uint8_t ctrl3 = 0x00; // 中断配置,这里先不使能 uint8_t ctrl4 = 0x00; // 中断引脚配置默认 // 写寄存器 write_reg(0x11, 0x04); // 软复位 delay_ms(50); write_reg(0x10, ctrl1); write_reg(0x11, ctrl2);注意CTRL_REG4(地址0x13)里有一个量程选择位。LPS28DFW出厂默认工作在低量程模式,如果要切换高压模式,需要写这个寄存器。具体的bit定义我建议以最新版本数据手册为准,不同版本之间数字编号可能微调。
3.2 数据读取与压力值换算
LPS28DFW的压力数据是24位输出的,存在三个寄存器里:PRESS_OUT_XL(0x28)、PRESS_OUT_L(0x29)、PRESS_OUT_H(0x2A)。温度数据是16位,在TEMP_OUT_L(0x2B)和TEMP_OUT_H(0x2C)。
读取的时候建议一次性读取5个字节(3字节压力 + 2字节温度),这样在读温度的时候顺便把压力也读回来了。如果用I2C,可以直接发一条读命令,从0x28开始连续读5个字节,比较高效。
换算公式很简单,原始值是一个有符号32位整数,先把3字节拼好,然后根据量程模式除以对应的灵敏度系数。数据手册给的标准换算公式是:
int32_t raw_pressure = (press_out_h << 16) | (press_out_l << 8) | press_out_xl; // 需要按有符号数扩展 if (raw_pressure & 0x800000) { raw_pressure |= 0xFF000000; } double pressure_hpa = (double)raw_pressure / 4096.0;这个4096就是低量程模式下的灵敏度,单位是LSB/hPa。如果你切换到高压模式,灵敏度会变成2048 LSB/hPa,对应每个LSB约等于0.49 Pa。
这里有个容易踩的坑:很多从BMP280转过来的朋友习惯直接用浮点数做除法,但在低功耗MCU上,浮点运算开销不小。如果你在无FPU的MCU上跑,建议直接用整数运算加查表的方式处理,或者预先算好逆灵敏度存成常量,用定点乘法代替除法。
温度数据换算公式也很简单:
int16_t raw_temp = (temp_out_h << 8) | temp_out_l; double temp_c = (double)raw_temp / 100.0;3.3 FIFO与中断的使用技巧
LPS28DFW内置了一个可以存储最多128个样本的FIFO缓冲区。这个功能在低功耗场景下非常实用——MCU不需要每次数据准备好都去读取,可以让传感器累积一定数量的样本后触发一次性读取。
FIFO有两种常用模式:FIFO模式和流模式。FIFO模式是缓冲区满了就停止采集,适合精确记录一段固定长度的数据;流模式是满了之后覆盖最旧的数据,类似环形缓冲区,适合持续监测场景。我做的穿戴设备用的是流模式,配置FIFO水位为32个样本,然后设置中断。这样MCU每32个样本唤醒一次,平均功耗显著降低。
FIFO配置相关寄存器主要是FIFO_CTRL(0x14),里面包含FIFO模式选择和水位阈值设定。操作流程大致是:
- 配置FIFO模式为流模式;
- 设置水印为32;
- 使能FIFO水印中断;
- 在主循环中等待INT_DRDY引脚拉高;
- 读取FIFO状态寄存器,判断里面有多少个样本;
- 一次性读出所有样本。
提示:读取FIFO数据时,每次读PRES_OUT寄存器会自动弹出下一个样本,不需要额外发FIFO弹出命令。这个细节不写进代码里真的容易混淆。
4. 双重满量程在不同场景下的应用与配置
4.1 高度计场景(260-1260 hPa)
如果做的是无人机定高、室内楼层检测、户外登山表这类应用,建议保持默认的低量程模式,不要切高压。
低量程模式的灵敏度更高,换算出来的压力分辨率约0.16 Pa,对应高度变化约1.3厘米。这个精度在消费级无人机里算很不错的了,哪怕是大型固定翼,这个分辨率也足够支撑平稳的垂直速度估计。
关于高度换算,不同场景用不同公式。低空(海拔0到5公里)用简化压高公式就可以:
h = 44330 * (1 - (p / p0)^(1/5.255))p0是海平面标准气压,通常取1013.25 hPa。如果只是做相对高度测量(比如起飞点距离地面的高度),p0取起飞时实测气压即可,这样可以消除大部分天气变化带来的气压差。
实测下来,LPS28DFW在稳定环境下的噪声水平大概是0.6 Pa RMS(低量程模式,25Hz输出速率),换算成高度噪声大约是5厘米。这个噪声水平在消费级产品里属于上游水准。如果希望进一步降低噪声,可以在算法层面做滑动平均或者卡尔曼滤波,我一般用一阶低通滤波就能把标准差压到0.3 Pa左右,但代价是响应速度变慢,差不多会滞后300ms左右。
这里有个实际调参的经验:如果做室内定位,不建议滤波太狠。因为人在室内走动时气压变化其实挺明显的,电梯上下、开关门、空调风量变化都会造成气压波动,如果滤波器惯性太大,高度变化检测会有明显延迟,体验很差。比较稳妥的做法是压力值用轻滤波,然后在高度解算环节加状态机判断“静止/运动”状态,不同状态用不同滤波强度。
4.2 潜水/水深测量场景(260-4060 hPa)
切换到高压模式后,LPS28DFW的量程可以覆盖到4060 hPa,对应大约30米水深(标准淡水密度下)。
水深计算公式是:
depth_m = (p - p_surface) / (rho * g)其中p是传感器实测绝对压力,p_surface是水面大气压,rho是水的密度(淡水取1000 kg/m³,海水取1025 kg/m³),g取9.80665 m/s²。
这个场景下有几个注意事项:
第一,传感器上方必须压防水透气膜,防止真实水压直接冲击传感器膜片。虽然LPS28DFW的封装本身防水,但不能完全依赖它去承受动态水压的冲击,防水透气膜还可以防止冷凝水在温度变化时在传感器通气孔内部结露。
第二,水压对温度非常敏感。水的密度随温度变化大约每10摄氏度变化0.2%左右,这个误差在30米深度大约对应6厘米,一般可以忽略。但更关键的是,水下温度通常比空气低,传感器自身发热会导致一个稳定的温度差,这个温度差会让压力读数产生一个固定的偏移,必须在样机阶段实测校准掉。我测过LPS28DFW在从25度空气突然浸入15度水里的瞬间,压力读数会出现约2 hPa的瞬态跳变,大概几十秒后才稳定回来。这主要是封装内部残余空气温度变化导致的,不是传感器坏了。
第三,如果设备会频繁在不同深度之间快速变化(比如自由潜水),建议把ODR调到50Hz以上,这样能捕捉到更平滑的深度曲线,后续做深度变化率计算也准确一些。
5. 常见问题与排查技巧实录
5.1 数据跳变与噪声问题
场景表现:读数在某个值附近来回跳,跳变幅度超过几个hPa,尤其在高ODR时更明显。
排查步骤:
- 先检查电源。用示波器看VDD引脚纹波,如果纹波超过50mV,大概率是电源问题。我碰到过一次是LDO输出电容选得太大,导致瞬态响应慢,传感器每次内部采样时把电压拉低了一点,读数随之跳变。
- 再看I2C总线上拉电阻。很多板子I2C上拉电阻用1kΩ甚至更小,传感器不长,但主机端负载重的话,通信质量下降可能导致读到偶发错误值。建议上拉电阻在2.2k到4.7k之间,总线长度控制在10cm以内。
- 最后看机械装配。如果传感器附近有螺丝固定,可以试试稍微松一下螺丝看读数是否有变化,如果有明显变化,就是应力耦合,需要在PCB布局上重新考虑。
5.2 温度补偿与零漂问题
场景表现:设备刚开机时读数正常,过几十分钟后,压力值缓慢漂移了1到2 hPa,而且似乎和环境温度变化相关。
这个问题的根源是板子热平衡过程。设备刚开机时,板载芯片发热会让传感器周围温度快速升高,气压读数受温度影响产生偏移。LPS28DFW内部有温度补偿,但补偿的是传感器自身芯片的温度,不是PCB上其他器件传导过来的热量。如果传感器旁边有一颗发热量大的LDO或者MCU,热量会通过引脚和PCB传导到传感器上,导致补偿误差变大。
我的解决方案是:在PCB布局时尽量把传感器放得离热源远一些;如果无法避免,可以在软件初始化完成后等30秒左右再做基准气压校准,或者在算法里加一个缓慢的温度漂移补偿项。注意不要把传感器铺铜和发热芯片的铺铜连成一片,中间可以加一条开槽阻断热传导路径。
5.3 防水失效的坑
这是这颗料特有的问题。LPS28DFW本身防水,但如果你把整板浸泡在水里测试,失效点一般不在传感器,而在PCB焊盘、电缆接口或者外壳缝隙。
我在做防水等级测试时遇到一个很典型的情况:传感器本体IPx8测试通过了,但整机在1米水深泡了30分钟后,读数开始间歇性异常,时好时坏。拆开检查发现,水已经从排线连接器的缝隙渗进来,PCB上的露铜焊盘氧化,导致传感器供电电压下降,读数自然就不正常了。所以如果你要做整机防水,传感器防水只是最基础的一环,板级三防漆、连接器选型、外壳密封结构才是重点。
另外LPS28DFW底部中间焊盘和信号焊盘之间的间距很小,如果PCB阻焊层做得不好,焊接后可能形成微小的桥连。这种桥连在干燥环境下不会暴露问题,但一旦受潮,就会形成漏电通路,导致传感器测量结果漂移。排查方法是用万用表测量VDD和GND之间的绝缘电阻,正常情况下应该在兆欧级以上,如果低于100kΩ,基本可以判定有漏电路径。
6. 与同系列气压计对比及选型建议
6.1 同系列对比
ST这几年出了好几颗气压计,很多人在选型时容易搞混,简单整理一下定位:
| 型号 | 量程 | 防水 | 接口 | 定位 |
|---|---|---|---|---|
| LPS22HH | 260-1260 hPa | 否 | I2C/SPI | 通用消费级高度计 |
| LPS25HB | 260-1260 hPa | 否 | I2C/SPI | 老一代产品,逐渐淘汰 |
| LPS28DFW | 260-4060 hPa | 是 | I2C/SPI | 防水+双重满量程 |
| LPS33HW | 260-1260 hPa | 是 | I2C/SPI | 防水但只有低量程 |
| LPS35HW | 260-1260 hPa | 是 | I2C/SPI | 可承受更大压力冲击 |
如果你的应用只需要普通高度计加防水,LPS33HW其实就够用了,成本更低。但如果追求更高的集成度,想用一颗料同时覆盖高度计和水深计,LPS28DFW是唯一能兼顾双重满量程和防水封装的选择。
另外注意LPS28DFW的工作温度范围标称是-40到85摄氏度,但防水性能在低温下会变差。我做低温测试时发现,在-20度以下,凝胶材料的柔韧性下降,反复温度循环后防水性能会衰减,这个因素在户外极端环境产品里要提前评估。
6.2 选型建议
给新手一个简单的选型决策树:
- 只做室内定位、无人机定高 → LPS22HH就够,不用为用不上的功能买单;
- 做户外手表、登山表,需要防雨水但不潜水 → LPS33HW,省成本;
- 做潜水电脑、水下定位、浮标监测 → LPS28DFW,而且要严格按照前面说的结构设计来做防水;
- 如果只是实验室环境测气压,一点都不接触水 → 用LPS22HH即可,LPS28DFW的防水优势体现不出来。
顺便说一句,LPS28DFW的功耗控制得不错。我实测在25Hz ODR、FIFO半满、无数据处理的情况下,平均电流大约在17μA左右,睡眠模式下更是低到0.5μA左右,对于一颗锂电池供电的穿戴设备来说,这个水平不会给整机续航带来明显压力。
7. 写在最后的实操心得
LPS28DFW这颗料整体用下来的感觉是:功能密度很高,但想把它的双重满量程和防水封装用到位,硬件和软件的功夫都不能省。
最深的体会是,不要因为传感器本身防水就在系统层面掉以轻心。传感器只是感知压力的窗口,整个设备的防水能力取决于最薄弱的一环。我做过一块板子,传感器周围做了很细致的密封,结果水从电池仓的接缝渗进去,最后一样返修。MEMS传感器选型重要,但系统设计更重要。
软件方面,建议第一次上电调试时先花十分钟把FIFO、中断这一套机制吃透,而不是只读实时数据。LPS28DFW的FIFO配合低功耗模式能省下大量主控唤醒时间,这个收益在量产设备里非常明显。
如果只是做前期功能验证,直接用I2C读实时数据就够了,但进入低功耗设计阶段,建议尽早切换到FIFO+中断方案,避免后面改板时才发现中断引脚没接。
另外建议大家在量产前做一个高低温循环测试,传感器在温度变化过程中的数据要全程记录。我遇到过某批次传感器在低温端读数偏大,排查下来是PCB上某颗电阻的温度系数太大导致的,和传感器本身无关。这类问题只有靠完整的测试流程才能提前发现。
最后分享一个小技巧:LPS28DFW的WHO_AM_I寄存器值是0xB4,很多ST传感器是0xBD或其它值,如果通信正常但读回来的WHO_AM_I不对,先怀疑地址线、I2C地址配置或者SPI模式问题,别急着换料。这个排查思路能帮你省掉大量无效调试时间。