SDP800差壓傳感器的驅(qū)動設(shè)計與實現(xiàn)_第1頁
SDP800差壓傳感器的驅(qū)動設(shè)計與實現(xiàn)_第2頁
SDP800差壓傳感器的驅(qū)動設(shè)計與實現(xiàn)_第3頁
SDP800差壓傳感器的驅(qū)動設(shè)計與實現(xiàn)_第4頁
SDP800差壓傳感器的驅(qū)動設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

WordSDP800差壓傳感器的驅(qū)動設(shè)計與實現(xiàn)

(檢測)流量數(shù)據(jù)的方法有很多種,這一次我們就是使用SDP800差壓(傳感器)來測量流量數(shù)據(jù)。所以在這一篇中,我們將討論如何實現(xiàn)SDP800差壓傳感器的驅(qū)動,并使用它實現(xiàn)流量數(shù)據(jù)的檢測。

1、功能概述??SDP800差壓傳感器系列是Sensirion為大批量應(yīng)用設(shè)計的數(shù)字壓差傳感器系列。傳感器測量空氣和非腐蝕性氣體的壓力,具有極高的精度,沒有偏移。該傳感器覆蓋的壓力范圍高達(dá)±500Pa,并提供卓越的精度。其結(jié)構(gòu)及引腳定義如下圖所示:

??SDP800系列差壓傳感器具有數(shù)字2線(I2C)接口,這使得它很容易直接連接到微處理器。在I2C總線上每一臺設(shè)備都有一個地址,SDP800差壓傳感器不同的型號設(shè)備地址略有差異,具體如下表:

??雖然I2C接口基本有規(guī)范的通訊格式,但不同的設(shè)備在通訊報文的設(shè)置上還是有一下差異。這里SDP800差壓傳感器其通訊報文的格式如下:

??在這一報文格式中,除了地址和數(shù)據(jù)還有一個16位的命令。這些命令是廠商設(shè)定的,用于實現(xiàn)對SDP800差壓傳感器的各種操作。這里我們只列出數(shù)據(jù)獲取的命令。

??對于SDP800差壓傳感器操作命令還有很多如配置、復(fù)位等我們在此不作詳述。

2、驅(qū)動設(shè)計與實現(xiàn)??我們已經(jīng)簡單的描述了SDP800差壓傳感器的基本情況。這一節(jié)我們將進一步考慮SDP800差壓傳感器的驅(qū)動設(shè)計與實現(xiàn)。

2.1、對象定義

??首先我們來考慮SDP800差壓傳感器的對象定義。關(guān)于對象總是存在對象的屬性和操作,SDP800差壓傳感器對象我們也從這兩個方面來考慮。

??我們先來分析一下SDP800差壓傳感器對象的屬性問題。SDP800差壓傳感器采用I2C接口,所以設(shè)備地址必不可少,而且每一個地址都唯一標(biāo)識一臺設(shè)備,所以我們將其設(shè)定為對象的屬性。此外,SDP800差壓傳感器的產(chǎn)品編號和產(chǎn)品序列號都是唯一標(biāo)識SDP800差壓傳感器設(shè)備,所以我們也將其設(shè)定為屬性。我們也希望記錄設(shè)備的狀態(tài)、測量的壓力、溫度以及差壓系數(shù)等。這些兩標(biāo)識了SDP800差壓傳感器設(shè)備的狀態(tài),所以我們也將其作為對象的屬性。

??而對象的操作,SDP800差壓傳感器采用I2C接口,所以需要接收和發(fā)送數(shù)據(jù)、為了控制時序我們需要延時操作函數(shù)。而這些函數(shù)的實現(xiàn)都依賴于具體的軟(硬件)平臺,所以我們將它們設(shè)置為對象的操作,以便于通過回調(diào)函數(shù)來實現(xiàn)對象平臺無關(guān)性。根據(jù)上述分析我們可以定義SDP800差壓傳感器的對象類型如下:

