搜索
bottom↓
回复: 74
打印 上一主题 下一主题

求三轴加速度求倾角公式,用的是ADXL345 已经得到X Y Z值了(附程序)

  [复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2011-11-25 09:37:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求三轴加速度求倾角公式,用的是ADXL345 已经得到X Y Z值了(附程序)  51模拟IIC
1 2 轴还可以想想通  3轴的就想不同了(立体感太差)
#include  <REG51.H>       
#include  <math.h>    //Keil library  
#include  <stdio.h>   //Keil library       
#include  <INTRINS.H>
#define   uchar unsigned char
#define   uint unsigned int       
#define   DataPort P0    //LCD1602数据端口
sbit          SCL=P1^0;      //IIC时钟引脚定义
sbit           SDA=P1^1;      //IIC数据引脚定义
sbit      LCM_RS=P2^0;   //LCD1602命令端口               
sbit      LCM_RW=P2^1;   //LCD1602命令端口               
sbit      LCM_EN=P2^2;   //LCD1602命令端口

#define        SlaveAddress   0xA6          //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
                              //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
typedef unsigned char  BYTE;
typedef unsigned short WORD;

BYTE BUF[8];                         //接收数据缓存区             
uchar ge,shi,bai,qian,wan;           //显示变量
int  dis_data;                       //变量

void delay(unsigned int k);
void InitLcd();                      //初始化lcd1602
void Init_ADXL345(void);             //初始化ADXL345

void WriteDataLCM(uchar dataW);
void WriteCommandLCM(uchar CMD,uchar Attribc);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void conversion(uint temp_data);

void  Single_Write_ADXL345(uchar REG_Address,uchar REG_data);   //单个写入数据
uchar Single_Read_ADXL345(uchar REG_Address);                   //单个读取内部寄存器数据
void  Multiple_Read_ADXL345();                                  //连续的读取内部寄存器数据
//------------------------------------
void Delay5us();
void Delay5ms();
void ADXL345_Start();
void ADXL345_Stop();
void ADXL345_SendACK(bit ack);
bit  ADXL345_RecvACK();
void ADXL345_SendByte(BYTE dat);
BYTE ADXL345_RecvByte();
void ADXL345_ReadPage();
void ADXL345_WritePage();
//-----------------------------------

//*********************************************************
void conversion(uint temp_data)  
{  
    wan=temp_data/10000+0x30 ;
    temp_data=temp_data%10000;   //取余运算
        qian=temp_data/1000+0x30 ;
    temp_data=temp_data%1000;    //取余运算
    bai=temp_data/100+0x30   ;
    temp_data=temp_data%100;     //取余运算
    shi=temp_data/10+0x30    ;
    temp_data=temp_data%10;      //取余运算
    ge=temp_data+0x30;        
}

/*******************************/
void delay(unsigned int k)       
{                                               
unsigned int i,j;                               
for(i=0;i<k;i++)
{                       
for(j=0;j<121;j++)                       
{;}}                                               
}
/*******************************/
void WaitForEnable(void)       
{                                       
DataPort=0xff;               
LCM_RS=0;LCM_RW=1;_nop_();
LCM_EN=1;_nop_();_nop_();
while(DataPort&0x80);       
LCM_EN=0;                               
}                                       
/*******************************/
void WriteCommandLCM(uchar CMD,uchar Attribc)
{                                       
if(Attribc)WaitForEnable();       
LCM_RS=0;LCM_RW=0;_nop_();
DataPort=CMD;_nop_();       
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}                                       
/*******************************/
void WriteDataLCM(uchar dataW)
{                                       
WaitForEnable();               
LCM_RS=1;LCM_RW=0;_nop_();
DataPort=dataW;_nop_();       
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}               
/***********************************/
void InitLcd()                               
{                       
WriteCommandLCM(0x38,1);       
WriteCommandLCM(0x08,1);       
WriteCommandLCM(0x01,1);       
WriteCommandLCM(0x06,1);       
WriteCommandLCM(0x0c,1);
}                       
/***********************************/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{                                               
Y&=1;                                               
X&=15;                                               
if(Y)X|=0x40;                                       
X|=0x80;                       
WriteCommandLCM(X,0);               
WriteDataLCM(DData);               
}                                               

/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
}

/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{
    WORD n = 560;

    while (n--);
}

