在线客服
销售-谭小姐13672863149
销售-陈小姐13536007805
销售-黄小姐13426882603
销售:张先生13822460808
(微信同号)
|
SM7391微差压传感器应用于呼吸机的调试经验
专栏:技术支持
发布日期:2023-11-22
阅读量:671
收藏:
SM7391微差压传感器是一款内部集成16位MCU的,其量程为±500pa,典型输出精度为±0.1%FS ,出厂时已经做了温度补偿和压力校准,温度补偿范围为-5℃至65℃,支持I2C和模拟输出。TWI_SendByte(0x30);
SM7391微差压传感器是一款内部集成16位MCU的,其量程为±500pa,典型输出精度为±0.1%FS ,出厂时已经做了温度补偿和压力校准,温度补偿范围为-5℃至65℃,支持I2C和模拟输出。目前已经成功应用在于国内呼吸机产品中,主要通过差压传感器实现呼吸流量的计量。 很多工程师在使用SM7391时候,可能会遇到不同的技术问题,下面是基于某客户实际调试SM7391压力传感器的过程,希望给其他工程师给予借鉴。 首先,差压传感器SM7391可以工作在3V或者5V系统中,支持标准I2C通信,工程师可以采用模拟I2C,也可以使用硬件I2C。很多工程师在询问SM7391的I2C地址,原厂设置为0x36。 其次,差压传感器SM7391的I2C输出值范围为-26214至+26214,而模拟输出对应电压范围10%*VDD至90*VDD,两种方式分别对应量程为-500pa至500pa,所以通过此可以计算出线性直线斜率。 图1、差压传感器SM7391的I2C通信校准曲线 第三,差压传感器SM7391内部集成低通滤波器,通过外置MCU可以设置三种不同的滤波参数: 1、截止频率fc=10hz 时,设置Part numbers 11, 12, 13; 2、截止频率fc=20hz 时,设置Part numbers 21, 22, 23; 3、截止频率fc=50hz 时,设置Part numbers 51, 52, 53; 第四,差压传感器SM7391出厂时温度补偿范围是-5℃至65℃,可以参考下面图片。而实际产品则要求-40℃至85℃,中间没有补偿的温度范围需要工程师自己在外置MCU中进行补偿。补偿方法可以依5℃为梯度进行温度、压力测试,将数据读取之后进行曲线拟合。 图2、差压传感器SM7391的出厂时的温补曲线 第五,差压传感器SM7391的典型电路如下图,很多工程师在询问13脚的作用。此引脚是SMI原厂出厂调试使用的,客户在使用差压传感器SM7391时只需要将该引脚接到GND上即可。 图3、差压传感器SM7391的典型电路 第六,差压传感器SM7391的测量结果存放在一个2字节的结果寄存器中,温度结果寄存器地址为0x2E,压力结果寄存器地址为0x30,状态结果寄存器地址为0x32。很多工程师只是需要压力值,所以MCU只需要读取0x30寄存器的值即可,然后通过与直线斜率计算出当前的压力值。 注意:差压传感器SM7391默认是低字节在前,高字节再后。 Pcounts=256*byte2+ byte1 如果工程师使用差压传感器SM7391为模拟输出,比如在3V系统中,-500pa输出电压为0.33V,500pa输出电压为2.97V,根据此计算出斜率,然后通过下列公式计算出压力值,单位为mbar。 设计工程师可以参考下面的代码,将其移植到MCU中,实现差压传感器SM7391测量压力值转换。 void SM16bit_sensor_read(void) { BYTE i; for(i=0;i<trycount;i++) { TWI_Start(); TWI_SendByte(slaveID|0x00); SDAinput(); if(!TWI_WaitAck()) { SDAoutput(); TWI_Stop(); continue; } SDAoutput(); TWI_SendByte(0x30); //数据地址 SDAinput(); if(!TWI_WaitAck()) { SDAoutput(); TWI_Stop(); continue; } SDAoutput(); TWI_Start(); TWI_SendByte(slaveID|0x01); SDAinput(); if(!TWI_WaitAck()) { SDAoutput(); TWI_Stop(); continue; } SDAoutput(); break; } if(i==trycount) return; SDAinput(); presslow = TWI_ReceiveByte(); SDAoutput(); TWI_Ack(); SDAinput(); presshigh=TWI_ReceiveByte(); SDAoutput(); TWI_NoAck(); TWI_Stop(); return; } 希望以上经验可以帮助到每一位工程师! |