当前位置: 首页 > news >正文

asp.net制作网站开发南宁市起全网络科技有限公司

asp.net制作网站开发,南宁市起全网络科技有限公司,杭州搜索推广公司,陈晓佳 中信建设有限责任公司绝对压力的检测是常见的需求。在我们的系统中也常常会遇到。而MS5837压力传感器也是我们进场会采用的方案。在这篇里我们将讨论并实现MS5837压力传感器的驱动。 1、功能概述 MS5837压力传感器是一种可用于电路板上#xff0c;适用于检测10-1200mbar压力范围的传感器#xf…绝对压力的检测是常见的需求。在我们的系统中也常常会遇到。而MS5837压力传感器也是我们进场会采用的方案。在这篇里我们将讨论并实现MS5837压力传感器的驱动。 1、功能概述 MS5837压力传感器是一种可用于电路板上适用于检测10-1200mbar压力范围的传感器灵敏度非常高理论上能够检测到0.01mbar的压力变化实际使用过程中测试并无明显的变化。 MS5837压力传感器采用I2C总线通讯与MCU可以实现I2C通讯。硬件连接方式如下 MS5837压力传感器拥有5类基本命令复位、读取出厂校准值、数据1转换压力值数据、数据2转换温度值数据和读取ADC的转换结果。具体分配如下 因为MS5837的地址是固定的所以一个I2C总线只能挂1个MS5837模块。其设备地址固定为0xEC。 2、驱动设计与实现 我们已经了解了MS5837的基本功能和操作方式。接下来我们就根据前面的分析实现MS5837的驱动。 2.1、对象定义 在使用该对象之前我们需要定义对象我们根据MS5837的属性和操作来定义对象。 2.1.1、对象类型抽象 为了方便操作与复用我们使用基于对象的操作。这里我们先来抽象MS5837压力传感器对象的类型该类型包含了MS5837的必要属性和对MS5837基本操作。 我们先来分析MS5837压力传感器对象的属性。MS5837压力传感器使用的是I2C通讯接口需要一个地址分辨总线上的不同设备所以我们将I2C设备地址作为MS5837压力传感器对象的一个属性。此外在计算MS5837压力传感器测量的压力、温度值时需要使用6个校准参数而且这些参数每台设备都是不一样的所以我们将这些参数作为属性来保存其值。 接下来我们再来分析MS5837压力传感器对象的操作。我们使用MS5837压力传感器时需要向其写命令和从其读数据而读写操作都依赖于具体的硬件平台所以我们将写数据和读数据作为对象的操作。此外为控制时序我们需要延时操作而延时行为的实现亦依赖于具体的软硬件平台所以我们将延时也作为对象的操作。 根据上述我们对MS5837压力传感器对象的分析我们可以抽象MS5837压力传感器的对象类型为 /* 定义MS5837对象类型 */ typedef struct MS5837Object {uint8_t devAddress;                 //设备地址uint16_t caliData[6];        //校准数据float temperature;float pressure;void (*Write)(struct MS5837Object *msuint8_t command);/*向MS5837下发指令指令格式均为1个字节*/void (*Read)(struct MS5837Object *msuint8_t *rDatauint16_t rSize);/*从MS5837读取多个字节数据的值*/void (*Delayms)(volatile uint32_t nTime);     //毫秒秒延时函数 }MS5837ObjectType; 2.1.2、对象初始化 在使用之前我们先要使用对象类型声明对象但声明的对象只是一个变量该对象变量在使用前必须初始化所以我们定义了对象初始化函数。 /* 初始化MS5837对象 */ void MS5837Initialization(MS5837ObjectType *ms,MS5837Write write,MS5837Read read,MS5837Delayms delay) {if((msNULL)||(writeNULL)||(readNULL)||(delayNULL)){return;  }ms-Writewrite;ms-Readread;ms-Delaymsdelay;ms-devAddress0b11101100;ms-pressure0.0;ms-temperature0.0;ResetForMs5837(ms);GetCalibrationData(ms); } 2.2、对象操作 完成了对象的声明与初始化之后我们就可以使用对象变量来操作对象了。关于MS5837的操作主要有设备复位、校准值获取、转换值的读取。下面将一一实现。 2.2.1、复位操作 复位操作在MS5837压力传感器有电时就可执行但一般会在上电之后需要复位一下以保持内存中的校准参数值是正确的。此外当I2C的SDA引脚因未知原因出现阻塞时复位能消除这种不确定性。复位操作只需要发送一条命令其时序图如下 /*复位MS5837操作*/ void ResetForMs5837(MS5837ObjectType *ms) {uint8_t commandCOMMAND_RESET;/*下发复位命令*/ms-SendCommand(mscommand); } 2.2.2、读取校准值 校准值是出厂时厂家校准的各种系数每台设备都有差异是固定不变的只需要一次读取就可以了共有6个系数均为16为整数。首先发送读系数的命令然后读取就可以了每次读取1个分6次读取。过程数据流如下图所示 /*读取MS5837内存寄存器的数据*/ static uint16_t ReadPromFromMs5837(MS5837ObjectType *ms,uint8_t command) {/*下发读取指定内存单元的命令*/ms-Write(ms,command);/*接收读取的指定内存单元的值*/uint8_t promValue[2];ms-Read(ms,promValue,2);uint16_t result(uint16_t)promValue[0];result(result8)(uint16_t)promValue[1];return result; } 2.2.3、读取转换值 读取转换结果值是我们的目的可以读取温度和压力两个量不过一次只能读一个。首先发送命令设定采集压力还是温度并设定精度。然后发送读取的命令最后读取对应的值。再使用校准系数计算出最终的物理值。 /*读取MS5837ADC的转换值*/ static uint32_t ReadConversionFromMs5837(MS5837ObjectType *ms,uint8_t command) {/*下发转化对象及精度配置命令*/ms-Write(ms,command);ms-Delayms(10);/*下发读取ADC的命令*/ms-Write(ms,COMMAND_ADC_READ);ms-Delayms(10);/*接收读取的ADC转换结果*/uint8_t adcValue[3];ms-Read(ms,adcValue,3);uint32_t result(uint32_t)adcValue[0];result(result8)(uint32_t)adcValue[1];result(result8)(uint32_t)adcValue[2];return result; } 这里获取的只是ADC的数字码值。我们想要得到温度和压力的物理量值还需要使用校准值通过厂家提供的公式计算得到。 3、驱动的使用 在前面我们描述了MS5837压力传感器的基本情况在此基础上设计并实现了MS5837压力传感器对象的驱动程序。这一节我们将设计一个简单的应用来验证驱动设计是否符合要求。 3.1、声明并初始化对象 使用基于对象的操作我们需要先得到这个对象所以我们先要使用前面定义的MS5837压力传感器对象类型声明一个MS5837压力传感器对象变量具体操作格式如下 MS5837ObjectType ms5837; 声明了这个对象变量并不能立即使用我们还需要使用驱动中定义的初始化函数对这个变量进行初始化。这个初始化函数所需要的输入参数如下 MS5837ObjectType *msMS5837对象 MS5837Write write向MS5837写数据函数指针 MS5837Read read从MS5837读数据函数指针 MS5837Delayms delayms毫秒延时函数指针 对于这些参数对象变量我们已经定义了。我们需要重点关注几个函数指针首先要定义这几个函数并将函数指针作为参数。这几个函数的类型如下 /*向MS5837下发指令指令格式均为1个字节*/ typedef void (*MS5837Write)(struct MS5837Object *ms,uint8_t command);/*从MS5837读取多个字节数据的值*/ typedef void (*MS5837Read)(struct MS5837Object *ms,uint8_t *rData,uint16_t rSize);/*毫秒秒延时函数*/ typedef void (*MS5837Delayms)(volatile uint32_t nTime); 对于这几个函数我们根据样式定义就可以了具体的操作可能与使用的硬件平台有关系。片选操作函数用于多设备需要软件操作时如采用硬件片选可以传入NULL即可。具体函数定义如下 /*通过I2C1接口下发命令*/ static void SendCommandToMS5837(MS5837ObjectType *ms,uint8_t command) {HAL_I2C_Master_Transmit(ms5837hi2c,ms-devAddress,command,1,1000); }/*通过I2C1接口读取数据*/ static void GetDatasFromMS5837(MS5837ObjectType *ms,uint8_t *rData,uint16_t rSize) {HAL_I2C_Master_Receive(ms5837hi2c,ms-devAddress,rData,rSize,1000); } 对于延时函数我们可以采用各种方法实现。我们采用的STM32平台和HAL库则可以直接使用HAL_Delay()函数。于是我们可以调用初始化函数如下 MS5837Initialization(ms5837,SendCommandToMS5837,GetDatasFromMS5837,HAL_Delay); 3.2、基于对象进行操作 我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经将获取数据并转换为转换值的比例值接下来我们使用这一驱动开发我们的应用实例。 /*获取压力变送器数据*/ void MS5837GetMeasureData(void) {float pressure0.0;float temperature0.0;GetMS5837ConversionValue(ms5837,MS5837_OSR8192,MS5837_OSR8192);pressurems5837.pressure;temperaturems5837.temperature;} 4、应用总结 我们已经实现了MS5837压力传感器的驱动程序也设计了一个简单的应用来验证这一驱动程序。验证的结果与我们预期一样得到了我们需要的数据。我们也曾将这一驱动应用于实际项目效果也是令人满意的。 使用驱动是需要注意MS5837压力传感器虽然采用了I2C接口但它的地址是固定的所以一条总线上只能有一台MS5837压力传感器。所以在驱动中地址是固化在驱动程序中不可修改的。 源码下载https://github.com/foxclever/ExPeriphDriver 欢迎关注
http://www.pierceye.com/news/396844/

