ADXL345加速度传感器驱动
ADXL345 是 ADI 公司的一款 3 轴、数字输出的加速度传感器。ADXL345 是 ADI 公司推
出的基于 iMEMS 技术的 3 轴、数字输出加速度传感器。该加速度传感器的特点有:
分辨率高。最高 13 位分辨率。
量程可变。具有+/-2g,+/-4g,+/-8g,+/-16g 可变的测量范围。
灵敏度高。最高达 3.9mg/LSB,能测量不到 1.0°的倾斜角度变化。
功耗低。40~145uA 的超低功耗,待机模式只有 0.1uA。
尺寸小。整个 IC 尺寸只有 3mm*5mm*1mm,LGA 封装。
ADXL 支持标准的 I2C 或 SPI 数字接口,自带 32 级 FIFO 存储,并且内部有多种运动状态
检测和灵活的中断方式等特性
加速度传感器一般都有三个轴,垂直于芯片为Z轴,检测重力,平行于芯片分别为XY轴,三个轴得到三种加速度,经过合成,可以得到物体在匀速运动时候的姿态,这是一个相对静止的姿态,
因为静止状态,物体仅受到重力加速度的影响,通过姿态重力加速度产生分量作用在三个轴上,通过这个分量可以计算加速度传感器和地面参考系之间的夹角从而得到姿态
因为是IIC总线,所以还是居于IIC标准通讯的,修改功能使能IIC总线修改寄存器即可,寄存器框图如下
对于加速度传感器的功能配置各有不同,以下是基础配置的代码
#include "adxl345.h"
#include "delay.h"
#include "math.h" //初始化ADXL345.
//返回值:0,初始化成功;1,初始化失败.
u8 Adxl345Init(void)
{
IIcInit(); //初始化IIC总线
if(Adxl345ReadReg(DEVICE_ID)==0XE5) //读取器件ID
{
Adxl345WRReg(DATA_FORMAT,0X2B); //低电平中断输出,13位全分辨率,输出数据右对齐,16g量程
Adxl345WRReg(BW_RATE,0x0A); //数据输出速度为100Hz
Adxl345WRReg(POWER_CTL,0x28); //链接使能,测量模式
Adxl345WRReg(INT_ENABLE,0x00); //不使用中断
Adxl345WRReg(OFSX,0x00);
Adxl345WRReg(OFSY,0x00);
Adxl345WRReg(OFSZ,0x00);
return 0;
}
return 1;
} //写ADXL345寄存器
//addr:寄存器地址
//val:要写入的值
//返回值:无
void Adxl345WRReg(u8 addr,u8 val)
{
IIcStart();
IIcSendByte(ADXL_WRITE); //发送写器件指令
IIcWaitAck();
IIcSendByte(addr); //发送寄存器地址
IIcWaitAck();
IIcSendByte(val); //发送值
IIcWaitAck();
IIcStop(); //产生一个停止条件
} //读ADXL345寄存器
//addr:寄存器地址
//返回值:读到的值
u8 Adxl345ReadReg(u8 addr)
{
u8 temp=0;
IIcStart();
IIcSendByte(ADXL_WRITE); //发送写器件指令
temp=IIcWaitAck();
IIcSendByte(addr); //发送寄存器地址
temp=IIcWaitAck();
IIcStart(); //重新启动
IIcSendByte(ADXL_READ); //发送读器件指令
temp=IIcWaitAck();
temp=IIcReadByte(0); //读取一个字节,不继续再读,发送NAK
IIcStop(); //产生一个停止条件
return temp; //返回读到的值
} //读取ADXL的平均值
//x,y,z:读取10次后取平均值
void Adxl345ReadAvval(short *x,short *y,short *z)
{
short tx=0,ty=0,tz=0;
u8 i;
for(i=0;i<10;i++)
{
Adxl345ReadXyz(x,y,z);
DelayMs(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 Adxl345AutoAdjust(char *xval,char *yval,char *zval)
{
short tx,ty,tz;
u8 i;
short offx=0,offy=0,offz=0;
Adxl345WRReg(POWER_CTL,0x00); //先进入休眠模式.
DelayMs(100);
Adxl345WRReg(DATA_FORMAT,0X2B); //低电平中断输出,13位全分辨率,输出数据右对齐,16g量程
Adxl345WRReg(BW_RATE,0x0A); //数据输出速度为100Hz
Adxl345WRReg(POWER_CTL,0x28); //链接使能,测量模式
Adxl345WRReg(INT_ENABLE,0x00); //不使用中断 Adxl345WRReg(OFSX,0x00);
Adxl345WRReg(OFSY,0x00);
Adxl345WRReg(OFSZ,0x00);
DelayMs(12);
for(i=0;i<10;i++)
{
Adxl345ReadAvval(&tx,&ty,&tz);
offx+=tx;
offy+=ty;
offz+=tz;
}
offx/=10;
offy/=10;
offz/=10;
*xval=-offx/4;
*yval=-offy/4;
*zval=-(offz-256)/4;
Adxl345WRReg(OFSX,*xval);
Adxl345WRReg(OFSY,*yval);
Adxl345WRReg(OFSZ,*zval);
} //读取3个轴的数据
//x,y,z:读取到的数据
void Adxl345ReadXyz(short *x,short *y,short *z)
{
u8 buf[6];
u8 i;
IIcStart();
IIcSendByte(ADXL_WRITE); //发送写器件指令
IIcWaitAck();
IIcSendByte(0x32); //发送寄存器地址(数据缓存的起始地址为0X32)
IIcWaitAck(); IIcStart(); //重新启动
IIcSendByte(ADXL_READ); //发送读器件指令
IIcWaitAck();
for(i=0;i<6;i++)
{
if(i==5)buf[i]=IIcReadByte(0);//读取一个字节,不继续再读,发送NACK
else buf[i]=IIcReadByte(1); //读取一个字节,继续读,发送ACK
}
IIcStop(); //产生一个停止条件
*x=(short)(((u16)buf[1]<<8)+buf[0]);
*y=(short)(((u16)buf[3]<<8)+buf[2]);
*z=(short)(((u16)buf[5]<<8)+buf[4]);
} //读取ADXL345的数据times次,再取平均
//x,y,z:读到的数据
//times:读取多少次
void Adxl345ReadAverage(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++)//连续读取times次
{
Adxl345ReadXyz(&tx,&ty,&tz);
*x+=tx;
*y+=ty;
*z+=tz;
DelayMs(5);
}
*x/=times;
*y/=times;
*z/=times;
}
printf("x = %d, y = %d ,z = %d \r\n",*x,*y,*z);
} //得到角度
//x,y,z:x,y,z方向的重力加速度分量(不需要单位,直接数值即可)
//dir:要获得的角度.0,与Z轴的角度;1,与X轴的角度;2,与Y轴的角度.
//返回值:角度值.单位0.1°.
short Adxl345GetAngle(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 (short)(res*1800/3.14);
}
#ifndef __ADXL345_H
#define __ADXL345_H
#include "iic.h"
#include "uart.h"
#define DEVICE_ID0X00 //器件ID,0XE5
#define THRESH_TAP0X1D //敲击阀值
#define OFSX0X1E
#define OFSY0X1F
#define OFSZ0X20
#define DUR0X21
#define Latent0X22
#define Window 0X23
#define THRESH_ACK0X24
#define THRESH_INACT 0X25
#define TIME_INACT0X26
#define ACT_INACT_CTL 0X27
#define THRESH_FF0X28
#define TIME_FF0X29
#define TAP_AXES0X2A
#define ACT_TAP_STATUS 0X2B
#define BW_RATE0X2C
#define POWER_CTL0X2D
#define INT_ENABLE0X2E
#define INT_MAP0X2F
#define INT_SOURCE 0X30
#define DATA_FORMAT 0X31
#define DATA_X00X32
#define DATA_X10X33
#define DATA_Y00X34
#define DATA_Y10X35
#define DATA_Z00X36
#define DATA_Z10X37
#define FIFO_CTL0X38
#define FIFO_STATUS0X39
//0X0B TO OX1F Factory Reserved
//如果ALT ADDRESS脚(12脚)接地,IIC地址为0X53(不包含最低位).
//如果接V3.3,则IIC地址为0X1D(不包含最低位).
//因为开发板接V3.3,所以转为读写地址后,为0X3B和0X3A(如果接GND,则为0XA7和0XA6)
#define ADXL_READ 0X3B
#define ADXL_WRITE 0X3A
u8 Adxl345Init(void); //初始化ADXL345
void Adxl345WRReg(u8 addr,u8 val);//写ADXL345寄存器
u8 Adxl345ReadReg(u8 addr);//读ADXL345寄存器
void Adxl345ReadXyz(short *x,short *y,short *z);
//读取一次值
void Adxl345ReadAvval(short *x,short *y,short *z);
//读取平均值
void Adxl345AutoAdjust(char *xval,char *yval,char *zval);//自动校准
void Adxl345ReadAverage(short *x,short *y,short *z,u8 times);//连续读取times次,取平均
short Adxl345GetAngle(float x,float y,float z,u8 dir);
#endif
ADXL345加速度传感器驱动的更多相关文章
- 张高兴的 Windows 10 IoT 开发笔记:ADXL345 加速度传感器
GitHub : https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/ADXL345Demo
- OneNET麒麟座应用开发之五:获取加速度传感器ADXL345数据
由于数据采集站基本都安装在野外或者楼顶,安装位置以及震动对检测数据的准确性有一定影响.所以想要有一个位置状态数据,正好发现麒麟作上有ADXL345,这样一个数字输出的加速度传感器.如图中红框所示: 1 ...
- Arduino入门笔记(8):利用12864和ADXL345学习重力感应控制
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino UNO板 https://item.t ...
- STC8H开发(六): SPI驱动ADXL345三轴加速度检测模块
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- ADXL345经验总结,采用SPI和I2C总线操作
一. ADXL345简介 ADXL345是ADI公司推出的三轴(x,y,z)iMEMS数字加速度计(digital accelerometer),具有在16G下高分辨率(13Bit)测量能 ...
- 【Espruino】NO.12 加速度传感器演示
http://blog.csdn.net/qwert1213131/article/details/31035403 本文属于个人理解,能力有限,纰漏在所难免.还望指正! [小鱼有点电] [Espru ...
- Arduino I2C + 三轴加速度计ADXL345
ADXL345是ADI公司生产的三轴数字加速度计芯片,与ST的LIS3DH功能接近.主要特性有: 工作电压:2.0 ~ 3.6V 功耗:待机功耗0.1μA:工作时与数据输出频率(ODR)有关,如ODR ...
- 【雕爷学编程】Arduino动手做(48)---三轴ADXL345模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...
- STC8H开发(七): I2C驱动MPU6050三轴加速度+三轴角速度检测模块
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
随机推荐
- android之相机开发
http://blog.csdn.net/jason0539/article/details/10125017 android之相机开发 分类: android 基础知识2013-08-20 22: ...
- mysql HA-keepalived
关于MySQL-HA,目前有多种解决方案,比如heartbeat.drbd.mmm.共享存储,但是它们各有优缺点.heartbeat.drbd配置较为复杂,需要自己写脚本才能实现MySQL自动切换,对 ...
- Windows、Linux -- 远程登录、文件传输、文件共享
Linux <---> Linux 远程登录: ssh服务 ssh root@10.20.62.124 文件传输: scp服务 上传 scp /home/xxx.txt root@1 ...
- Oracle 使用sql创建表空间及用户
create tablespace OrcalDBNamedb datafile 'C:\OracleDBDirc\OrcalDBNamedb.dbf' size 300m; 创建用户create u ...
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)
众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下 PackageManager packageManager = this.getPackageManag ...
- android脚步---UI界面修改,增加按钮和监听
我的UU界面,其布局如下: 需要修改的部分: 意见反馈居中,还有增加backbutton 首先在mainactivity中找到我的UU的定义:dialogue public void showAbou ...
- push控制器 卡顿
代码: RecommendController *rec = [[RecommendController alloc]init]; [self.navigationController pushVie ...
- XML字符串解析成对象的时候应注意空格
BomList bomList=(BomList)unmarshaller_bom.unmarshal(new StringReader(xml));xml 不能以空格开头
- RSA非对称加密Java实现
原文 加密基础方法类 import java.security.MessageDigest; import sun.misc.BASE64Decoder; import sun.misc.BASE64 ...
- js优化原则
首先,与其他语言不同,JS的效率很大程度是取决于JS engine的效率.除了引擎实现的优劣外,引擎自己也会为一些特殊的代码模式采取一些优化的策略.例如FF.Opera和Safari的JS引擎,都对字 ...