外设驱动库开发笔记22:ADXL345三轴数字加速度计驱动

2023-11-06

移动设备的广泛应用增加对移动过程中各种参数的检测需求。ADXL345三轴数字加速度计可以用来检测加速度、进而测量倾斜角度等。在这一篇中,我们将讨论ADXL345三轴数字加速度计驱动程序的设计与实现。

1、功能概述

ADXL345是一款小而薄的超低功耗3轴加速度计,分辨率高(13),测量范围达±16 g。数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)I2C数字接口访问。采用SPI通讯接口时,最大SPI时钟速度为5 MHz,时序方案按照时钟极性(CPOL)= 1、时钟相位(CPHA)= 1执行。采用I2C通讯接口时,ALT ADDRESS引脚处于高电平,器件的7I2C地址是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 *adxl,uint8_t regAdd,uint8_t *rData,uint16_t rSize);  //读ADXL345寄存器操作
       void (*WriteBytes)(struct Adxl345Object *adxl,uint8_t regAdd,uint8_t *wData,uint16_t wSize);//写ADXL345寄存器操作
       void (*ChipSelect)(Adxl345CSType en);    //使用SPI接口时,片选操作
       void (*Delayus)(volatile uint32_t nTime);      /*实现us延时操作*/
}Adxl345ObjectType;

2.1.2、对象初始化函数

一个对象必须赋初值方可使用,所以我们还需要一个初始化函数来对对象初始化。初始化函数除了为对象属性赋初始值和给操作指定函数指针外,还需要检测参数的合法性以及对硬件设备做必要的配置。基于此我们设计ADXL345的初始化函数如下:

/*对ADXL345进行初始化配置*/
void Adxl345Initialization(Adxl345ObjectType *adxl,uint8_t devAdd,
                           Adxl345PortType port,
                           Adxl345ReadBytesType read,
                           Adxl345WriteBytesType write,
                           Adxl345ChipSelectType cs,
                           Adxl345DelayType delay)
{
       uint8_t devID=0;
       uint8_t setValue=0;
      
       if((adxl==NULL)||(read==NULL)||(write=NULL)||(delay==NULL))
       {
              return;
       }
      
       if(port==SPI)
       {
              if(cs==NULL)
              {
                     return;
              }
             
              adxl->ChipSelect=cs;
              adxl->devAddress=0x00;
       }
       else
       {
              if((devAdd==0xA6)||(devAdd==0x3A))
              {
                     adxl->devAddress=devAdd;
              }
              else if((devAdd==0x53)||(devAdd==0x1D))
              {
                     adxl->devAddress=(devAdd<<1);
              }
              else
              {
                     adxl->devAddress=0x00;
              }
              adxl->ChipSelect=NULL;
       }
      
       adxl->port=port;
       adxl->devID=0xE5;
       adxl->incidence_X=0;
       adxl->incidence_Xf=0.0;
       adxl->incidence_Y=0;
       adxl->incidence_Yf=0.0;
       adxl->incidence_Z=0;
       adxl->incidence_Zf=0.0;
      
       adxl->ReadBytes=read;
       adxl->WriteBytes=write;
       adxl->Delayus=delay;
      
       /*读取设备ID,在每次操作前读一次*/
       devID=Adxl345ReadRegister(adxl,REG_DEVID);
       if(adxl->devID!=devID)
       {
              return;
       }
       adxl->Delayus(300);
 
       /*配置数据格式*/
       setValue = 0x2B;
       Adxl345WriteRegister(adxl,REG_DATA_FORMAT,setValue);
       adxl->Delayus(50);
   
       /*配置数据速率及功率模式*/
       setValue = 0x0A;
       Adxl345WriteRegister(adxl,REG_BW_RATE,setValue);
       adxl->Delayus(50);
   
       /*配置电源特性*/
       setValue = 0x28;
       Adxl345WriteRegister(adxl,REG_POWER_CTL,setValue);
       adxl->Delayus(50);
   
       /*配置中断使能*/
       setValue = 0;
       Adxl345WriteRegister(adxl,REG_INT_ENABLE,setValue);
       adxl->Delayus(50);

       /*配置X轴偏移*/
       Adxl345WriteRegister(adxl,REG_OFSX,setValue);
       adxl->Delayus(50);

       /*配置Y轴偏移*/
       Adxl345WriteRegister(adxl,REG_OFSY,setValue);
       adxl->Delayus(50);

       /*配置Z轴偏移*/
       Adxl345WriteRegister(adxl,REG_OFSZ,setValue);
       adxl->Delayus(500);
}

