




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
WordSDP800差壓傳感器的驅(qū)動設(shè)計(jì)與實(shí)現(xiàn)
(檢測)流量數(shù)據(jù)的方法有很多種,這一次我們就是使用SDP800差壓(傳感器)來測量流量數(shù)據(jù)。所以在這一篇中,我們將討論如何實(shí)現(xiàn)SDP800差壓傳感器的驅(qū)動,并使用它實(shí)現(xiàn)流量數(shù)據(jù)的檢測。
1、功能概述??SDP800差壓傳感器系列是Sensirion為大批量應(yīng)用設(shè)計(jì)的數(shù)字壓差傳感器系列。傳感器測量空氣和非腐蝕性氣體的壓力,具有極高的精度,沒有偏移。該傳感器覆蓋的壓力范圍高達(dá)±500Pa,并提供卓越的精度。其結(jié)構(gòu)及引腳定義如下圖所示:
??SDP800系列差壓傳感器具有數(shù)字2線(I2C)接口,這使得它很容易直接連接到微處理器。在I2C總線上每一臺設(shè)備都有一個(gè)地址,SDP800差壓傳感器不同的型號設(shè)備地址略有差異,具體如下表:
??雖然I2C接口基本有規(guī)范的通訊格式,但不同的設(shè)備在通訊報(bào)文的設(shè)置上還是有一下差異。這里SDP800差壓傳感器其通訊報(bào)文的格式如下:
??在這一報(bào)文格式中,除了地址和數(shù)據(jù)還有一個(gè)16位的命令。這些命令是廠商設(shè)定的,用于實(shí)現(xiàn)對SDP800差壓傳感器的各種操作。這里我們只列出數(shù)據(jù)獲取的命令。
??對于SDP800差壓傳感器操作命令還有很多如配置、復(fù)位等我們在此不作詳述。
2、驅(qū)動設(shè)計(jì)與實(shí)現(xiàn)??我們已經(jīng)簡單的描述了SDP800差壓傳感器的基本情況。這一節(jié)我們將進(jìn)一步考慮SDP800差壓傳感器的驅(qū)動設(shè)計(jì)與實(shí)現(xiàn)。
2.1、對象定義
??首先我們來考慮SDP800差壓傳感器的對象定義。關(guān)于對象總是存在對象的屬性和操作,SDP800差壓傳感器對象我們也從這兩個(gè)方面來考慮。
??我們先來分析一下SDP800差壓傳感器對象的屬性問題。SDP800差壓傳感器采用I2C接口,所以設(shè)備地址必不可少,而且每一個(gè)地址都唯一標(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í)操作函數(shù)。而這些函數(shù)的實(shí)現(xiàn)都依賴于具體的軟(硬件)平臺,所以我們將它們設(shè)置為對象的操作,以便于通過回調(diào)函數(shù)來實(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);//延時(shí)操作指針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;??有了對象類型,我們就可以獲得對象變量,但對象變量需要初始化后才能進(jìn)行各種操作,所以我們需要實(shí)現(xiàn)一個(gè)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è)計(jì)了對象變量的初始化函數(shù)。這一節(jié)我們來看一看我們所要實(shí)現(xiàn)的操作。
2.2.1、數(shù)據(jù)的獲取
??我們需要對SDP800差壓傳感器所做的首要操作就是獲取測量數(shù)據(jù)。根據(jù)不同的命令,SDP800差壓傳感器可以做單次測量,也可以做連續(xù)測量。這里我們采用連續(xù)測量的方式。連續(xù)測量設(shè)計(jì)到三類操作:開啟連續(xù)測量、讀取測量數(shù)據(jù)以及結(jié)束連續(xù)測量。根據(jù)通訊命令及報(bào)文格式要求,我們實(shí)現(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è)備控制
??有一些命令是用來實(shí)現(xiàn)對SDP800差壓傳感器的控制的,如設(shè)備的復(fù)位、休眠及各種配置。這里我們主要用到SDP800差壓傳感器的軟件復(fù)位及休眠。
/*軟件復(fù)位*/SDP800ErrorTypeSdp800SoftReset(SDP800ObjectType*sdp){Sdp800WriteCommand(sdp,COMMAND_ENTER_SLEEP_MODE);//等待20mssdp->Delayms(20);returnSDP800_ERROR_NONE;}/*進(jìn)入休眠模式*/SDP800ErrorTypeSDP800EnterSleepMode(SDP800ObjectType*sdp){Sdp800WriteCommand(sdp,COMMAND_ENTER_SLEEP_MODE);returnSDP800_ERROR_NONE;}3、驅(qū)動的使用??我們設(shè)計(jì)并實(shí)現(xiàn)了SDP800差壓傳感器的驅(qū)動程序。接下來,我們使用設(shè)計(jì)的驅(qū)動實(shí)現(xiàn)基于SDP800差壓傳感器傳感器的流量檢測。
3.1、聲明并初始化對象
??在前面我們已經(jīng)定義了SDP800差壓傳感器對象類型。在這里,我們先聲明一個(gè)SDP800差壓傳感器對象變量。
SDP800ObjectTypesdp;??有了這個(gè)對象變量,我們還需要調(diào)用初始化函數(shù)對其進(jìn)行實(shí)例化。初始化函數(shù)具有讀個(gè)參數(shù):
SDP800ObjectType*sdp,//SDP800對象uint8_ti2cAddress,//設(shè)備地址SDP800Receiverecieve,//接收函數(shù)指針SDP800Transmittransmit,//發(fā)送函數(shù)指針SDP800Delaymsdelayms//毫秒演示函數(shù)??第一個(gè)參數(shù)是需要初始化的對象變量。第二個(gè)參數(shù)則是SDP800差壓傳感器的設(shè)備地址。而后面的三個(gè)參數(shù)則是函數(shù)指針,我們需要實(shí)現(xiàn)這三個(gè)函數(shù),它們的原型定義如下:
//延時(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é)合這三個(gè)函數(shù)的原型要求以及我們所使用平臺的具體特點(diǎn),我們實(shí)現(xiàn)這幾個(gè)函數(shù)如下:
/*向(DSP)800下發(fā)指令,指令格式均為1個(gè)字節(jié)*/staticvoidWriteToSDP(SDP800ObjectType*sdp,uint8_t*wData,uint16_twSize){HAL_I2C_Master_Transmit(}/*從DSP800讀取多個(gè)字節(jié)數(shù)據(jù)的值*/staticvoidReadFromSDP(SDP800ObjectType*sdp,uint8_t*rData,uint16_trSize){HAL_I2C_Master_Receive(}??我們實(shí)現(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 風(fēng)險(xiǎn)管理的定量與定性分析試題及答案
- 制定年度培訓(xùn)目標(biāo)計(jì)劃
- 財(cái)務(wù)預(yù)測分析方案計(jì)劃
- 秘書與調(diào)研能力的建立計(jì)劃
- 創(chuàng)新教學(xué)方法的實(shí)踐與反思計(jì)劃
- 幼兒園健康教育的實(shí)施策略計(jì)劃
- 行政法與公共利益保護(hù)試題及答案
- 實(shí)現(xiàn)持續(xù)改進(jìn)與創(chuàng)新的計(jì)劃
- 利用藝術(shù)提升學(xué)術(shù)成績的方法計(jì)劃
- 抓住法學(xué)概論考試要點(diǎn)的試題及答案
- 抗菌藥物臨床應(yīng)用指導(dǎo)原則(2023年版)
- 基因奧秘智能型水潤抗衰深層治療操作流程
- 大學(xué)生創(chuàng)業(yè)計(jì)劃書word文檔(三篇)
- 土工織物防護(hù)施工
- 生產(chǎn)性服務(wù)業(yè)集聚對城市產(chǎn)業(yè)結(jié)構(gòu)優(yōu)化的影響共3篇
- 施工單位考察記錄表
- YY/T 1244-2014體外診斷試劑用純化水
- GB/T 26192-2010雙向拉伸聚丙烯可涂覆合成紙薄膜
- GB/T 2546.1-2006塑料聚丙烯(PP)模塑和擠出材料第1部分:命名系統(tǒng)和分類基礎(chǔ)
- GB/T 17702-2021電力電子電容器
- GB/T 17215.421-2008交流測量費(fèi)率和負(fù)荷控制第21部分:時(shí)間開關(guān)的特殊要求
評論
0/150
提交評論