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

公司做网站的手机社区网站模板

公司做网站的,手机社区网站模板,效果图官网,免费企业网站模板下载移动设备的广泛应用增加对移动过程中各种参数的检测需求。ADXL345三轴数字加速度计可以用来检测加速度、进而测量倾斜角度等。在这一篇中#xff0c;我们将讨论ADXL345三轴数字加速度计驱动程序的设计与实现。 1、功能概述 ADXL345是一款小而薄的超低功耗3轴加速度计#x…移动设备的广泛应用增加对移动过程中各种参数的检测需求。ADXL345三轴数字加速度计可以用来检测加速度、进而测量倾斜角度等。在这一篇中我们将讨论ADXL345三轴数字加速度计驱动程序的设计与实现。 1、功能概述 ADXL345是一款小而薄的超低功耗3轴加速度计分辨率高(13位)测量范围达±16 g。数字输出数据为16位二进制补码格式可通过SPI(3线或4线)或I2C数字接口访问。采用SPI通讯接口时最大SPI时钟速度为5 MHz时序方案按照时钟极性(CPOL) 1、时钟相位(CPHA) 1执行。采用I2C通讯接口时ALT ADDRESS引脚处于高电平器件的7位I2C地址是0x1D随后为R / W位。这转化为0x3A写入0x3B读取。通过ALT ADDRESS引脚(引脚12)接地可以选择备用I2C地址0x53(随后为R / W位)。这转化为0xA6写入0xA7读取。引脚定义及封装如下 ADXL345非常适合移动设备应用。它可以在倾斜检测应用中测量静态重力加速度还可以测量运动或冲击导致的动态加速度。其高分辨率(3.9 mg/LSB)能够测量不到1.0°的倾斜角度变化。 该器件提供多种特殊检测功能。活动和非活动检测功能通过比较任意轴上的加速度与用户设置的阈值来检测有无运动发生。敲击检测功能可以检测任意方向的单振和双振动作。自由落体检测功能可以检测器件是否正在掉落。这些功能可以独立映射到两个中断输出引脚中的一个。正在申请专利的集成式存储器管理系统采用一个32级先进先出(FIFO)缓冲器可用于存储数据从而将主机处理器负荷降至最低并降低整体系统功耗。 低功耗模式支持基于运动的智能电源管理从而以极低的功耗进行阈值感测和运动加速度测量。 ADXL345是一款完整的3轴加速度测量系统可选择的测量范围有±2 g±4 g±8 g或±16 g。既能测量运动或冲击导致的动态加速度也能测量静止加速度例如重力加速度使得器件可作为倾斜传感器使用。 2、驱动设计与实现 我们对ADXL345驱动设计与其它设备一样。我们先抽象对象类型并考虑对对象的初始化和操作。 2.1、对象定义 基于对象的操作至少要包括3方面内容对象的定义对象的初值以及对象的操作。接下来我们就从这里个方面入手设计并实现ADXL345的驱动。 2.1.1、抽象对象类型 对于ADXL345也同时支持SPI接口通讯和I2C接口通讯。所以我们在抽象ADXL345对象类型时将接口类型作为属性以区别不同的特性。在使用I2C时设备有地址以区别不同的设备所以我们将I2C设备地址也定义为属性。而使用SPI时没有设备地址但有片选信号我们将对片选的操作定义为对象的操作函数。 /*定义ADXL345三轴数据结构*/ typedef struct Adxl345Object {uint8_t devAddress;uint8_t devID;Adxl345PortType port;int16_t incidence_X;int16_t incidence_Y;int16_t incidence_Z;float incidence_Xf;float incidence_Yf;float incidence_Zf;void (*ReadBytes)(struct Adxl345Object *adxluint8_t regAdduint8_t *rDatauint16_t rSize);  //读ADXL345寄存器操作void (*WriteBytes)(struct Adxl345Object *adxluint8_t regAdduint8_t *wDatauint16_t wSize);//写ADXL345寄存器操作void (*ChipSelect)(Adxl345CSType en);    //使用SPI接口时片选操作void (*Delayus)(volatile uint32_t nTime);      /*实现us延时操作*/ }Adxl345ObjectType; 2.1.2、对象初始化函数 一个对象必须赋初值方可使用所以我们还需要一个初始化函数来对对象初始化。初始化函数除了为对象属性赋初始值和给操作指定函数指针外还需要检测参数的合法性以及对硬件设备做必要的配置。基于此我们设计ADXL345的初始化函数如下 /*对ADXL345进行初始化配置*/ void Adxl345Initialization(Adxl345ObjectType *adxluint8_t devAddAdxl345PortType portAdxl345ReadBytesType readAdxl345WriteBytesType writeAdxl345ChipSelectType csAdxl345DelayType delay) {uint8_t devID0;uint8_t setValue0;if((adxlNULL)||(readNULL)||(writeNULL)||(delayNULL)){return;}if(portSPI){if(csNULL){return;}adxl-ChipSelectcs;adxl-devAddress0x00;}else{if((devAdd0xA6)||(devAdd0x3A)){adxl-devAddressdevAdd;}else if((devAdd0x53)||(devAdd0x1D)){adxl-devAddress(devAdd1);}else{adxl-devAddress0x00;}adxl-ChipSelectNULL;}adxl-portport;adxl-devID0xE5;adxl-incidence_X0;adxl-incidence_Xf0.0;adxl-incidence_Y0;adxl-incidence_Yf0.0;adxl-incidence_Z0;adxl-incidence_Zf0.0;adxl-ReadBytesread;adxl-WriteByteswrite;adxl-Delayusdelay;/*读取设备ID在每次操作前读一次*/devIDAdxl345ReadRegister(adxlREG_DEVID);if(adxl-devID!devID){return;}adxl-Delayus(300);/*配置数据格式*/setValue 0x2B;Adxl345WriteRegister(adxlREG_DATA_FORMATsetValue);adxl-Delayus(50);/*配置数据速率及功率模式*/setValue 0x0A;Adxl345WriteRegister(adxlREG_BW_RATEsetValue);adxl-Delayus(50);/*配置电源特性*/setValue 0x28;Adxl345WriteRegister(adxlREG_POWER_CTLsetValue);adxl-Delayus(50);/*配置中断使能*/setValue 0;Adxl345WriteRegister(adxlREG_INT_ENABLEsetValue);adxl-Delayus(50);/*配置X轴偏移*/Adxl345WriteRegister(adxlREG_OFSXsetValue);adxl-Delayus(50);/*配置Y轴偏移*/Adxl345WriteRegister(adxlREG_OFSYsetValue);adxl-Delayus(50);/*配置Z轴偏移*/Adxl345WriteRegister(adxlREG_OFSZsetValue);adxl-Delayus(500); } 2.2、对象操作 我们定义一个对象的目的是操作这个对象这也是驱动程序的主要内容。接下来我们就来实现对ADXL345对象的操作函数。 2.2.1、写数据操作 对ADXL345对象的写操作因为使用的接口不同其数据帧格式也会有不同。使用SPI接口时其数据帧格式如下 而使用I2C接口时可以同时写多个寄存器其数据帧格式如下 根据上述的数据帧格式和时序图我们可以编写写ADXL345的寄存器函数 /* 写ADXL345的寄存器 */ static void Adxl345WriteRegister(Adxl345ObjectType *adxluint8_t regAdduint8_t wData) {if(adxl-portSPI){adxl-ChipSelect(ADXL345CS_Enable);adxl-Delayus(50);adxl-WriteBytes(adxlregAddwData1);adxl-Delayus(50);adxl-ChipSelect(ADXL345CS_Disable);}else{adxl-WriteBytes(adxlregAddwData1);} } 2.2.2、读数据操作 对ADXL345对象的读操作也同样在使用不同的接口时拥有不同的数据帧结构。使用SPI接口时其数据帧格式如下 而在使用I2C接口时可以实现一个或多个寄存器的读操作其数据帧格式如下 根据以上的数据帧格式和时序图我们可以开发读取ADXL345的寄存器操作函数 /* 读取ADXL345的寄存器 */ static uint8_t Adxl345ReadRegister(Adxl345ObjectType *adxluint8_t regAdd) {uint8_t regValue0;if(adxl-portSPI){adxl-ChipSelect(ADXL345CS_Enable);adxl-Delayus(50);adxl-ReadBytes(adxlregAddregValue1);adxl-Delayus(50);adxl-ChipSelect(ADXL345CS_Disable);}else{adxl-ReadBytes(adxlregAddregValue1);}return regValue; } 2.2.3、测量数据输出 我们操作ADXL345对象的目的当然是获取我们想要的数据。最基本的我们开发从ADXL345获取3个坐标数据。 /*读取数据值分辨率(3.9 mg/LSB)*/ void GetValueFromAdxl345(Adxl345ObjectType *adxl) {uint8_t devID 0;uint8_t dataTemp[6];/*读取设备ID在每次操作前读一次*/devIDAdxl345ReadRegister(adxlREG_DEVID);if(adxl-devID!devID){return;}adxl-Delayus(200);/*读取三轴数据值*/Adxl345ReadMultiReg(adxlREG_DATAX0dataTemp6);/*数据解析*/adxl-incidence_X (int16_t)(dataTemp[0] ((uint16_t)dataTemp[1] 8));adxl-incidence_Y (int16_t)(dataTemp[2] ((uint16_t)dataTemp[3] 8));adxl-incidence_Z (int16_t)(dataTemp[4] ((uint16_t)dataTemp[5] 8));adxl-incidence_Xf (float)(adxl-incidence_X * 0.0039);adxl-incidence_Yf (float)(adxl-incidence_Y * 0.0039);adxl-incidence_Zf (float)(adxl-incidence_Z * 0.0039); } 3、驱动的使用 完成了驱动的设计开发我们还要使用驱动实现ADXL345的应用。与其它外设一样我们也按照实际项目的使用流程来验证之。 3.1、声明并初始化对象 首先我们使用前面定义的Adxl345ObjectType类型声明一个ADXL345对象变量。如Adxl345ObjectType adxl345 声明对象变量后还需要调用Adxl345Initialization初始化函数对ADXL345对象变量进行初始化。当然在调用初始化函数前需要考虑传入的参数。特别是几个函数指针需要实现响应的函数。需要实现的函数类型如下 typedef void (*Adxl345ReadBytesType)(struct Adxl345Object *adxluint8_t regAdduint8_t *rDatauint16_t rSize);    //读ADXL345寄存器操作 typedef void (*Adxl345WriteBytesType)(struct Adxl345Object *adxluint8_t regAdduint8_t *wDatauint16_t wSize);//写ADXL345寄存器操作 typedef void (*Adxl345ChipSelectType)(Adxl345CSType en);       //使用SPI接口时片选操作 typedef void (*Adxl345DelayType)(volatile uint32_t nTime);      /*实现us延时操作*/ 定义这几个函数后就可以将器函数指针作为实参传递给初始化函数。调用如下 Adxl345Initialization(adxl345devAddportreadwritecsdelay); 其中adxl345为需要初始化的ADXL345对象。devAdd为使用I2C通讯时的设备地址使用SPI时无用。port为通讯端口的类型SPI或者I2C。read读操作函数指针是对硬件层的封装。write为写操作函数指针是对硬件层的封装。cs为使用SPI接口时片选操作函数指针。delay为延时函数的指针。 3.2、基于对象进行操作 对象初始化完成后就可进行相应的操作。ADXL345的操作比较简单就是调用GetValueFromAdxl345函数获取我们需要的数据。具体的调用样式如下 GetValueFromAdxl345(adxl345); 这个使用比较简单因为我们在初始化时将数据格式、数据速率及功率模式、电源特性、中断使能、各轴的数据偏移量等都按我们的需要在初始化时作了配置。如果需要不同配置则需要做相应的修改。 4、应用总结 在我们的应用中我们将其设置为全分辨率±16g的测量范围读取数据与预期一致。 使用I2C接口时设备地址使用7位输入或8位输入都没问题地址一共有4种可能。其他的都为非法地址在地址输入不符合要求时会被默认初始化为广播地址。 在使用SPI接口时如果是通过软件操作片选信号则需要实现操作函数并将函数指针传递给初始化函数。如果硬件上采取永久选中的形式则可将NULL作为参数传入。 欢迎关注
http://www.zqtcl.cn/news/685756/

