#include "adxl345.h"
#include "sys.h"
#include "delay.h"
#include "math.h"  
// 
//ALIENTEK战舰STM32开发板  
//

//初始化ADXL345.
//返回值:0,初始化成功;1,初始化失败.
u8 ADXL345_Init(void)
{     
 IIC_Init();       //初始化IIC总线 
 if(ADXL345_RD_Reg(DEVICE_ID)==0XE5) //读取器件ID
 { 
  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); //不使用中断  
   ADXL345_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);  //读取一个字节,不继续再读,发送NAK         
    IIC_Stop();     //产生一个停止条件     
 return temp;    //返回读到的值

//读取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); //不使用中断

ADXL345_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;
 *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); 
}
//读取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);     //发送寄存器地址(数据缓存的起始地址为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);//读取一个字节,不继续再读,发送NACK 
  else 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]);    
}
//读取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++)//连续读取times次
  {
   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°.
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*1800/3.14;
}

ADXL345 驱动代码相关推荐

  1. AMG8833的使用与stm32驱动代码

    一.介绍 1.内部框图 可以看到AMG8833的内部有红外点阵测温,并且还带有一个热敏电阻.使用同一个ADC进行采样,然后送给Control. 2.器件参数 测温点数:64(8x8的矩阵) 帧率:10 ...

  2. Linux创建线程读取双口数据,linux环境下读写一次双口ram尽然要十几个毫秒。(附驱动代码)...

    linux环境下读写一次双口ram尽然要十几个毫秒.(附驱动代码) 我用的双口ram是IDT70V28,手册上说的读写时间应该是几个纳秒,我写了个linux驱动,然后做测试,发现读写一次的时间尽然是十 ...

  3. 三星framebuffer驱动代码分析

    一.驱动总体概述 本次的驱动代码是Samsung公司为s5pv210这款SoC编写的framebuffer驱动,对应于s5pv210中的内部外设Display Controller (FIMD)模块. ...

  4. 树莓派IO口驱动代码的编写、微机总线地址、物理地址、虚拟地址、BCM2835芯片手册

    地址总线: 百度百科解释: 地址总线 (Address Bus:又称:位址总线) 属于一种电脑总线 (一部份),是由CPU 或有DMA 能力的单元,用来沟通这些单元想要存取(读取/写入)电脑内存元件/ ...

  5. 基于框架编写驱动代码

    操作驱动的上层代码(pin4test) #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> ...

  6. 整合后台服务和驱动代码注入

    整合后台服务和驱动代码注入 Home键的驱动代码: /dev/input/event1: 0001 0066 00000001 /dev/input/event1: 0000 0000 0000000 ...

  7. Linux kernel 中模块化的平台驱动代码介绍

    介绍 在linux kernel中通过module_platform_driver来实现模块化平台驱动.大量的设备驱动程序都基于该种方式来实现,使用频次非常的高,在linux kernel 5.4.1 ...

  8. 解决一个驱动代码解耦合问题

    之前解决的项目LCD设备兼容问题,在 a.c 文件里面定义了一个变量,然后在 b.c 里面使用 extern声明引用这个变量,通过这种方法可以在b.c中使用在a.c 里面初始化的变量. 但是这中情况就 ...

  9. 蓝桥杯单片机DS1302时钟芯片驱动代码注释

    蓝桥杯单片机DS1302时钟芯片驱动代码之前的疑惑注释了下 /* DS1302 芯片包含一个 实时时钟/日历和 31 字节的静态 RAM. 与时钟/RAM 通讯只需要三根线: CE,I/O (数据线) ...

最新文章

  1. linux ssh -R 代理不同内网主机互连
  2. 字符串url获取参数_如何从URL查询字符串获取示例参数或将其附加到URL查询字符串(示例)?...
  3. ZooKeeper,策展人以及微服务负载平衡的工作方式
  4. 怎么用树莓派制作web服务器,用树莓派做web服务器,靠谱吗?
  5. ethtool如何让接口闪灯_如何解决专业家庭影院与卡拉OK的声学问题?
  6. vue_cli全局变量使用
  7. 大哥你遇到问题,博文在此,连找都懒得找吗?
  8. Linux/Ubuntu下解压命令
  9. 树莓派管脚编码c语言,树莓派IO引脚定义 | 北岛夜话
  10. 微弱信号检测(放大电路篇——集成运放)
  11. QT 对话框不在任务栏显示
  12. 【Android】使用MPAndroidChart过程中BarChart的几点心得
  13. Closest_Pair
  14. 基于PG与PostGIS搭建实时矢量瓦片服务
  15. 无法为立即文档创建临时文件: 设备上没有空间(centos root 目录爆满)
  16. Vue - 路由导航守卫控制访问权限,设置 localStorage 过期时间
  17. IC中LDO电路的DRC验证问题
  18. 基于BINN算法的CCPP全路径覆盖算法
  19. JVM成神之路(二)-- JDK,JER与JVM的关系
  20. verilog基本语法学习笔记

热门文章

  1. wps word文档生成目录的时候显示断裂会生成大纲怎么办_word目录制作技巧:快速生成文档总目录和章节下子目录...
  2. CAD关于图层删除图层操作(com接口c#语言)
  3. linux开放7050端口,Linux操作系统内核启动参数详细解析
  4. UKN服务器找不到,在windows下用ppk后缀文件登陆远程服务器
  5. STL源码剖析---红黑树原理详解上
  6. 【python】详解pandas.DataFrame.resample根据时间聚合采样(一)
  7. forwardRef 的详解及使用
  8. Linux命令卸载谷歌浏览器,linux系统安装和卸载google浏览器
  9. sudo apt-get install build-essential的作用
  10. Linux使用alias设置命令别名