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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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

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

2.1、對象定義

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

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

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

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

/*SDP800對象初始化配置*/SDP800ErrorTypeSdp800Initialization(SDP800ObjectType*sdp,//SDP800對象uint8_ti2cAddress,//設備地址SDP800Receiverecieve,//接收函數指針SDP800Transmittransmit,//發(fā)送函數指針SDP800Delaymsdelayms//毫秒演示函數){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;}??在初始化函數中,我們對對象的屬性以及操作函數的指針變量都做了初始化,并讀取了設備的序列號。

2.2、對象操作

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

2.2.1、數據的獲取

??我們需要對SDP800差壓傳感器所做的首要操作就是獲取測量數據。根據不同的命令,SDP800差壓傳感器可以做單次測量,也可以做連續(xù)測量。這里我們采用連續(xù)測量的方式。連續(xù)測量設計到三類操作:開啟連續(xù)測量、讀取測量數據以及結束連續(xù)測量。根據通訊命令及報文格式要求,我們實現(xiàn)數據連續(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、設備控制

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

/*軟件復位*/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、驅動的使用??我們設計并實現(xiàn)了SDP800差壓傳感器的驅動程序。接下來,我們使用設計的驅動實現(xiàn)基于SDP800差壓傳感器傳感器的流量檢測。

3.1、聲明并初始化對象

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論