OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4098|回复: 1

战舰板寄存器加速度程序计勘误

[复制链接]

4

主题

11

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2013-3-16
在线时间
3 小时
发表于 2013-9-3 20:27:46 | 显示全部楼层 |阅读模式

//读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); 
}
//读取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;
 }
}
//读取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=IIC_Read_Byte(0);//读取一个字节,不继续再读,发送NACK 
//   else buf=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]);    
// }

//得到角度
//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;
}

注释部分与上面写寄存器函数重复,可改为写个循环 buf=ADXL345-RD_Reg(ACCEL_XOUT_H+i);

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-3 21:41:19 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-14 02:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表