一、方向判断

注意看管脚1,x,y,z三轴如图所示,当重力加速度方向与坐标轴方向相反时为正,重力加速度方向与坐标轴相同时为负。

二、驱动

采用了IIC接口,实际上也支持SPI接口。

ADXL345.h:

#ifndef     _ADXL345_H
#define     _ADXL345_H
typedef     unsigned   char   u8;
//0x0B To 0x1F  Factory Reserved
#define    DEVICE_ID        0x00    //器件ID,0xE5
#define    THRESH_TAP       0x1D    //敲击阈值
#define    OFSX             0x1E    //X轴偏移
#define    OFSY             0x1F    //Y轴偏移
#define    OFSZ             0x20    //Z轴偏移
#define    DUR              0x21    //敲击持续时间
#define    Latent           0x22    //敲击延时
#define    Window           0x23    //敲击窗口
#define    THRESH_ACT       0x24    //活动阈值
#define    THRESH_INACT     0x25    //静止阈值
#define    TIME_INACT       0x26    //静止时间
#define    ACT_INACT_CTL    0x27    //轴使能控制活动和静止检测
#define    THRESH_FF        0x28    //自由落体阈值
#define    TIME_FF          0x29    //自由落体时间
#define    TAP_AXES         0x2A    //单击/双击轴控制
#define    ACT_TAP_STATUS   0x2B    //单击/双击源
#define    BW_RATE          0x2C    //数据速率及功率模式控制
#define    POWER_CTL        0x2D    //省电特性控制
#define    INT_ENABLE       0x2E    //中断使能控制
#define    INT_MAP          0x2F    //中断映射控制
#define    INT_SOURCE       0x30    //中断源
#define    DATA_FORMAT      0x31    //数据格式控制
#define    DATAX0           0x32    //X轴数据0
#define    DATAX1           0x33    //X轴数据1
#define    DATAY0           0x34    //Y轴数据0
#define    DATAY1           0x35    //Y轴数据1
#define    DATAZ0           0x36    //Z轴数据0
#define    DATAZ1           0x37    //Z轴数据1
#define    FIFO_CTL         0x38    //FIFO控制
#define    FIFO_STATUS      0x39    //FIFO状态//如果ALT ADDRESS脚(12脚)接地,ADXL 7位地址为0x53,第8位为R/W,0xA7为读,0xA6为写
//如果ALT ADDRESS脚(12脚)接3.3V,ADXL 7位地址为0x1D,第8位为R/W,0x3B为读,0x3A为写
#define     ADXL_READ       0x3B
#define     ADXL_WRITE      0x3Au8    ADXL345_Init(void);//初始化ADXL345
void  ADXL345_WR_Reg(u8 addr, u8 val);//写ADXL345寄存器
u8    ADXL345_RD_Reg(u8 addr);        //读ADXL345寄存器
void  ADXL345_RD_XYZ(short *x, short *y, short *z);//读取一个值
void  ADXL345_RD_Avval(short *x, short *y, short *z);//读取平均值
void  ADXL345_AUTO_Adjust(char *xval,char *yval, char *zval);//自动校准
void  ADXL345_Read_Average(short *x, short *y, short *z, u8 times);//连续读取times次,取平均
void  ADXL345_Get_Angle(float x, float y, float z, u8 dir);#endif
复制代码

ADXL345.c:

