尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

LPS28DFW气压传感器实战:双重满量程与防水设计要点

LPS28DFW气压传感器实战:双重满量程与防水设计要点 最近在手头一个穿戴设备项目里要用到防水气压计选了ST的LPS28DFW。这颗料比较新网上资料不多中文应用笔记就更少了踩了几个坑之后总算把数据稳定读出来了。想着应该有不少人也在选型或者调试这颗传感器就把整个过程中涉及到的双重满量程配置、防水封装注意事项、软件驱动和常见问题整理成一篇应用笔记给后面做方案的朋友省点时间。LPS28DFW是意法半导体推出的一款绝对数字输出气压传感器最大的两个卖点就是双重满量程和防水封装。简单说就是它既能当普通高度计用也能在4个大气压以内当水深计用而且封装本身针对冷凝、进水场景做了强化。它采用22位ADC输出走I2C或SPI支持中断和FIFO整体功耗很低非常适合手表、手环、潜水电脑、户外定位器这类由电池供电又对防水有硬性要求的设备。1. 为什么选LPS28DFW双重满量程与防水设计的底层逻辑1.1 双重满量程解决了什么痛点先说说双重满量程这个概念因为这是选这颗料最核心的理由。传统气压计一般只有一个量程比如常见的BMP280是300-1100 hPaMS5611是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配置好才会开始测量。我一般这样操作首先复位传感器向寄存器0x11CTRL_REG2写入0x04然后等待50ms让内部重启完成。这一步很重要因为有些批次芯片上电后的默认状态可能有差异先复位能保证后续配置状态一致。然后配置CTRL_REG1地址0x10这个寄存器负责ODR输出数据速率和测量模式。LPS28DFW支持1Hz到200Hz的ODR如果做静态气压观测1Hz就够了如果做无人机定高或者手势识别这类对实时性有要求的场景建议用50Hz或100Hz响应更快代价是功耗会上去。我一般用25Hz平衡功耗和响应速度。CTRL_REG1的bit4是块数据更新BDU使能位这个建议一定置1。原因是如果使能了BDU在数据更新期间读取压力寄存器时硬件会锁存当前值等读完高低字节后再释放。如果BDU不使能正在更新时去读数据可能读到高低字节分别来自两次不同样本的数据导致一个明显跳跃的异常值。这个问题在ODR比较高的时候尤其明显。CTRL_REG20x11除了复位位还控制I2C/SPI接口的配置。如果使用SPI建议把bit2I2C disable置1把I2C功能关掉这样可以稍微降低一点功耗。关键配置示例I2C方式ODR25Hz低量程模式uint8_t ctrl1 0x30; // ODR25Hz, 低噪声模式, 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_XL0x28、PRESS_OUT_L0x29、PRESS_OUT_H0x2A。温度数据是16位在TEMP_OUT_L0x2B和TEMP_OUT_H0x2C。读取的时候建议一次性读取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_CTRL0x14里面包含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这几年出了好几颗气压计很多人在选型时容易搞混简单整理一下定位型号量程防水接口定位LPS22HH260-1260 hPa否I2C/SPI通用消费级高度计LPS25HB260-1260 hPa否I2C/SPI老一代产品逐渐淘汰LPS28DFW260-4060 hPa是I2C/SPI防水双重满量程LPS33HW260-1260 hPa是I2C/SPI防水但只有低量程LPS35HW260-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模式问题别急着换料。这个排查思路能帮你省掉大量无效调试时间。
返回列表