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

网站设计的可行性分析好玩的微信小程序游戏排行榜前十名

网站设计的可行性分析,好玩的微信小程序游戏排行榜前十名,秦皇岛城市建设网,佛山专业网站设计方案环境传感器是一类我们很常用的传感器。它可以方便我们获取压力、温度、湿度以及空气质量等数据。在这一篇中#xff0c;我们将分析BME680环境传感器的功能#xff0c;并设计和实现BME680环境传感器的驱动。 1、功能概述 BME680是一款专为移动应用和可穿戴设备开发的集成环境…环境传感器是一类我们很常用的传感器。它可以方便我们获取压力、温度、湿度以及空气质量等数据。在这一篇中我们将分析BME680环境传感器的功能并设计和实现BME680环境传感器的驱动。 1、功能概述 BME680是一款专为移动应用和可穿戴设备开发的集成环境传感器其尺寸和低功耗是关键要求。 1.1、硬件接口 BME680由一个8针金属盖3.0 x 3.0 x0.93mm³LGA封装组成旨在根据特定的工作模式长期稳定性和高EMC稳健性进行优化消耗。可以选择采用I2C接口或者SPI接口。其管脚排布如下图 BME680环境传感器可以选择使用I2C接口或者SPI接口在不同的接口模式及下各个引脚的定义及功能有一些差别。其具体分配及定义如下所示 从上表中我们可以知道当CSB引脚接高电平VDDIO时采用的是I2C接口。此时I2C的设备地址的最后一位由SDO引脚的电平决定。所以设备地址计7位为0x76或0x77计8位则是0xEC或0xEE。 当CSB引脚用作片选信号时则使用SPI接口。SPI接口支持模式0CPOL0CPHA0和模式3CPOL1CPHA1。同时支持3线SPI和4线SPI。控制字节的最高位为0时表示写为1时表示读。 1.2、内置传感器 BME680扩展了博世现有的环境传感器系列首次集成了高线性度和高精度的气体压力湿度和温度传感器。 1.2.1、气体传感器 BME680内的气体传感器可以检测各种气体以测量个人健康的空气质量。BME680可检测到的气体包括油漆如甲醛油漆脱漆剂清洁用品家具等的挥发性有机化合物VOC。大气质量传感器的特性参数如下 BME680采用了博世软件环境群组解决方案。该解决方案使用智能算术方法将空气质量索引IAQ作为输出。该指标将IAQ划分为0到500的索引数值用以指示IAQ具体划分如下所示 1.2.2、湿度传感器 BME680集成了湿度传感器用于外部环境中湿度数据的采集。湿度传感器的性能参数如下 1.2.3、压力传感器 BME680集成有大气压力传感器用于检测外部环境的绝对压力。压力传感器的性能参数如下 1.2.4、温度传感器 BME680也集成了温度传感器用以检测温度数据温度数据除了指示环境温度外同时用于压力和湿度的补偿计算。温度传感器的性能参数如下 1.3、数据存储结构 BME680采用特定的存储器区域来存储控制及数据信息。存储的数据包括测量数据、控制信息以及校准数据。 对于温度传感器包括3个校准参数和一个ADC测量数据其测量数据和校准数据的存储结构及地址如下 对于压力传感器包括10个计算校准数据和一个ADC转换数据其测量数据的校准数据存储结构及地址如下 对于湿度传感器包括7个计算校准数据和一个ADC转换数据其测量数据的校准数据存储结构及地址如下 大气质量传感器包括3个计算校准数据、一个加热器范围存储数据、一个加热器电阻校准因子存储数据、气体ADC测量数据、气体范围数据以及范围转换错误其测量数据的校准数据存储结构及地址如下 BME680环境传感器寄存器都是8位的所有的操作均通过对寄存器的读写来实现。全部控制寄存器及数据寄存器的结构和地址如下 这里我们需要说明一下BME680的存储器地址范围是0x00~0xFF在I2C接口通讯时通讯采用的是8位寄存器地址正好符合对应的寻址范围。但是采用SPI接口通讯时寄存器地址的最高为被用于区分读写操作所以地址只有7位存储空间被分为2页。具体如下 所以在使用SPI接口时需要分辨是哪一页。当前操作的是哪一页由Status寄存器来决定。 2、驱动设计与实现 我们对BME680环境传感器的基本情况已经有了整体了解接下来我们将为BME680环境传感器设计并实现驱动程序。 2.1、对象定义 我们依然是采用基于对象的操作。所以我们需要定义对象所以我们需要抽象出对象类型并对我们想要操作的对象进行初始化。 2.1.1、对象抽象 对于一个对象来说一般包括有属性和操作两方面的内容。接下来我们就从这两个方面分析BME680环境传感器的对象。 我们需要从BME680对象抽象出其属性这些属性能够定义一个对象的特点并将其与其它对象区别开来。BME680支持SPI通讯和I2C通讯所以我们将通讯端口作为属性以规定对象的通讯方式。在使用I2C时设备有地址以区别不同的设备所以我们将I2C设备地址也定义为属性。每台BME680都有一个ID用以区别于其它设备所以我们将它定义为对象的属性。还有配置寄存器、测量控制寄存器、湿度控制寄存器、气体控制寄存器都记录了设备的配置状态所以我们也将它们作为属性。每台设备都有特定的校准数据这些校准数据每次数据检测都是需要的所以我们用属性将它们记录下来。还有测量数据它们标识了设备当前的工作状态所以我们将它们也作为属性。 接下来我们分析BME680的操作。首先来讲我们肯定要与BME680交互但我们对BME680的读写依赖于具体的硬件平台所以我们将它们作为对象的操作。在进行相关操作时我们需要控制时序则需要使用延时操作但延时处理总是依赖于具体的软硬件平台所以我们将延时处理作为对象的操作。而使用SPI时没有设备地址但有片选信号如何操作片选信号依赖于硬件平台我们将对片选的操作定义为对象的操作函数。 根据上述的分析我们可以得到BME680环境传感器的对象类型如下 /*定义BME680操作对象*/ typedef struct BME680Object{uint8_t chipID;       //芯片IDuint8_t bmeAddress;         //I2C通讯时的设备地址uint8_t memeryPage;       //用于在SPI接口时记录当前所处的内存页uint8_t config;                         //配置寄存器uint8_t ctrlMeas;                 //测量控制寄存器uint8_t ctrlHumi;              //湿度测量控制寄存器uint8_t ctrlGas0;               //气体控制寄存器0uint8_t ctrlGas1;               //气体控制寄存器1uint8_t resHeat;uint8_t gasWait;BME680PortType port;                                              //接口选择BME680CalibParamType caliPara;   //校准参数#if BME680_COMPENSATION_SELECTED (0)int32_t temperature;         //温度值int32_t pressure;                      //压力值int32_t humidity;                     //湿度值int32_t gasResistence;      //大气质量电阻值int32_t iaq;                                      //空气质量水平 #elsefloat temperature;             //温度值float pressure;                          //压力值float humidity;                         //湿度值float gasResistence;   //大气质量电阻值float iaq;                                          //空气质量水平 #endifvoid (*Read)(struct BME680Object *bme,uint8_t regAddress,uint8_t *rData,uint16_t rSize);       //读数据操作指针void (*Write)(struct BME680Object *bme,uint8_t regAddress,uint8_t command);    //谢数据操作指针void (*Delayms)(volatile uint32_t nTime);       //延时操作指针void (*ChipSelect)(BME680CSType cs);    //使用SPI接口时片选操作 }BME680ObjectType; 片选操作有一点需要注意如果片选信号在硬件电路上固定有效时可以将NULL给它同样在SPI接口时也需要将NULL给它。 2.1.2、对象初始化函数 一个对象必须对其进行初始化才可使用。初始化对象主要有四个方面的内容检查对象赋值的合法性属性赋初值为对象操作指定函数指针对象所指向设备的初始配置。据此我们可以编写BME680环境传感器的初始化函数如下 /*实现BME680初始化配置*/ void BME680Initialization(BME680ObjectType *bme,       //BMP280对象uint8_t bmeAddress,         //I2C接口是设备地址BME680PortType port,    //接口选择BME680IIRFilterType filter,                //过滤器BME680SPI3wUseType spi3W_en,   //3线SPI控制BME680TempSampleType osrs_t,       //温度精度BME680PresSampleType osrs_p,         //压力精度BME680SPI3wIntType spi3wint_en,//3线SPI中断控制BME680HumiSampleType osrs_h,       //湿度精度BME680GasRunType run_gas,      //气体运行设置BME680HeaterSPType nb_conv,  //加热器设定点选择BME680HeaterOffType heat_off, //加热器关闭uint16_t duration,      //TPHG测量循环周期ms单位uint8_t tempTarget,   //加热器的目标温度BME680Read Read,  //读数据操作指针BME680Write Write,       //写数据操作指针BME680Delayms Delayms,           //延时操作指针BME680ChipSelect ChipSelect     //片选操作指针) {uint8_t try_count 5;uint8_t regValue0;if((bmeNULL)||(ReadNULL)||(WriteNULL)||(DelaymsNULL)){return;}bme-ReadRead;bme-WriteWrite;bme-DelaymsDelayms;bme-portport;if(bme-portBME680_I2C){if((bmeAddress0xEC)||(bmeAddress0xEE)){bme-bmeAddressbmeAddress;}else if((bmeAddress0x76)||(bmeAddress0x77)){bme-bmeAddress(bmeAddress1);}else{return;}bme-ChipSelectNULL;}else{if(ChipSelect!NULL){bme-ChipSelectChipSelect;}else{bme-ChipSelectBME680ChipSelectDefault;}}bme-chipID0x00;bme-pressure0.0;bme-temperature25.0;bme-humidity0.0;bme-bmeAddress0x00;bme-caliPara.t_fine0;if(!ObjectIsValid(bme)){return;}while(try_count--){ReadBME680Register(bme,REG_BME680_ID,regValue,1);bme-chipIDregValue;if(0x61bme-chipID){BME680SoftReset(bme);break;}}if(try_count){uint8_t waitTime;waitTimeCalcProfileDuration(bme,duration,osrs_t,osrs_p,osrs_h);//控制寄存器配置ConfigControlRegister(bme,filter,spi3W_en,osrs_t,osrs_p,spi3wint_en,osrs_h,run_gas,nb_conv,heat_off,waitTime,tempTarget);//读取校准值GetBME680CalibrationData(bme);} } 2.2、对象操作 每一个对象都有操作我们使用对象的目的当然是通过操作对象来获取我们需要的数据。所以开发驱动时对象的操作才是我们主要的工作内容。在这里对BME680的操作就是对其寄存器的操作。 2.2.1、写寄存器操作 我们已经说过了对BME680的操作都是通过读写寄存器实现的。这里我们先来看写寄存器。在I2C接口方式下写寄存器操作是在从站地址的最后一位来识别的再加上要写的寄存器地址和数据来实现的这也是I2C协议的标准做法。其时序图如下所示 而在SPI接口方式下由于SPI并未有设备地址也不存在用从还在那地址最后为来标记读写的模式。通常一些设备需要定义操作码来实现读写区分但BME680采取了将寄存器地址的最高位置零表示为写。之所以可以这样定义是因为BME680寄存器地址分配的特殊性决定的。改变寄存器地址的最高位也能区分不同的寄存器绝不会重复。在SPI接口方式下写寄存器的时序图如下所示 根据上述描述和时序图我们可以实现写BME680环境传感器寄存器的程序。 /* 向BME680寄存器写一个字节 */ static void WriteBME680Register(BME680ObjectType *bme,uint8_t regAddress,uint8_t command) {if(ObjectIsValid(bme)){if(bme-portBME680_SPI){bme-ChipSelect(BME680CS_Enable);bme-Delayms(1);SetMemeryPageNumber(bme,regAddress);regAddress0x7F;bme-Delayms(1);bme-Write(bme,regAddress,command);bme-Delayms(1);bme-ChipSelect(BME680CS_Disable);}else{bme-Write(bme,regAddress,command);}} } 2.2.2、读寄存器操作 读寄存器的处理方式与写寄存器是类似。在I2C接口方式下将从站地址的最低位置1来表示读。在I2C接口方式下读寄存器的时序图如下所示 而在SPI接口方式下通过将寄存器地址的最改为置1来标识为读操作。事实上所有寄存器地址的最高为都是1所以在读操作时实际不需要做处理。在SPI接口方式下读寄存器的时序图如下所示 根据上述描述和时序图我们可以实现读BME680环境传感器寄存器的程序。 /*从BME680寄存器读取数据*/ static uint8_t ReadBME680Register(BME680ObjectType *bme,uint8_t regAddress,uint8_t *rDatas,uint16_t rSize) {uint8_t bmeError0xFF;if(ObjectIsValid(bme)){if(bme-portBME680_SPI){bme-ChipSelect(BME680CS_Enable);bme-Delayms(1);SetMemeryPageNumber(bme,regAddress);regAddress | 0x80;bme-Delayms(1);bme-Read(bme,regAddress,rDatas,rSize);bme-Delayms(1);bme-ChipSelect(BME680CS_Disable);}else{bme-Read(bme,regAddress,rDatas,rSize);}bmeError0x00;}return bmeError; } 3、驱动的使用 上一节我们设计并实现了BME680环境传感器的驱动程序但这个驱动设计的是否合理还不确定所以我们来设计一个简单的应用验证BME680环境传感器的驱动。 3.1、声明并初始化对象 使用基于对象的操作我们需要先得到这个对象所以我们先要使用前面定义的BME680环境传感器对象类型声明一个BME680环境传感器对象变量具体操作格式如下 BME680ObjectType bme680; 声明了这个对象变量并不能立即使用我们还需要使用驱动中定义的初始化函数对这个变量进行初始化。这个初始化函数所需要的输入参数如下 BME680ObjectType *bmeBMP680对象 uint8_t bmeAddressI2C接口是设备地址 BME680PortType port接口选择 BME680IIRFilterType filter过滤器 BME680SPI3wUseType spi3W_en3线SPI控制 BME680TempSampleType osrs_t温度精度 BME680PresSampleType osrs_p压力精度 BME680SPI3wIntType spi3wint_en3线SPI中断控制 BME680HumiSampleType osrs_h湿度精度 BME680GasRunType run_gas气体运行设置 BME680HeaterSPType nb_conv加热器设定点选择 BME680HeaterOffType heat_off加热器关闭 uint16_t durationTPHG测量循环周期ms单位 uint8_t tempTarget加热器的目标温度 BME680Read Read读数据操作指针 BME680Write Write写数据操作指针 BME680Delayms Delayms延时操作指针 BME680ChipSelect ChipSelect片选操作指针 对于这些参数对象变量我们已经定义了。其他的参数基本都是配置参数我们根据实际使用需求选择输入就好了。主要的是我们需要定义几个函数并将函数指针作为参数。这几个函数的类型如下 /* 定义读数据操作函数指针类型 */ typedef void (*BME680Read)(struct BME680Object *bme,uint8_t regAddress,uint8_t *rData,uint16_t rSize); /* 定义写数据操作函数指针类型 */ typedef void (*BME680Write)(struct BME680Object *bme,uint8_t regAddress,uint8_t command); /* 定义延时操作函数指针类型 */ typedef  void (*BME680Delayms)(volatile uint32_t nTime); /* 定义使用SPI接口时片选操作函数指针类型 */ typedef  void (*BME680ChipSelect)(BME680CSType cs); 对于这几个函数我们根据样式定义就可以了具体的操作可能与使用的硬件平台有关系。若采用的SPI接口则需注意片选操作片选操作函数用于多设备需要软件操作时如采用硬件片选可以传入NULL即可。同样如果采用的是I2C接口则片选可以传入NULL即可。具体函数定义如下 /*读BME680寄存器值*/ static void ReadDataFromBME680(BME680ObjectType *bme680,uint8_t regAddress,uint8_t *rData,uint16_t rSize) {HAL_I2C_Master_Transmit(bme680hi2c, bme680-bmeAddress,regAddress,1,1000);HAL_I2C_Master_Receive(bme680hi2c, bme680-bmeAddress1,rData, rSize, 1000); }/*写BME680寄存器值*/ static void WriteDataToBME680(BME680ObjectType *bme680,uint8_t regAddress,uint8_t command) {uint8_t pData[2];pData[0]regAddress;pData[1]command;HAL_I2C_Master_Transmit(bme680hi2c,bme680-bmeAddress, pData, 2,1000); } 对于延时函数我们可以采用各种方法实现。我们采用的STM32平台和HAL库则可以直接使用HAL_Delay()函数。于是我们可以调用初始化函数如下 BME680Initialization(bme680,  //BME280对象0xEC,           //I2C接口是设备地址BME680_I2C,    //接口选择BME680_IIR_FILTER_COEFF_X127,      //过滤器BME680_SPI3W_DISABLE,        //3线SPI控制BME680_TEMP_SAMPLE_X16, //温度精度BME680_PRES_SAMPLE_X16,          //压力精度BME680_SPI3W_INT_DISABLE,       ///3线SPI中断使能BME680_HUMI_SAMPLE_X16,         //湿度精度BME680_GAS_RUN_ENABLE,//气体运行设置BME680_HEATER_SP0,//加热器设定点选择BME680_HEATER_DISABLE,//加热器关闭20,//TPHG测量循环周期ms单位200,//加热器的目标温度ReadDataFromBME680,  //读数据操作指针WriteDataToBME680,     //写数据操作指针HAL_Delay,                     //延时操作指针NULL                                //片选操作指针); 3.2、基于对象进行操作 我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经将获取数据并转换为转换值的比例值接下来我们使用这一驱动开发我们的应用实例。 /*获取环境数据*/ void BME680GetEnvironmentalData(void) {float pressure;                //压力值float temperature;             //温度值float humidity;                //湿度值float gasResistance;   //气体电阻GetBME680Measure(bme680);pressurebme680.pressure;temperaturebme680.temperature;humiditybme680.humidity;gasResistancebme680.gasResistence; } 4、应用总结 我们设计并实现了BME680环境传感器的驱动程序并基于这一驱动程序设计了简单的应用。我们获得了BME680检测的全部环境数据结果也是令我们满意的这说明我们的驱动设计是正确的。 在使用驱动时需注意采用SPI接口的器件需要考虑片选操作的问题。如果片选信号是通过硬件电路来实现的我们在初始化时给其传递NULL值。如果是软件操作片选则传递我们编写的片选操作函数。而如果采用I2C接口那么在初始化时也应传递NULL值。 BME680环境传感器支持SPI和I2C两种接口而且SPI也支持3线和4线模式但我们在测试应用中只使用了I2C接口SPI接口还有待测试。BME680环境传感器在使用SPI接口时支持SPI模式0CPOLCPHA0和模式3CPOLCPHA1。而在使用I2C接口时支持标准模式、快速模式以及高速模式。而且在使用I2C接口时SDO引脚必须接高电平或低电平以确定设备地址。 BME680环境传感器有2种工作模式休眠模式和强制模式。在设备上电后就进入休眠模式在这种模式下设备不执行测量工作。一旦启动强制模式则执行一遍TPHG循环检测。模式设定的具体定义如下 对于BME680环境传感器有一个测量范围寄存器这个寄存器的值对应两组计算常数这下常数用于测量值的计算具体如下 总的来说对BME680环境传感器的读写操作本身并不复杂但其计算与修正关系却相对复杂特别是气体质量数据更应注意。 源码下载https://github.com/foxclever/ExPeriphDriver 欢迎关注
http://www.zqtcl.cn/news/555264/