相关文章:

  • 西宁圆井模板我自己做的网站怎么做网站能快速赚钱
  • 根据网站集约化建设的要求直流分公司四川建设部网站
  • 网站优化平台有哪些遵义网站开发的公司有哪些
  • 推荐一下网站谢谢微盟微商城怎么样
  • 网站建设的技术指标网站做好第二年要多少钱
  • 工业设计东莞网站建设WordPress网络功能
  • 网站pv多少可以企业网站托管常见问题
  • 深圳有哪些网站建设沈阳做机床的公司网站
  • 2022年网站能用的wordpress 客户端使用
  • 社交网站建设内容如何制作橡皮泥 简单
  • 简述网站的制作流程wordpress定制分类
  • 如何自建购物网站wordpress文章编辑插件
  • 网站策划机构建筑网站、
  • 邹平做网站的公司标志设计图片大全简单
  • 广东省建设厅官方网站多少钱如何在虚拟机里面做网站
  • 上海免费网站建设模板做网站页面的软件
  • 做折页的网站个人网站有哪些
  • 服装网站建设内容wordpress媒体库只能列表
  • 北京好的做网站的公司东莞专业做淘宝网站
  • 网站结构怎么优化wordpress文章列表添加字段
  • 网站建设框架图长沙官网seo技术厂家
  • 电子商务网站建设主管的策划案html个人网站设计模板
  • 网站首页的head标签内做网站要学的教程
  • 网页设计教学网站江西省建设监督网站
  • 网站建设与发布需要什么提供网站制作公司哪家好
  • 西宁市城市道路建设规划网站探测器 东莞网站建设
  • 旅游村庄网站建设方案小程序制作价格
  • 网站地图制作软件机械加工网免费铺货
  • 网站上线有什么线上活动可以做龙华建网站多少钱
  • 门户网站系统开发建设电脑优化