SDP800差压传感器的驱动设计与实现_第1页
SDP800差压传感器的驱动设计与实现_第2页
SDP800差压传感器的驱动设计与实现_第3页
SDP800差压传感器的驱动设计与实现_第4页
SDP800差压传感器的驱动设计与实现_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

WordSDP800差压传感器的驱动设计与实现

(检测)流量数据的方法有很多种,这一次我们就是使用SDP800差压(传感器)来测量流量数据。所以在这一篇中,我们将讨论如何实现SDP800差压传感器的驱动,并使用它实现流量数据的检测。

1、功能概述  SDP800差压传感器系列是Sensirion为大批量应用设计的数字压差传感器系列。传感器测量空气和非腐蚀性气体的压力,具有极高的精度,没有偏移。该传感器覆盖的压力范围高达±500Pa,并提供卓越的精度。其结构及引脚定义如下图所示:

  SDP800系列差压传感器具有数字2线(I2C)接口,这使得它很容易直接连接到微处理器。在I2C总线上每一台设备都有一个地址,SDP800差压传感器不同的型号设备地址略有差异,具体如下表:

  虽然I2C接口基本有规范的通讯格式,但不同的设备在通讯报文的设置上还是有一下差异。这里SDP800差压传感器其通讯报文的格式如下:

  在这一报文格式中,除了地址和数据还有一个16位的命令。这些命令是厂商设定的,用于实现对SDP800差压传感器的各种操作。这里我们只列出数据获取的命令。

  对于SDP800差压传感器操作命令还有很多如配置、复位等我们在此不作详述。

2、驱动设计与实现  我们已经简单的描述了SDP800差压传感器的基本情况。这一节我们将进一步考虑SDP800差压传感器的驱动设计与实现。

2.1、对象定义

  首先我们来考虑SDP800差压传感器的对象定义。关于对象总是存在对象的属性和操作,SDP800差压传感器对象我们也从这两个方面来考虑。

  我们先来分析一下SDP800差压传感器对象的属性问题。SDP800差压传感器采用I2C接口,所以设备地址必不可少,而且每一个地址都唯一标识一台设备,所以我们将其设定为对象的属性。此外,SDP800差压传感器的产品编号和产品序列号都是唯一标识SDP800差压传感器设备,所以我们也将其设定为属性。我们也希望记录设备的状态、测量的压力、温度以及差压系数等。这些两标识了SDP800差压传感器设备的状态,所以我们也将其作为对象的属性。

  而对象的操作,SDP800差压传感器采用I2C接口,所以需要接收和发送数据、为了控制时序我们需要延时操作函数。而这些函数的实现都依赖于具体的软(硬件)平台,所以我们将它们设置为对象的操作,以便于通过回调函数来实现对象平台无关性。根据上述分析我们可以定义SDP800差压传感器的对象类型如下:

/*定义SDP800对象类型*/typedefstructSDP800Object{uint8_tdev(Ad)dress;//SDP800对象的地址uint8_tstatus;//SDP800状态信息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);//发送数据操作指针}SDP800ObjectType;  有了对象类型,我们就可以获得对象变量,但对象变量需要初始化后才能进行各种操作,所以我们需要实现一个SDP800差压传感器对象变量初始化的函数。

/*SDP800对象初始化配置*/SDP800ErrorTypeSdp800Initialization(SDP800ObjectType*sdp,//SDP800对象uint8_ti2cAddress,//设备地址SDP800Receiverecieve,//接收函数指针SDP800Transmittransmit,//发送函数指针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差压传感器的对像类型,也设计了对象变量的初始化函数。这一节我们来看一看我们所要实现的操作。

2.2.1、数据的获取

  我们需要对SDP800差压传感器所做的首要操作就是获取测量数据。根据不同的命令,SDP800差压传感器可以做单次测量,也可以做连续测量。这里我们采用连续测量的方式。连续测量设计到三类操作:开启连续测量、读取测量数据以及结束连续测量。根据通讯命令及报文格式要求,我们实现数据连续读取的代码如下:

/*连续读取测量值*/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;}/*启动连续测量*/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;}/*停止连续测量*/SDP800ErrorTypeSdp800StopContinousMeasurement(SDP800ObjectType*sdp){Sdp800WriteCommand(sdp,COMMAND_STOP_CONTINOUS_MEASUREMENT);returnSDP800_ERROR_NONE;}2.2.2、设备控制

  有一些命令是用来实现对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、驱动的使用  我们设计并实现了SDP800差压传感器的驱动程序。接下来,我们使用设计的驱动实现基于SDP800差压传感器传感器的流量检测。

3.1、声明并初始化对象

  在前面我们已经定义了SDP800差压传感器对象类型。在这里,我们先声明一个SDP800差压传感器对象变量。

SDP800ObjectTypesdp;  有了这个对象变量,我们还需要调用初始化函数对其进行实例化。初始化函数具有读个参数:

SDP800ObjectType*sdp,//SDP800对象uint8_ti2cAddress,//设备地址SDP800Receiverecieve,//接收函数指针SDP800Transmittransmit,//发送函数指针SDP800Delaymsdelayms//毫秒演示函数  第一个参数是需要初始化的对象变量。第二个参数则是SDP800差压传感器的设备地址。而后面的三个参数则是函数指针,我们需要实现这三个函数,它们的原型定义如下:

//延时操作指针typedefvoid(*SDP800Delayms)(volatileuint32_tnTime);//接收数据操作指针typedefvoid(*SDP800Receive)(structSDP800Object*sdp,uint8_t*rData,uint16_trSize);//发送数据操作指针typedefvoid(*SDP800Transmit)(structSDP800Object*sdp,uint8_t*tData,uint16_ttSize);  结合这三个函数的原型要求以及我们所使用平台的具体特点,我们实现这几个函数如下:

/*向(DSP)800下发指令,指令格式均为1个字节*/staticvoidWriteToSDP(SDP800ObjectType*sdp,uint8_t*wData,uint16_twSize){HAL_I2C_Master_Transmit(}/*从DSP800读取多个字节数据的值*/staticvoidReadFromSDP(SDP800ObjectType*sdp,uint8_t*rData,uint16_trSize){HAL_I2C_Master_Receive(}  我们实现了这些函数后,我们就可以将这些

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论