2.2、对象操作

我们定义一个对象的目的是操作这个对象,这也是驱动程序的主要内容。接下来我们就来实现对ADXL345对象的操作函数。

2.2.1、写数据操作

ADXL345对象的写操作因为使用的接口不同其数据帧格式也会有不同。使用SPI接口时,其数据帧格式如下:

而使用I2C接口时,可以同时写多个寄存器,其数据帧格式如下:

根据上述的数据帧格式和时序图我们可以编写写ADXL345的寄存器函数:

/* 写ADXL345的寄存器 */
static void Adxl345WriteRegister(Adxl345ObjectType *adxl,uint8_t regAdd,uint8_t wData)
{
       if(adxl->port==SPI)
       {
              adxl->ChipSelect(ADXL345CS_Enable);
              adxl->Delayus(50);
              adxl->WriteBytes(adxl,regAdd,&wData,1);
              adxl->Delayus(50);
              adxl->ChipSelect(ADXL345CS_Disable);
       }
       else
       {
              adxl->WriteBytes(adxl,regAdd,&wData,1);
       }
}

2.2.2、读数据操作

ADXL345对象的读操作也同样在使用不同的接口时拥有不同的数据帧结构。使用SPI接口时,其数据帧格式如下:

而在使用I2C接口时,可以实现一个或多个寄存器的读操作,其数据帧格式如下:

根据以上的数据帧格式和时序图我们可以开发读取ADXL345的寄存器操作函数:

