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