/**************************************
起始信号
**************************************/
void ADXL345_Start()
{
    SDA = 1;                    //拉高数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 0;                    //产生下降沿
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
}

/**************************************
停止信号
**************************************/
void ADXL345_Stop()
{
    SDA = 0;                    //拉低数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 1;                    //产生上升沿
    Delay5us();                 //延时
}

/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void ADXL345_SendACK(bit ack)
{
    SDA = ack;                  //写应答信号
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时
}

/**************************************
接收应答信号
**************************************/
bit ADXL345_RecvACK()
{
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    CY = SDA;                   //读应答信号
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时

    return CY;
}

/**************************************
向IIC总线发送一个字节数据
**************************************/
void ADXL345_SendByte(BYTE dat)
{
    BYTE i;

    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;              //移出数据的最高位
        SDA = CY;               //送数据口
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    ADXL345_RecvACK();
}

/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE ADXL345_RecvByte()
{
    BYTE i;
    BYTE dat = 0;

    SDA = 1;                    //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        dat |= SDA;             //读数据               
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    return dat;
}

//******单字节写入*******************************************

void Single_Write_ADXL345(uchar REG_Address,uchar REG_data)
{
    ADXL345_Start();                  //起始信号
    ADXL345_SendByte(SlaveAddress);   //发送设备地址+写信号
    ADXL345_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf22页
    ADXL345_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页
    ADXL345_Stop();                   //发送停止信号
}

//********单字节读取*****************************************
uchar Single_Read_ADXL345(uchar REG_Address)
{  uchar REG_data;
    ADXL345_Start();                          //起始信号
    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号
    ADXL345_SendByte(REG_Address);                   //发送存储单元地址,从0开始       
    ADXL345_Start();                          //起始信号
    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号
    REG_data=ADXL345_RecvByte();              //读出寄存器数据
        ADXL345_SendACK(1);   
        ADXL345_Stop();                           //停止信号
    return REG_data;
}
//*********************************************************
//
//连续读出ADXL345内部加速度数据,地址范围0x32~0x37
//
//*********************************************************
void Multiple_read_ADXL345(void)
{   uchar i;
    ADXL345_Start();                          //起始信号
    ADXL345_SendByte(SlaveAddress);           //发送设备地址+写信号
    ADXL345_SendByte(0x32);                   //发送存储单元地址,从0x32开始       
    ADXL345_Start();                          //起始信号
    ADXL345_SendByte(SlaveAddress+1);         //发送设备地址+读信号
         for (i=0; i<6; i++)                      //连续读取6个地址数据,存储中BUF
    {
        BUF = ADXL345_RecvByte();          //BUF[0]存储0x32地址中的数据
        if (i == 5)
        {
           ADXL345_SendACK(1);                //最后一个数据需要回NOACK
        }
        else
        {
          ADXL345_SendACK(0);                //回应ACK
       }
   }
    ADXL345_Stop();                          //停止信号
    Delay5ms();
}


//*****************************************************************