相关文章:

  • 网站开发搜索功能怎么实现中小网站建设都有哪些方案
  • 学科网站建设网页制作和网页制作
  • 公司网站模板大全网站文章编辑
  • 旅游网站建设的总结wordpress多域名移动主题
  • 深圳做网站推荐哪家公司好附近广告公司联系电话
  • 网站建设和网站优化哪个更重要提供邯郸网站建设
  • 做网站一般把宽度做多少合肥优化
  • 石家庄做网站公司汉狮价格猴痘的治疗方法
  • 自己有网站 做app吗深圳罗湖企业网站推广
  • 廊坊建设局网站6阿里云虚拟主机网站
  • 设计一个电商网站西安seo盐城
  • 上海网站公司建设网页设计网站欣赏
  • 平台网站如何做推广1280的界面网站做多宽
  • 男男做爰视频网站微信扫码点餐小程序怎么做
  • 哈尔滨做网站的价格如何利用wordpress搭建一个发卡网
  • 商会建设网站说明网站建设属于技术活吗
  • 免费申请手机网站公司画册模板免费下载
  • 网站建设策划做一个卖货的app要多少钱
  • 泉州网站平台建设公司网站服务器出错了怎么办
  • 佛山网站设计专业手机网站模板设计软件
  • 顺德网站优化公司wordpress 去广告
  • 自己建企业网站怎么建免费大数据查询
  • 短视频素材免费下载网站江西省城乡建设厅网站
  • 西安做网站公司工资wordpress 导航 分类
  • 网站建设免费教程网页设计图片高清
  • 网站后台源代码东直门小学的网站建设
  • 无锡建设局评职称网站分析 网站
  • 宜昌需要做网站建设的公司python做调查问卷网站
  • 乐陵森大最好的seo优化公司
  • php网站开发实施方案福建建筑信息平台