/*定義SDP800對象類型*/typedefstructSDP800Object{uint8_tdev(Ad)dress;//SDP800對象的地址uint8_tstatus;//SDP800狀態(tài)信息uint8_tpn[4];//SDP800對象的產(chǎn)品號uint8_tsn[8];//SDP800對象的序列號floatdpressure;//差壓float(te)mperature;//溫度floatdpFactor;//差壓系數(shù)void(*Delayms)(volatileuint32_tn(Ti)me);//延時操作指針void(*Receive)(structSDP800Object*sdp,uint8_t*rData,uint16_t(rS)ize);//接收數(shù)據(jù)操作指針void(*Transmit)(structSDP800Object*sdp,uint8_t*tData,uint16_ttSize);//發(fā)送數(shù)據(jù)操作指針}SDP800ObjectType;??有了對象類型,我們就可以獲得對象變量,但對象變量需要初始化后才能進行各種操作,所以我們需要實現(xiàn)一個SDP800差壓傳感器對象變量初始化的函數(shù)。

/*SDP800對象初始化配置*/SDP800ErrorTypeSdp800Initialization(SDP800ObjectType*sdp,//SDP800對象uint8_ti2cAddress,//設(shè)備地址SDP800Receiverecieve,//接收函數(shù)指針SDP800Transmittransmit,//發(fā)送函數(shù)指針SDP800Delaymsdelayms//毫秒演示函數(shù)){SDP800ErrorTypeerror=SDP800_ERROR_NONE;if((sdp==NULL)||(recieve==NULL)||(transmit==NULL)||(delayms==NULL)){returnSDP800_ERROR_IVALID_PA(RAM)ETER;}sdp->Receive=recieve;sdp->Transmit=transmit;sdp->Delayms=delayms;sdp->temperature=0.0;sdp->dpressure=0.0;if((i2cAddress==0x25)||(i2cAddress==0x26)){sdp->devAddress=(i2cAddressdevAddress=i2cAddress;}else{sdp->devAddress=0;error|=SDP800_ERROR_IVALID_PARAMETER;}if(error==SDP800_ERROR_NONE){error|=Sdp800ReadSerialNumber(sdp);}returnerror;}??在初始化函數(shù)中,我們對對象的屬性以及操作函數(shù)的指針變量都做了初始化,并讀取了設(shè)備的序列號。

2.2、對象操作

??我們定義了SDP800差壓傳感器的對像類型,也設(shè)計了對象變量的初始化函數(shù)。這一節(jié)我們來看一看我們所要實現(xiàn)的操作。

2.2.1、數(shù)據(jù)的獲取

??我們需要對SDP800差壓傳感器所做的首要操作就是獲取測量數(shù)據(jù)。根據(jù)不同的命令,SDP800差壓傳感器可以做單次測量,也可以做連續(xù)測量。這里我們采用連續(xù)測量的方式。連續(xù)測量設(shè)計到三類操作:開啟連續(xù)測量、讀取測量數(shù)據(jù)以及結(jié)束連續(xù)測量。根據(jù)通訊命令及報文格式要求,我們實現(xiàn)數(shù)據(jù)連續(xù)讀取的代碼如下:

/*連續(xù)讀取測量值*/SDP800ErrorTypeSdp800Re(adC)ontinousMeasurement(SDP800ObjectType*sdp){SDP800ErrorTypeerror=SDP800_ERROR_NONE;uint8_trDatas[9];int16_tdiffPressureTicks;int16_ttemperatureTicks;uint16_tscaleFactorDiffPressure;sdp->Receive(sdp,rDatas,9);if((rDatas[0]==0xFF)returnSDP800_ERROR_ACK;}error|=CheckCRC8ForSDP800(error|=CheckCRC8ForSDP800(error|=CheckCRC8ForSDP800(if(error==SDP800_ERROR_NONE){diffPressureTicks=rDatas[0]*256+rDatas[1];temperatureTicks=rDatas[3]*256+rDatas[4];scaleFactorDiffPressure=rDatas[6]*256+rDatas[7];sdp->temperature=(float)temperatureTicks/200.0;sdp->dpFactor=(float)scaleFactorDiffPressure;sdp->dpressure=(float)diffPressureTicks/sdp->dpFactor;}returnerror;}/*啟動連續(xù)測量*/SDP800ErrorTypeSdp800StartContinousMeasurement(SDP800ObjectType*sdp,Sdp800TempCompTypetempComp,Sdp800AveragingTypeaveraging){SDP800ErrorTypeerror=SDP800_ERROR_NONE;SDP800Commandcommands[2][2]={{COMMAND_START_MEASUREMENT_MF_AVERAGE,COMMAND_START_MEASUREMENT_MF_NONE},{COMMAND_START_MEASUREMENT_DP_AVERAGE,COMMAND_START_MEASUREMENT_DP_NONE}};switch(commands[tempComp][averaging]){caseCOMMAND_START_MEASUREMENT_MF_AVERAGE:{sdp->status=1;break;}caseCOMMAND_START_MEASUREMENT_MF_NONE:{sdp->status=2;break;}caseCOMMAND_START_MEASUREMENT_DP_AVERAGE:{sdp->status=3;break;}caseCOMMAND_START_MEASUREMENT_DP_NONE:{sdp->status=4;break;}default:{sdp->status=0;error=SDP800_ERROR_IVALID_PARAMETER;break;}}if(SDP800_ERROR_NONE==error){Sdp800WriteCommand(sdp,commands[tempComp][averaging]);sdp->Delayms(20);}if(SDP800_ERROR_NONE!=error){sdp->status=0;}returnerror;}/*停止連續(xù)測量*/SDP800ErrorTypeSdp800StopContinousMeasurement(SDP800ObjectType*sdp){Sdp800WriteCommand(sdp,COMMAND_STOP_CONTINOUS_MEASUREMENT);returnSDP800_ERROR_NONE;}2.2.2、設(shè)備控制

??有一些命令是用來實現(xiàn)對SDP800差壓傳感器的控制的,如設(shè)備的復(fù)位、休眠及各種配置。這里我們主要用到SDP800差壓傳感器的軟件復(fù)位及休眠。

/*軟件復(fù)位*/SDP800ErrorTypeSdp800SoftReset(SDP800ObjectType*sdp){Sdp800WriteCommand(sdp,COMMAND_ENTER_SLEEP_MODE);//等待20mssdp->Delayms(20);returnSDP800_ERROR_NONE;}/*進入休眠模式*/SDP800ErrorTypeSDP800EnterSleepMode(SDP800ObjectType*sdp){Sdp800WriteCommand(sdp,COMMAND_ENTER_SLEEP_MODE);returnSDP800_ERROR_NONE;}3、驅(qū)動的使用??我們設(shè)計并實現(xiàn)了SDP800差壓傳感器的驅(qū)動程序。接下來,我們使用設(shè)計的驅(qū)動實現(xiàn)基于SDP800差壓傳感器傳感器的流量檢測。

3.1、聲明并初始化對象

??在前面我們已經(jīng)定義了SDP800差壓傳感器對象類型。在這里,我們先聲明一個SDP800差壓傳感器對象變量。

SDP800ObjectTypesdp;??有了這個對象變量,我們還需要調(diào)用初始化函數(shù)對其進行實例化。初始化函數(shù)具有讀個參數(shù):

SDP800ObjectType*sdp,//SDP800對象uint8_ti2cAddress,//設(shè)備地址SDP800Receiverecieve,//接收函數(shù)指針SDP800Transmittransmit,//發(fā)送函數(shù)指針SDP800Delaymsdelayms//毫秒演示函數(shù)??第一個參數(shù)是需要初始化的對象變量。第二個參數(shù)則是SDP800差壓傳感器的設(shè)備地址。而后面的三個參數(shù)則是函數(shù)指針,我們需要實現(xiàn)這三個函數(shù),它們的原型定義如下:

//延時操作指針typedefvoid(*SDP800Delayms)(volatileuint32_tnTime);//接收數(shù)據(jù)操作指針typedefvoid(*SDP800Receive)(structSDP800Object*sdp,uint8_t*rData,uint16_trSize);//發(fā)送數(shù)據(jù)操作指針typedefvoid(*SDP800Transmit)(structSDP800Object*sdp,uint8_t*tData,uint16_ttSize);??結(jié)合這三個函數(shù)的原型要求以及我們所使用平臺的具體特點,我們實現(xiàn)這幾個函數(shù)如下:

/*向(DSP)800下發(fā)指令,指令格式均為1個字節(jié)*/staticvoidWriteToSDP(SDP800ObjectType*sdp,uint8_t*wData,uint16_twSize){HAL_I2C_Master_Transmit(}/*從DSP800讀取多個字節(jié)數(shù)據(jù)的值*/staticvoidReadFromSDP(SDP800ObjectType*sdp,uint8_t*rData,uint16_trSize){HAL_I2C_Master_Receive(}??我們實現(xiàn)了這些函數(shù)后,我們就可以將這些

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論