在線(xiàn)客服
|
SM7391微差壓傳感器應用于呼吸機的調試經(jīng)驗
專(zhuān)欄:技術(shù)支持
發(fā)布日期:2023-11-22
閱讀量:386
作者:
收藏:
SM7391微差壓傳感器是一款內部集成16位MCU的,其量程為±500pa,典型輸出精度為±0.1%FS ,出廠(chǎng)時(shí)已經(jīng)做了溫度補償和壓力校準,溫度補償范圍為-5℃至65℃,支持I2C和模擬輸出。TWI_SendByte(0x30);
SM7391微差壓傳感器是一款內部集成16位MCU的,其量程為±500pa,典型輸出精度為±0.1%FS ,出廠(chǎng)時(shí)已經(jīng)做了溫度補償和壓力校準,溫度補償范圍為-5℃至65℃,支持I2C和模擬輸出。目前已經(jīng)成功應用在于國內呼吸機產(chǎn)品中,主要通過(guò)差壓傳感器實(shí)現呼吸流量的計量。 很多工程師在使用SM7391時(shí)候,可能會(huì )遇到不同的技術(shù)問(wèn)題,下面是基于某客戶(hù)實(shí)際調試SM7391壓力傳感器的過(guò)程,希望給其他工程師給予借鑒。 首先,差壓傳感器SM7391可以工作在3V或者5V系統中,支持標準I2C通信,工程師可以采用模擬I2C,也可以使用硬件I2C。很多工程師在詢(xún)問(wèn)SM7391的I2C地址,原廠(chǎng)設置為0x36。 其次,差壓傳感器SM7391的I2C輸出值范圍為-26214至+26214,而模擬輸出對應電壓范圍10%*VDD至90*VDD,兩種方式分別對應量程為-500pa至500pa,所以通過(guò)此可以計算出線(xiàn)性直線(xiàn)斜率。 圖1、差壓傳感器SM7391的I2C通信校準曲線(xiàn) 第三,差壓傳感器SM7391內部集成低通濾波器,通過(guò)外置MCU可以設置三種不同的濾波參數: 1、截止頻率fc=10hz 時(shí),設置Part numbers 11, 12, 13; 2、截止頻率fc=20hz 時(shí),設置Part numbers 21, 22, 23; 3、截止頻率fc=50hz 時(shí),設置Part numbers 51, 52, 53; 第四,差壓傳感器SM7391出廠(chǎng)時(shí)溫度補償范圍是-5℃至65℃,可以參考下面圖片。而實(shí)際產(chǎn)品則要求-40℃至85℃,中間沒(méi)有補償的溫度范圍需要工程師自己在外置MCU中進(jìn)行補償。補償方法可以依5℃為梯度進(jìn)行溫度、壓力測試,將數據讀取之后進(jìn)行曲線(xiàn)擬合。 圖2、差壓傳感器SM7391的出廠(chǎng)時(shí)的溫補曲線(xiàn) 第五,差壓傳感器SM7391的典型電路如下圖,很多工程師在詢(xún)問(wèn)13腳的作用。此引腳是SMI原廠(chǎng)出廠(chǎng)調試使用的,客戶(hù)在使用差壓傳感器SM7391時(shí)只需要將該引腳接到GND上即可。 圖3、差壓傳感器SM7391的典型電路 第六,差壓傳感器SM7391的測量結果存放在一個(gè)2字節的結果寄存器中,溫度結果寄存器地址為0x2E,壓力結果寄存器地址為0x30,狀態(tài)結果寄存器地址為0x32。很多工程師只是需要壓力值,所以MCU只需要讀取0x30寄存器的值即可,然后通過(guò)與直線(xiàn)斜率計算出當前的壓力值。 注意:差壓傳感器SM7391默認是低字節在前,高字節再后。 Pcounts=256*byte2+ byte1 如果工程師使用差壓傳感器SM7391為模擬輸出,比如在3V系統中,-500pa輸出電壓為0.33V,500pa輸出電壓為2.97V,根據此計算出斜率,然后通過(guò)下列公式計算出壓力值,單位為mbar。 設計工程師可以參考下面的代碼,將其移植到MCU中,實(shí)現差壓傳感器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; } 希望以上經(jīng)驗可以幫助到每一位工程師! |