/* 读取ADXL345的寄存器 */
static uint8_t Adxl345ReadRegister(Adxl345ObjectType *adxl,uint8_t regAdd)
{
       uint8_t regValue=0;
      
       if(adxl->port==SPI)
       {
              adxl->ChipSelect(ADXL345CS_Enable);
              adxl->Delayus(50);
              adxl->ReadBytes(adxl,regAdd,&regValue,1);
              adxl->Delayus(50);
              adxl->ChipSelect(ADXL345CS_Disable);
       }
       else
       {
              adxl->ReadBytes(adxl,regAdd,&regValue,1);
       }
      
       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,在每次操作前读一次*/
  devID=Adxl345ReadRegister(adxl,REG_DEVID);
  if(adxl->devID!=devID)
  {
     return;
  }
  adxl->Delayus(200);
 
  /*读取三轴数据值*/
  Adxl345ReadMultiReg(adxl,REG_DATAX0,dataTemp,6);
 
  /*数据解析*/
  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或者I2Cread读操作函数指针,是对硬件层的封装。write为写操作函数指针,是对硬件层的封装。cs为使用SPI接口时,片选操作函数指针。delay为延时函数的指针。

3.2、基于对象进行操作

对象初始化完成后就可进行相应的操作。ADXL345的操作比较简单就是调用GetValueFromAdxl345函数获取我们需要的数据。具体的调用样式如下:

GetValueFromAdxl345(&adxl345);

这个使用比较简单,因为我们在初始化时将数据格式、数据速率及功率模式、电源特性、中断使能、各轴的数据偏移量等都按我们的需要在初始化时作了配置。如果需要不同配置则需要做相应的修改。

4、应用总结

在我们的应用中,我们将其设置为全分辨率,±16g的测量范围,读取数据与预期一致。

使用I2C接口时,设备地址使用7位输入或8位输入都没问题,地址一共有4种可能。其他的都为非法地址,在地址输入不符合要求时,会被默认初始化为广播地址。

在使用SPI接口时,如果是通过软件操作片选信号则需要实现操作函数并将函数指针传递给初始化函数。如果硬件上采取永久选中的形式则可将NULL作为参数传入。

欢迎关注:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

外设驱动库开发笔记22:ADXL345三轴数字加速度计驱动 的相关文章

  • SPI基础概念

    文章目录 目的 物理接线 极性和相位 信号时序 总结 目的 SPI Serial Perripheral Interface 是一种非常常用的全双工接口 这个接口在非常简单的机制下达到了比较高的通讯速度 比它通讯速度更高的常见的要不是并口
  • linux内核I2C子系统详解——看这一篇就够了

    1 I2C通信协议 参考博客 I2C通信协议详解和通信流程分析 2 通过KXTF9 2050芯片分析I2C协议 参考博客 通过KXTF9 2050芯片分析I2C协议 3 I2C子系统框架 1 I2C子系统分为三层 I2C核心层 I2C适配器
  • DAC MCP4725 i2c 驱动(linux)

    mcp4725是一款低功耗 高精度 单通道 拥有EEPROM的12位的dac 由于最近项目中使用到了该芯片所以贴出来给大家参考 步进电机电机芯片半流锁定 本贴呢非项目中使用的平台 主要是想在linux 下实现对该器件的使用 实现一个简单的i
  • STM32设置为I2C从机模式(HAL库版本)

    STM32设置为I2C从机模式 HAL库版本 目录 STM32设置为I2C从机模式 HAL库版本 前言 1 硬件连接 2 软件编程 2 1 步骤分解 2 2 测试用例 3 运行测试 3 1 I2C连续写入 3 2 I2C连续读取 3 3 I
  • SPI技术-JDK实现

    SPI是什么 SPI全称Service Provider Interface 是Java提供的一套用来被第三方实现或者扩展的API 它可以用来启用框架扩展和替换组件 Java SPI 实际上是 基于接口的编程 策略模式 配置文件 组合实现的
  • EEPROM芯片(24c02)使用详解(I2C通信时序分析、操作源码分析、原理图分析)

    1 前言 1 本文主要是通过24c02芯片来讲解I2C接口的EEPROM操作方法 包含底层时序和读写的代码 2 大部分代码是EEPROM芯片通用的 但是其中关于某些时间的要求 是和具体芯片相关的 和主控芯片和外设芯片都有关系 需要具体分析
  • BH1750 传感器实战教学 —— 驱动移植篇

    前言 上一篇 BH1750 的实战教学我们说明的实际应用中传感器的硬件设计 BH1750 传感器实战教学 硬件设计篇 我们提到过在本次使用的芯片为 51 内核 I2C 通讯驱动实现与 STM32 上还是有很大区别的 对于我们来说 已经掌握了
  • ADXL345传感器介绍

    今天小白给大家介绍一款当下比较流行的三轴加速度传感器 ADXL345 通过本文的介绍让大家学会如何使用这款功能强大的三轴加速度传感器 欢迎一起交流学习 1 ADXL345传感器简介 该款传感器如下图 ADXL345 是 ADI 公司推出的基
  • Spring Factories

    该文章转载自 https blog csdn net lvoyee article details 82017057 Spring Boot中有一种非常解耦的扩展机制 Spring Factories 这种扩展机制实际上是仿照Java中的S
  • SPI总线verilog hdl实现(1)SPI通信

    SPI总线传输只需要4根线就能完成 这四根线的作用分别如下 SCK Serial Clock SCK是串行时钟线 作用是Master向Slave传输时钟信号 控制数据交换的时机和速率 MOSI Master Out Slave in 在SP
  • 谁在驱动程序代码中调用“probe”函数?

    我试图理解thisomap2 panda 板的 mcspi 驱动程序代码 我不明白谁打电话probe函数以及调用链是什么this驱动代码 设备连接时如何通知驱动程序 探针函数由spi omap2 mcspi c保存在static struc
  • Raspberry Pi 4 I2C 总线无法正常工作

    尽管 i2cDetect 确实检测到目标 但我的 Raspberry Pi 4 Model B 上的 I2C 总线无法正常工作 我尝试使用 Raspberry Pi Sense HAT 和 SSD1306 OLED 显示屏以及带有 I2C
  • 找不到i2c注册宏?

    我正在 raspi 上开发 I2C 驱动程序 register I2C device static static const struct i2c board info rasp i2c devices mbed mbedID in the
  • 在 U-Boot 中使用 I2C 读取多个字节

    我的 Freescale p1022tw 板的 I2C 驱动程序有问题 U Boot 的控制台上有一个从 I2C 设备读取的命令 i2c md chip address 0 1 2 of objects 当我从 id 为 0x60 地址为
  • 如何将 I2C 地址传递给 Adafruit CircuitPython 代码? (运行 ADS1115)

    我正在尝试使用两个 I2C 地址 0x48 0x49 在一个 Raspberry Pi 上运行两个 Adafruit ADS1115 每个设备的地址可以通过将 ADDR 引脚连接为高电平 0x49 或使其悬空 默认为 0x48 来设置 我已
  • Python - 如何使用 ioctl 或 spidev 从设备读取输入?

    我有一个提供它的供应商提供了一些 C 代码来监听按钮按下 该代码使用ioctl 该设备具有 SSD1289 控制器 按钮不需要额外的引脚 可以通过 SPI 读取其状态 这就是我想要的 读取按下了哪个按钮 我试图在 Python 中为我自己的
  • 树莓派 pico rfid rc522 (Micropython)

    我想使用 RPi Pico 从 mfrc522 Iduino RFID rc522 读卡器读取数据 但我不知道如何操作 我试图使用为此目的制作的 mfrc522 py MicroPython 库 阅读器正在通过 SPI 与 Pi 通信 我将
  • 读取时不返回写入 I2C 的缓冲区

    我试图在写入后从 I2C 总线上的内存位置读取一个值 当我在终端中运行它时 我得到奇怪的输出 这是我的程序 include
  • 如何用 C 语言从串行(SPI)连接读取数据?

    我正在尝试编写一个程序 该程序将安装在 Linux MCU Raspberry Pi 上 该程序将读取从另一个 MCU 我将自己构建的自制程序 发送到它的串行数据 我研究了如何做到这一点 并认为我有 大局 但仍然缺少一些东西 其一 我需要启
  • 如何转换温度传感器得到的值?

    我在ST工作Temperature sensor hts221 我用I2C与传感器的命令通信 我从文档中看到类似以下文字 enter code here Temperature data are expressed as TEMP OUT

随机推荐

  • jenkins 持续集成/项目部署

    前置操作可查阅 docker 安装 jenkins https xijia blog csdn net article details 127021367 spm 1001 2014 3001 5502 win安装及 jenkins 前置配
  • C5.0决策树算法及性能提升

    C5 0算法是基于C4 5开发的新版本 它能适用于很多类型的问题 同神经网络 支持向量机等复杂算法相比 它几乎可以表现地一样优秀 并且更容易理解和部署 这里我们将用UCI机器学习网站http archive ics uci edu ml i
  • GPIO使用教程(学习笔记)

    目录 前言 一 GPIO简介 1 1GPIO框图讲解 二 需驱动的寄存器 2 1时钟 2 2总线 2 3时钟配置 2 4寄存器配置 三 编程环境搭建 3 1完整程序 四 小结 前言 本文主要讲解如何驱动GPIO外设的相应寄存器搭建GPIO的
  • MyBatis 学习笔记:Java 中的数据持久化框架

    MyBatis 学习笔记 Java 中的数据持久化框架 数据持久化是大多数应用程序的关键需求之一 在 Java 开发中 MyBatis 是一个流行的数据持久化框架 它提供了一种简单而强大的方式来管理数据库访问 本文将介绍 MyBatis 的
  • 出门旅行懂链改这些问题都好解决

    每到旅游热潮结束后 各大平台都会纷纷晒出出游 成绩单 国内很多人都是 报复式出游 各大景区都是人山人海 有些人旅游是为了修身养性 放松身心 有些人是为了观赏大自然风光 享受一场视觉盛宴 有些人是为了探索未知事物 追求一种差异化 个性化的旅游
  • 环形队列设计思路

    环形队列设计思路 一 数据结构 数据存储在一段连续的内存空间 通过写位置 读位置来控制数据的输入输出 二 数据操作 1 判断空逻辑 写位置 读位置 2 判断满逻辑 写位置 1 MAX SIZE 读位置 3 写数据逻辑 判断数据不满 在当前写
  • GPG error: http://debian.cn99.com testing Release: Unknown error executing gpgv

    mail apt get updateGet 1 http debian cn99 com testing Release gpg 189B Hit http debian cn99 com testing ReleaseErr http
  • Servlet上传文件

    一 核心方法 1 HttpServletRequest类相关方法 方法 描述 Part getPart String name 获取请求中给定name的文件 Collection
  • java爬虫,提供链接直接爬取网页代码

    其实我只想要爬到整个网页的源代码的就好 通过java的一个包jsoup 就可以直接爬取了 后面有下载源代码 含jsoup包 的链接 输入 网页链接 输出 网页源代码 代码比较简单 解析都在代码中 import org jsoup Jsoup
  • python中lower函数是什么意思_python中lower函数实现方法及用法讲解

    之前小编介绍过python中将字符串小写字符转为大写的upper函数的使用方法 upper函数 有将小写转为大写的需要 那也有将大写转为小写的情况 本文主要介绍在python中可以将字符串大写自摸转换为小写字母的lower函数 1 lowe
  • CreateThread()和_beginthread()有什么不同?

    CreateThread 和 beginthread 有什么不同 我们知道在Windows下创建一个线程的方法有两种 一种就是调用Windows API CreateThread 来创建线程 另外一种就是调用MSVC CRT的函数 begi
  • Chart控件的用法和部署

    最近 导师让我做统计图 因为以前没有接触过 所以动起手来 难免会遇到很多的问题 经过一段时间的搜集资料和亲手操作 终于实现了我需要的功能 为了方便大家以后会更好的使用Chart控件和节省大家的时间 因此和大家分享一下我做的过程 首先 需要安
  • 时序数据的内存服务

    说明 既要坚定锻炼成熟架构的道路 也要在合理的范围内重塑设计 计算时序数据的特征 少不了 Rolling 类的操作 过去 直接采用pandas进行rolling 效率很不错 但是在实战应用时不太行 反思下来 离线的操作拓展困难 很多都是一次
  • set常用方法及遍历方式

    set常用方法 Set 接口继承 Collection 接口 而且它不允许集合中存在重复项 所有原始方法都是现成的 没有引入新方法 具体的 Set 实现类依赖添加的对象的 equals 方法来检查等同性 public int size 返回
  • Qt之QGraphicsView进阶篇

    前言 上一章节介绍了 QGraphicsView 中的基础内容 具体请参考 Qt之QGraphicsView入门篇 这一章节我们来具体了解一下 GraphicsView 框架中有哪些特性 缩放与旋转 QGraphicsView 通过 QGr
  • 查看windows mstsc远程登陆日志(client ip)

    最近有个需求 要看一下windows MSTSC的登陆日志 测试环境 win10 参考 https social technet microsoft com Forums windows en US efabde54 be5e 4be2 b
  • [C6064]警告以及解决方法

    对于函数scanf s 当出现C6064这个警告的时候 预示着缺少一个整形参量 该参量的功能是表明输入字符的长度 可以使用sizeof strlen 等函数 例子如下 scanf s s book title sizeof book tit
  • 【Matlab智能算法】极限学习机-遗传算法(ELM-GA)函数极值寻优——非线性函数求极值

    往期博客 Matlab BP神经网络遗传算法 BP GA 函数极值寻优 非线性函数求极值 Matlab GRNN神经网络遗传算法 GRNN GA 函数极值寻优 非线性函数求极值 Matlab RBF神经网络遗传算法 RBF GA 函数极值寻
  • elementUI表格编辑状态下,如何获取修改过的行

    表格再编辑状态 需要获取到哪一行数据被修改了 面对这样一个场景 我们可以结合element的row click事件以及动态的监听 watch来实现 tableList 代表表格的数据 rowIds代表需要记录的id数组的集合 isUpdat
  • 外设驱动库开发笔记22:ADXL345三轴数字加速度计驱动

    移动设备的广泛应用增加对移动过程中各种参数的检测需求 ADXL345三轴数字加速度计可以用来检测加速度 进而测量倾斜角度等 在这一篇中 我们将讨论ADXL345三轴数字加速度计驱动程序的设计与实现 1 功能概述 ADXL345是一款小而薄的