#include    "ADXL345.h"
#include    "math.h"//初始化ADXL345,返回值:0-初始化成功, 1-初始化失败
u8  ADXL345_Init(void)
{IIC_Init();if(ADXL345_RD_Reg(DEVICE_ID)==0xE5)//固定为0xE5{ADXL345_WR_Reg(DATA_FORMAT,0x2B);//低电平中断输出,13位全分辨率,输出数据右对齐,±16g量程ADXL345_WR_Reg(BW_RATE,0x0A);//数据输出速度为100Hz,正常操作(非低功耗)ADXL345_WR_Reg(POWER_CTL,0x28);//链接使能,测量模式ADXL345_WR_Reg(INT_ENABLE,0x00);//不使用中断//X轴,Y轴,Z轴偏移设置为0ADXL345_WR_Reg(OFSX,0x00);ADXL345_WR_Reg(OFSY,0x00);ADXL345_WR_Reg(OFSZ,0x00);return  0;}return  1;
}//写ADXL345寄存器,addr寄存器地址,val:要写入的值,返回值:读到的值
void    ADXL345_WR_Reg(u8   addr,  u8  val)
{IIC_Start();IIC_Send_Byte(ADXL_WRITE);//发送写器件指令IIC_Wait_Ack();IIC_Send_Byte(addr);//发送寄存器地址IIC_Wait_Ack();IIC_Send_Byte(val);//发送值IIC_Wait_Ack();IIC_Stop();//产生一个停止条件
}//读ADXL345寄存器,addr:寄存器地址,返回值:读到的值
u8  ADXL345_RD_Reg(u8   addr)
{u8  temp=0;IIC_Start();IIC_Send_Byte(ADXL_WRITE);//发送写器件指令temp=IIC_Wait_Ack();IIC_Send_Byte(addr);//发送寄存器地址temp=IIC_Wait_Ack();IIC_Start();IIC_Send_Byte(ADXL_READ);//发送读器件指令temp=IIC_Wait_Ack();temp=IIC_Read_Byte(0);//读取一个字节,不继续再读,发送NAKIIC_Stop();           //产生一个停止条件return      temp;     //返回读到的值
}//读取3个轴的数据,x,y,z:读取到的数据
void    ADXL345_RD_XYZ(short *x, short *y, short *z)
{u8  buf[6];u8  i;IIC_Start();IIC_Send_Byte(ADXL_WRITE);//发送写器件指令IIC_Wait_Ack();IIC_Send_Byte(0x32);//发送寄存器地址IIC_Wait_Ack();IIC_Start();//重新启动IIC_Send_Byte(ADXL_READ);//发送读器件指令IIC_Wait_Ack();for(i=0;i<6;i++){if(i==5)    buf[i]=IIC_Read_Byte(0);//读取一个字节,不继续再读,发送NACKelse        buf[i]=IIC_Read_Byte(1);//读取一个字节,继续读,发送ACK}IIC_Stop();//产生一个停止条件*x=(short)(((u16)buf[1]<<8)+buf[0]);*y=(short)(((u16)buf[3]<<8)+buf[2]);*z=(short)(((u16)buf[5]<<8)+buf[4]);
}//读取ADXL的平均值,x,y,z:读取10次后取平均值
void    ADXL345_RD_Avval(short *x, short *y, short *z)
{short   tx=0,   ty=0,   tz=0;u8      i;for(i=0;i<10;i++){ADXL345_RD_XYZ(x,y,z);delay_ms(10);tx+=(short)*x;ty+=(short)*y;tz+=(short)*z;}*x=tx/10;*y=ty/10;*z=tz/10;
}//自动校准,xval,yval,zval:x,y,z轴的校准值
void    ADXL345_AUTO_Adjust(char* xval, char* yval, char* zval)
{short   tx,ty,tz;u8      i;short   offx=0, offy=0, offz=0;ADXL345_WR_Reg(POWER_CTL,0x00);//先进入休眠模式delay_ms(100);ADXL345_WR_Reg(DATA_FORMAT,0x2B);//低电平中断输出,13位全分辨率,输出数据右对齐,±16g量程ADXL345_WR_Reg(BW_RATE,0x0A);//数据输出速度为100Hz,正常操作(非低功耗)ADXL345_WR_Reg(POWER_CTL,0x28);//链接使能,测量模式ADXL345_WR_Reg(INT_ENABLE,0x00);//不使用中断//X轴,Y轴,Z轴偏移设置为0ADXL345_WR_Reg(OFSX,0x00);ADXL345_WR_Reg(OFSY,0x00);ADXL345_WR_Reg(OFSZ,0x00); delay_ms(12);for(i=0;i<10;i++){ADXL345_RD_Avval(&tx,&ty,&tz);offx+=tx;offy+=ty;offz+=tz;}offx/=10;offy/=10;offz/=10;//灵敏度为256LSB/g,OFSX,OFSY,OFSZ的寄存器比例因子为15.6mg/LSB  //15.6/(1000/256)=3.9936,近似为4,又因为校准置于z轴1g的重力场下,Zog=Z+1g-Sz  Sz为灵敏度256*xval=-offx/4;*yval=-offy/4;*zval=-(offz-256)/4;ADXL345_WR_Reg(OFSX,*xval);ADXL345_WR_Reg(OFSY,*yval);ADXL345_WR_Reg(OFSZ,*zval);
}//读取ADXL345的数据times次,再取平均,x,y,z:读到的数据,times读取多少次
void    ADXL345_Read_Average(short  *x, short *y, short *z, u8 times)
{u8  i;short   tx,ty,tz;*x=0;*y=0;*z=0;if(times)//读取次数不为0{for(i=0;i<times;i++){ADXL345_RD_XYZ(&tx,&ty,&tz);*x+=tx;*y+=ty;*z+=tz;delay_ms(5);}*x/=times;*y/=times;*z/=times;}
}//得到角度,x,y,z:x,y,z方向的重力加速度分量(不需要单位,直接数值即可)
//dir:要获得的角度,0-与Z轴的角度;1-与X轴的角度;2-与Y轴的角度
//返回值:角度值,单位0.1°,与自然坐标系轴的角度
//res得到的是弧度值,需要将其转换成角度值也就是*180/3.14
short   ADXL345_Get_Angle(float x, float y, float z, u8 dir)
{float   temp;float   res=0;switch(dir){case    0://与自然Z轴的角度temp=sqrt((x*x+y*y))/z;res=atan(temp);//反正切break;case    1://与自然X轴的角度temp=x/sqrt((y*y+z*z));res=atan(temp);break;case    2://与自然Y轴的角度temp=y/sqrt((x*x+z*z));res=atan(temp);break;}return      res*180/3.14;
}复制代码

ADXL345-数字加速度计相关推荐

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

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

  2. STM32CubeMX使用(五)之IIC及数字加速度计LIS2DW12使用

    目录 一.概述 二.Pinout&Configuration 2.1 选择端口 三.LIS2DW12 四.一点记录 一.概述 本文记录下IIC的使用过程,主要是后续使用,能有个参考. Cube ...

  3. FastBond智能可穿戴之智能手表原型设计(MAX32660+SHT40+ADXL345+OLED+RTC)

    目录 项目介绍 使用器件 MAX32660-EVSYS ADXL345数字加速度计 Temp&Hum 15 Click SS1306驱动的4线SPI 12864 OLED屏 系统引脚连接 关键 ...

  4. Arduino I2C + 三轴加速度计ADXL345

    ADXL345是ADI公司生产的三轴数字加速度计芯片,与ST的LIS3DH功能接近.主要特性有: 工作电压:2.0 ~ 3.6V 功耗:待机功耗0.1μA:工作时与数据输出频率(ODR)有关,如ODR ...

  5. ADXL345经验总结,采用SPI和I2C总线操作

    一. ADXL345简介       ADXL345是ADI公司推出的三轴(x,y,z)iMEMS数字加速度计(digital accelerometer),具有在16G下高分辨率(13Bit)测量能 ...

  6. 加速度计和陀螺仪数据融合

    本帖翻译自 IMU(加速度计和陀螺仪设备)在嵌入式应用中使用的指南. 这篇文章主要介绍加速度计和陀螺仪的数学模型和基本算法,以及如何融合这两者,侧重算法.思想的讨论 介绍 本指南旨在向兴趣者介绍惯性M ...

  7. 加速度计和陀螺仪设备

    原文的地址:http://www.geek-workshop.com/thread-1695-1-1.html 本帖翻译自IMU(加速度计和陀螺仪设备)在嵌入式应用中使用的指南. 这篇文章主要介绍加速 ...

  8. 加速度计和陀螺仪指南(很详细的介绍)

    转载自:http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1695&reltid=676&pre_thread ...

  9. 加速度计和陀螺仪原理

    本帖翻译自IMU(加速度计和陀螺仪设备)在嵌入式应用中使用的指南. 这篇文章主要介绍加速度计和陀螺仪的数学模型和基本算法,以及如何融合这两者,侧重算法.思想的讨论 介绍 本指南旨在向兴趣者介绍惯性ME ...

  10. 加速度计和陀螺仪解析

    转载自:http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1695&reltid=676&pre_thread ...

最新文章

  1. Codeforces Round #131(Div. 2)
  2. python中re.split_Python: str.split()和re.split()的区别
  3. 去除面部黑色素小妙招_面部黑色素沉着怎么去除 推荐几个去黑色素的方法
  4. Mvvm 前端数据流框架精讲
  5. mysql db link_oracle11G数据库db_link连接mysql配置(Windows下无需安装Gateway组件)
  6. python 删除断点_给 Python 开发者的四条忠告!强烈建议收藏
  7. 数据结构排序算法总结
  8. mycat启动服务,后台日志报错Bit Server VM warning: ignoring option MaxPermSize
  9. Oracle的sp,Oracle的X$表系列介绍之-X$KSMSP
  10. 复制百度文库的文字加什么后缀_如何复制百度文中的文章.doc
  11. 数学建模:排队论模型
  12. 永洪bi_永洪bi相关优惠价格-永洪bi的技术博客问答-阿里云
  13. 主板开机重启条线安装图
  14. 搭建基于 Docker 的 CI/CD
  15. 八爪鱼爬取网页数据案例+图解
  16. 英国留学经验分享:发下呆会被拒 有特长受欢迎
  17. Git从远程仓库取代码
  18. 作为刚出培训机构的面试之路
  19. baidu卫兵新版力推三级加快器 电脑一键提速50%
  20. 西瓜综艺走进厦门大同小学 唤醒家庭亲子交流

热门文章

  1. 小李飞刀:醉卧沙场君莫笑,python你还是等等我
  2. ar5418无线网卡驱动
  3. 智能座舱HIL测试台架集群搭建的必要性
  4. sql服务器安全模式怎么修改,SQL Server 安全
  5. HTML项目立项,作为承建方,其项目立项的第一步工作是()。A.编制立项申请书B.项目论证C.项目 - 信管网...
  6. 少儿编程微课程10:使用画笔绘制正六边形
  7. 《Java多线程编程实战》——第2章 设计模式及其作用
  8. 你在工作中会写测试用例嘛?Mockito 的最佳实践
  9. java reactjs_从Java的角度理解前端框架,nodejs,reactjs,angularjs,requirejs,seajs
  10. 【复杂网络】网络科学导论学习笔记-第五章节点重要性与相似性