相关文章:

  • 网站域名实名认证吗做斗图的网站
  • 公司在兰州要做网站怎样选择做网站数据库表各字段详情
  • 营销型网站建设的要素搭建本地网站
  • 深圳网站建设V芯ee8888ewordpress瀑布流主 #65533;
  • 股票交易网站开发angular2做的网站有
  • 如何建立免费个人网站angularjs 网站开发
  • 湖南信息网官方网站安徽省房地产开发项目管理系统
  • a5建站无限动力网站
  • 南京网站建设王道下拉??怎么做免费网站推
  • WordPress站群 管理icp备案网站管理员有负责吗
  • 智慧团建官方网站登录做网站网站的虚拟空间
  • 自己做网站成本推广代理平台
  • wamp搭建多个网站网站设计方面有什么公司
  • 九江集团网站建设app广告对接平台
  • 个人网页网站制作模板搜索引擎营销经典案例
  • 北京自助建站系统思茅区建设局网站
  • 国外被动收入网站做的好的成都网站建设 川icp备
  • 网站的微信推广怎么做php在电子商务网站建设中的应用研究 戴书浩
  • 中山做网站有什么做logo网站
  • 建设网站要什么手续义乌简游网络科技有限公司
  • 深圳做企业网站的音乐网站设计
  • 互联网网站如何做菜鸟教程自学网
  • 网站模板上传工具网站报名照片怎么做
  • 做网站如何备案东城做企业网站多少钱
  • 建设手机网站的目的广告制作行业发展前景
  • 手工艺品网站建设目的长春有哪些网络设计公司
  • 重庆建设工程招标网站淮南58同城网
  • 有域名在本机上做网站psd素材
  • 做拍拍拍拍网站网站宣传的劣势
  • 建设银行官方网站诚聘英才亚马逊店铺出售网站