//初始化ADXL345,根据需要请参考pdf进行修改************************
void Init_ADXL345()
{
   Single_Write_ADXL345(0x31,0x0B);   //测量范围,正负16g,13位模式
   Single_Write_ADXL345(0x2C,0x08);   //速率设定为12.5 参考pdf13页
   Single_Write_ADXL345(0x2D,0x08);   //选择电源模式   参考pdf24页
   Single_Write_ADXL345(0x2E,0x80);   //使能 DATA_READY 中断
   Single_Write_ADXL345(0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页
   Single_Write_ADXL345(0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页
   Single_Write_ADXL345(0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页
}
//***********************************************************************
//显示x轴
void display_x()
{   float temp;
    dis_data=(BUF[1]<<8)+BUF[0];  //合成数据   
        if(dis_data<0){
        dis_data=-dis_data;
    DisplayOneChar(2,0,'-');      //显示正负符号位
        }
        else DisplayOneChar(2,0,' '); //显示空格

    temp=(float)dis_data*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
    conversion(temp);          //转换出显示需要的数据
        DisplayOneChar(0,0,'X');   //第0行,第0列 显示X
    DisplayOneChar(1,0,':');
    DisplayOneChar(3,0,qian);
        DisplayOneChar(4,0,'.');
    DisplayOneChar(5,0,bai);
    DisplayOneChar(6,0,shi);
        DisplayOneChar(7,0,'g');
}

//***********************************************************************
//显示y轴
void display_y()
{     float temp;
    dis_data=(BUF[3]<<8)+BUF[2];  //合成数据   
        if(dis_data<0){
        dis_data=-dis_data;
    DisplayOneChar(2,1,'-');      //显示正负符号位
        }
        else DisplayOneChar(2,1,' '); //显示空格

    temp=(float)dis_data*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
    conversion(temp);          //转换出显示需要的数据
        DisplayOneChar(0,1,'Y');   //第1行,第0列 显示y
    DisplayOneChar(1,1,':');
    DisplayOneChar(3,1,qian);
        DisplayOneChar(4,1,'.');
    DisplayOneChar(5,1,bai);
    DisplayOneChar(6,1,shi);  
        DisplayOneChar(7,1,'g');  
}

//***********************************************************************
//显示z轴
void display_z()
{      float temp;
    dis_data=(BUF[5]<<8)+BUF[4];    //合成数据   
        if(dis_data<0){
        dis_data=-dis_data;
    DisplayOneChar(10,1,'-');       //显示负符号位
        }
        else DisplayOneChar(10,1,' ');  //显示空格

    temp=(float)dis_data*3.9;  //计算数据和显示,查考ADXL345快速入门第4页
    conversion(temp);          //转换出显示需要的数据
        DisplayOneChar(10,0,'Z');  //第0行,第10列 显示Z
    DisplayOneChar(11,0,':');
    DisplayOneChar(11,1,qian);
        DisplayOneChar(12,1,'.');
    DisplayOneChar(13,1,bai);
    DisplayOneChar(14,1,shi);
        DisplayOneChar(15,1,'g');  
}


//*********************************************************
//******主程序********
//*********************************************************
void main()
{
  uchar devid;
  delay(500);                           //上电延时               
  InitLcd();                      //液晶初始化ADXL345
  Init_ADXL345();                 //初始化ADXL345
  devid=Single_Read_ADXL345(0X00);//读出的数据为0XE5,表示正确
  while(1)                         //循环
  {
    Multiple_Read_ADXL345();       //连续读出数据,存储在BUF中
    display_x();                   //---------显示X轴
    display_y();                   //---------显示Y轴
    display_z();                   //---------显示Z轴
    delay(200);                    //延时            
  }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入85汤圆

2
发表于 2011-11-25 09:40:49 | 只看该作者
mark

出0入0汤圆

3
 楼主| 发表于 2011-11-25 11:08:56 | 只看该作者
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd

出0入0汤圆

4
发表于 2011-11-25 11:22:23 | 只看该作者
在均速运动状态下,你直接把X、Y、Z的值换算成加速度,然后和重力加速度G值求个arccos就是每个轴的角度

编辑原因:错把arccos写成arctan了

出0入0汤圆

5
 楼主| 发表于 2011-11-25 11:28:22 | 只看该作者
回复【3楼】goodjob1
在均速运动状态下,你直接把x、y、z的值换算成加速度,然后和重力加速度g值求个arctan就是每个轴的角度
-----------------------------------------------------------------------

能不能具体化点呢?  谢谢了  每个轴的角度可以算出来   那这个加速度传感器相对与地面这个面的角度该怎么算了  我看PDF介绍头都大了  而且PDF最终好象也没说出来到底怎么弄
我做的东西就是求它的倾斜角  而且传感器是任意放置的  不会刻意演某个轴来进行放置的  该怎么弄呢?  高手帮帮忙啊

出0入0汤圆

6
发表于 2011-11-25 11:28:48 | 只看该作者
这个要顶 前两天想弄弄来着,不知道如何下手

出0入0汤圆

7
发表于 2011-11-25 11:49:23 | 只看该作者
正在做这方面的研究。

     dev=sqrt( x*x+y*y)/(z);//分母是谁,就是谁的倾角
     dev=atan(dev)*180/3.1416;
     sprintf(str," qj %3.2f",dev);

出0入0汤圆

8
发表于 2011-11-25 12:28:29 | 只看该作者
回复【6楼】jackwang123
正在做这方面的研究。
     dev=sqrt( x*x+y*y)/(z);//分母是谁,就是谁的倾角
     dev=atan(dev)*180/3.1416;
     sprintf(str," qj %3.2f",dev);
-----------------------------------------------------------------------

这个公式试过了吗?我怎么感觉得到的角度始终是90度啊

出0入0汤圆

9
发表于 2011-11-25 12:40:45 | 只看该作者
回复【4楼】ms80c51
回复【3楼】goodjob1  
在均速运动状态下,你直接把x、y、z的值换算成加速度,然后和重力加速度g值求个arccos就是每个轴的角度
-----------------------------------------------------------------------
能不能具体化点呢?  谢谢了  每个轴的角度可以算出来   那这个加速度传感器相对与地面这个面的角度该怎么算了  我看pdf介绍头都大了  而且pdf最终好象也没说出来到底怎么弄
我做的东西就是求它的倾斜角  而且传感器是任意放置的  不会刻意演某个轴来进行放置的  该怎么弄呢?  高手帮帮忙啊
-----------------------------------------------------------------------

我的理解是这样的:倾角必须有一个基准面,比如说把XY轴作为基准面,求的倾角是XY面相对地面垂直线的角度(也就是说当XY面水平时,倾角为90。当XY面垂直地面时,倾角为0)
用了下面两个函数:

void Get_ADXL345_Data(void)//获得X、Y、Z轴的值
{
        Multiple_Read_ADXL345();      //连续读出数据,存储在BUF中
//---------显示X轴
    ADXL345_x=(ADXL345_BUF[1] << 8 | ADXL345_BUF[0])*3.9; //Combine MSB and LSB of X Data output register
    ADXL345_z=(ADXL345_BUF[5] << 8 | ADXL345_BUF[4])*3.9; //Combine MSB and LSB of Z Data output register
    ADXL345_y=(ADXL345_BUF[3] << 8 | ADXL345_BUF[2])*3.9; //Combine MSB and LSB of Y Data output register
}



float Get_ADXL345_Angle(float angle1)//计算轴相对地面垂直线的角度,这里按G=1000计算。最好是初始化的时候将XY水平放置,取Z轴值作为G值
{
        float tmp;
        if(angle1>1000)//防止数值超出上限
        {
                angle1=1000;
        }
        if(angle1<-1000)
        {
                angle1=-1000;
        }

               
        if(angle1<0)
        {
                angle1=-angle1;
                tmp=180-(acos(angle1/1000)*180/3.14);
        }
        else
        {
                tmp=(acos(angle1/1000)*180/3.14);
        }
        return tmp;
}

上面是我用来求单轴倾角的函数,我想求一个面的倾角应该是这样:
Get_ADXL345_Data();
der=sqrt(ADXL345_x*ADXL345_x+ADXL345_y*ADXL345_y);
der=Get_ADXL345_Angle(der);//XY面相对垂直线的倾角

如果你是要求相对水平面的角度,减90度就行了

出0入0汤圆

10
 楼主| 发表于 2011-11-25 13:43:04 | 只看该作者
回复【8楼】goodjob1
回复【4楼】ms80c51  
回复【3楼】goodjob1   
在均速运动状态下,你直接把x、y、z的值换算成加速度,然后和重力加速度g值求个arccos就是每个轴的角度  
-----------------------------------------------------------------------  
能不能具体化点呢?  谢谢了  每个轴的角度可以算出来   那这个加速度传感器相对与地面这个面的角度该怎么算了  我看pdf介绍头都大了  而且pdf最终好象也没说出来到底怎么弄  
我做的东西就是求它的倾斜角  而且传感器是任意放置的  不会刻意演某个轴来进行放置的  该怎么弄呢?  高手帮帮忙啊
-----------------------------------------------------------------------
我的理解是这样的:倾角......
-----------------------------------------------------------------------

十分感谢  大概有点明白了  呵呵

出0入0汤圆

11
发表于 2011-11-25 13:51:02 | 只看该作者
关注

出0入0汤圆

12
 楼主| 发表于 2011-11-25 14:10:58 | 只看该作者
回复【8楼】goodjob1
回复【4楼】ms80c51  
回复【3楼】goodjob1   
在均速运动状态下,你直接把x、y、z的值换算成加速度,然后和重力加速度g值求个arccos就是每个轴的角度  
-----------------------------------------------------------------------  
能不能具体化点呢?  谢谢了  每个轴的角度可以算出来   那这个加速度传感器相对与地面这个面的角度该怎么算了  我看pdf介绍头都大了  而且pdf最终好象也没说出来到底怎么弄  
我做的东西就是求它的倾斜角  而且传感器是任意放置的  不会刻意演某个轴来进行放置的  该怎么弄呢?  高手帮帮忙啊
-----------------------------------------------------------------------
我的理解是这样的:倾角......
-----------------------------------------------------------------------

又晕了  Z轴后来就没用了??

出0入0汤圆

13
发表于 2011-11-25 15:48:25 | 只看该作者
W[0]=atan(ACC[0]/(Q_rsqrt(ACC[1]*ACC[1]+ACC[2]*ACC[2])));
    W[1]=atan(ACC[1]/(Q_rsqrt(ACC[0]*ACC[0]+ACC[2]*ACC[2])));
    W[0]=W[0]*180/3.14;  //角度换算
    W[1]=W[1]*180/3.14;         

倾角公式 (原文件名:无标题.png)

还是多看资料!

出0入0汤圆

14
发表于 2011-11-25 15:52:53 | 只看该作者
这个要mark。

出0入0汤圆

15
 楼主| 发表于 2011-11-25 16:09:31 | 只看该作者
回复【12楼】b54wco
    w[0]=atan(acc[0]/(q_rsqrt(acc[1]*acc[1]+acc[2]*acc[2])));
    w[1]=atan(acc[1]/(q_rsqrt(acc[0]*acc[0]+acc[2]*acc[2])));
    w[0]=w[0]*180/3.14;  //角度换算
    w[1]=w[1]*180/3.14;   


倾角公式 (原文件名:无标题.png)
还是多看资料!
-----------------------------------------------------------------------

谢谢  我还是想不通   如果我把加速度传感器平放在桌面的时候(假设此时X=0,Y=0,Z=1)  然后任意摆动传感器  那么加速度传感器相对于桌面的角度应该取哪个呢?

出0入0汤圆

16
发表于 2011-11-25 16:37:48 | 只看该作者
mark

出0入0汤圆

17
 楼主| 发表于 2011-11-25 17:05:41 | 只看该作者
谢谢  我还是想不通   如果我把加速度传感器平放在桌面的时候(假设此时X=0,Y=0,Z=1)  然后任意摆动传感器  那么加速度传感器相对于桌面的角度应该取哪个呢?

出0入0汤圆

18
发表于 2011-11-25 18:33:56 | 只看该作者
顶一下

出0入0汤圆

19
发表于 2011-11-25 20:55:31 | 只看该作者
回复【11楼】ms80c51
-----------------------------------------------------------------------


楼主,不好意思,因为我原来只用一个轴的倾角,求面倾角的时候把自己原来的公式套进去,把公式弄复杂了。我想应该可以简化成:
XY面对地面垂直线的倾角=90-arccos(z/G)。

因为Z轴是垂直于XY面的,所以只要求得了Z轴相对地面垂直线(即重力加速度G)的夹角,就可以求出XY面对地面垂直线的夹角。
随便画了个图,大家看看这样对不对:

三轴加速度 (原文件名:三轴加速度.jpg)

出0入0汤圆

20
发表于 2011-11-25 21:02:36 | 只看该作者
MARK

出0入0汤圆

21
发表于 2011-11-28 12:45:54 | 只看该作者
mark!!

出0入0汤圆

22
发表于 2012-1-10 10:42:27 | 只看该作者
看来大家研究的很深入啊

出0入0汤圆

23
发表于 2012-2-15 21:25:50 | 只看该作者
这个问题我想了几个月,经过测试,结果为:
只有adxl345就只能够求出yz值,但无法求出x值,试想一下,本身传感器本身绕重力线旋转时,传感器三个值是不会变的,但此时x值在不停变化的。

出0入0汤圆

24
发表于 2012-2-15 21:27:22 | 只看该作者
加入hmc5883可以求出xyz值。
具体内容方法有点深,不想说。

出0入0汤圆

25
发表于 2012-2-15 21:28:48 | 只看该作者
我用三维立体设计软件测试过公式,全部ok!
但是过程有点深,说起来太麻烦了!

出0入0汤圆

26
发表于 2012-2-16 23:02:24 | 只看该作者
MARK 正好在做姿态测量的项目

出0入0汤圆

27
发表于 2012-2-17 00:13:30 | 只看该作者
mark

出0入0汤圆

28
发表于 2012-2-17 00:46:43 | 只看该作者
mark

出0入0汤圆

29
发表于 2012-2-17 11:11:48 | 只看该作者
Mark

出0入0汤圆

30
发表于 2012-3-24 23:32:46 | 只看该作者
终于知道加速度传感器是用来干嘛的了:'(找的我好苦啊

出0入0汤圆

31
发表于 2012-3-24 23:41:41 | 只看该作者
苦行僧 发表于 2012-3-24 23:32
终于知道加速度传感器是用来干嘛的了找的我好苦啊

加速度传感器 就是计算一下倾斜角 跟俯仰角  在姿态测量方面能够 补偿姿态算法  

出0入0汤圆

32
发表于 2012-3-25 00:30:28 | 只看该作者
呵呵,也在研究中~~

出0入0汤圆

33
发表于 2012-3-26 09:51:53 | 只看该作者
Name_006 发表于 2012-3-24 23:41
加速度传感器 就是计算一下倾斜角 跟俯仰角  在姿态测量方面能够 补偿姿态算法    ...

老大,我买了你的模块,读数据什么的都不是问题,问题是现在不知道这些数据怎么用啊,您能不能告诉我要去看什么算法,或者拿方面的书啊,我不想把时间浪费在这上面啊,谢谢了谢谢了!!!

出0入0汤圆

34
发表于 2012-3-26 10:41:16 | 只看该作者
苦行僧 发表于 2012-3-26 09:51
老大,我买了你的模块,读数据什么的都不是问题,问题是现在不知道这些数据怎么用啊,您能不能告诉我要去 ...

这个 这个没有捷径的啊  只有一点点看资料的 不可能一下就弄完了的  一两句也说不清楚的哇 ~~~      论坛有好多基础的资料 慢慢看看就知道啦

出0入0汤圆

35
发表于 2012-4-1 21:46:45 | 只看该作者
我读过这个程序,这个程序有点小错误,但不影响得出正确结果。

出0入0汤圆

36
发表于 2012-5-3 10:27:28 | 只看该作者
学习学习

出0入0汤圆

37
发表于 2012-5-11 23:48:32 | 只看该作者
看大家说了一大堆,好像没这么麻烦吧,怎么我感觉很容易就算出来了,而且角度很稳定,难不成是我自己想错了?

出0入0汤圆

38
发表于 2012-5-12 10:01:13 | 只看该作者
学习学习

出0入0汤圆

39
发表于 2012-5-12 12:23:15 | 只看该作者
LZ也是想做两轮平衡小车吗,我也想做,貌似你用的是51吧,以后有问题的话向你请教哈!

出0入0汤圆

40
发表于 2012-5-12 15:30:49 来自手机 | 只看该作者
顶,向楼主学习

出0入0汤圆

41
发表于 2012-5-14 09:48:53 | 只看该作者
现在正在考虑怎么利用它来判断往哪个方向运动时,该对数据怎么处理呢

出0入0汤圆

42
发表于 2012-7-16 10:47:33 | 只看该作者
mark ,最近也在用这个东西

出0入0汤圆

43
发表于 2012-8-6 20:07:31 | 只看该作者
LIS302DL测出的加速度值怎么转成角度显示?

出0入0汤圆

44
发表于 2012-8-6 20:39:30 | 只看该作者
精度如何?

出0入0汤圆

45
发表于 2012-8-7 00:32:54 | 只看该作者
±2g和 ±8g,基于stm32f407的

出0入0汤圆

46
发表于 2012-8-13 10:19:00 | 只看该作者
正有一个项目需要,mark!学习一下.

出0入0汤圆

47
发表于 2012-9-2 17:44:08 | 只看该作者
楼主的自平衡小车做出来了么  可否分享一下程序~

出0入0汤圆

48
发表于 2012-11-8 11:56:43 | 只看该作者
学习一下

出0入0汤圆

49
发表于 2012-11-14 17:18:34 | 只看该作者
MARK, 下一步做角度

出0入0汤圆

50
发表于 2012-11-25 17:00:10 | 只看该作者
我现在用adxl345,avr控制,spi通信,连id号都读不出来。。。

出0入0汤圆

51
发表于 2012-11-25 17:41:13 来自手机 | 只看该作者
收藏一下

出0入0汤圆

52
发表于 2012-12-14 14:11:23 | 只看该作者
必须标记啊,用用

出0入0汤圆

53
发表于 2013-3-14 18:08:20 | 只看该作者
学习                          

出0入0汤圆

54
发表于 2013-4-8 21:44:34 | 只看该作者
正在调ADXL345,顶

出0入0汤圆

55
发表于 2013-4-8 22:30:08 | 只看该作者
没弄过,帮顶

出0入0汤圆

56
发表于 2013-4-28 22:09:13 | 只看该作者
请问一下G是如何定值的?

出0入0汤圆

57
发表于 2013-4-29 12:23:02 | 只看该作者
41538006 发表于 2012-2-15 21:28
我用三维立体设计软件测试过公式,全部ok!
但是过程有点深,说起来太麻烦了! ...

您好,我现在正在做电子罗盘,使用磁阻传感器HMC5883L和加计ADXL345,现在我要结合他们两个的数据,也就是我的结合公式需要用到俯仰角和翻滚角的cos和sin值,我的加计的X和Y轴都不会说和水平面平行,那我应该怎么算pitch和roll?

出0入0汤圆

58
发表于 2013-4-29 14:34:51 | 只看该作者
b54wco 发表于 2011-11-25 15:48
W[0]=atan(ACC[0]/(Q_rsqrt(ACC[1]*ACC[1]+ACC[2]*ACC[2])));
    W[1]=atan(ACC[1]/(Q_rsqrt(ACC[0]*ACC[0 ...

请问图示的角2角3是不是 所谓的俯仰角和翻滚角啊?

出0入0汤圆

59
发表于 2013-4-29 23:01:56 | 只看该作者
41538006 发表于 2012-2-15 21:27
加入hmc5883可以求出xyz值。
具体内容方法有点深,不想说。

您好,我现在正在用HMC5883L和ADXL345做电子罗盘,那那个当加计与X、Y平面都不平行的时候,pitch和roll是怎样计算?网上太多说法,希望您能给我确切答案!万分感谢

出0入0汤圆

60
发表于 2013-6-7 22:50:45 | 只看该作者
学习!!!!!

出0入0汤圆

61
发表于 2013-9-2 16:04:13 | 只看该作者
学习了。。

出0入0汤圆

62
发表于 2013-9-22 11:39:19 | 只看该作者
先顶后看

出0入0汤圆

63
发表于 2013-10-17 11:04:38 | 只看该作者
ding ding ...........

出0入0汤圆

64
发表于 2013-10-25 16:58:12 | 只看该作者
mark 姿态


出0入0汤圆

65
发表于 2014-1-9 17:22:06 | 只看该作者
不错。这个必须顶一顶。

出0入0汤圆

66
发表于 2014-1-13 14:58:28 | 只看该作者
收藏了 ,拿回去看看

出0入0汤圆

67
发表于 2014-2-18 16:26:11 | 只看该作者
高深啊 越说越不懂了!

出0入0汤圆

68
发表于 2014-4-6 20:17:25 | 只看该作者
b54wco 发表于 2011-11-25 15:48
W[0]=atan(ACC[0]/(Q_rsqrt(ACC[1]*ACC[1]+ACC[2]*ACC[2])));
    W[1]=atan(ACC[1]/(Q_rsqrt(ACC[0]*ACC[0 ...

哥们这公式是不是错了
ax =  atan(sqrt(y*y+z*z)/x)*180/3.14;
ay =  atan(sqrt(x*x+z*z)/y)*180/3.14;
az =  atan(sqrt(x*x+y*y)/z)*180/3.14;

出0入0汤圆

69
发表于 2014-5-6 06:14:30 | 只看该作者
MARK 备用

出0入0汤圆

70
发表于 2014-5-6 17:58:55 | 只看该作者
mark,标记。。。

出0入0汤圆

71
发表于 2014-10-13 07:40:09 | 只看该作者
ADXL345可以算倾角,如果还要算物体在基准平面内的位置,是不是还要用陀螺仪?基准平面内的x,y方向是如何定的?(简而言之,现在需要测旋转物体末端的三维坐标,如何建立坐标系,需要哪些传感器)。

出0入0汤圆

72
发表于 2014-10-21 09:37:03 | 只看该作者
楼主,怎么将读到的数据转换为加速度啊

出0入0汤圆

73
发表于 2016-1-17 23:24:52 | 只看该作者
mark marrk
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-15 08:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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