OpenEdv-开源电子网

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

请问:怎么将L3G4200D输出的x,y,z值换算成角度?下附代码。

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2016-1-30
在线时间
1 小时
发表于 2016-1-30 22:36:41 | 显示全部楼层 |阅读模式
2金钱
#include  <intrins.h>


sbit          SCL=P1^0;      //IIC时钟引脚定义
sbit           SDA=P1^1;      //IIC数据引脚定义



//******************宏定义*****************
#define   uchar unsigned char
#define   uint unsigned int       
//**********L3G4200D内部寄存器地址*********
#define WHO_AM_I 0x0F
#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define CTRL_REG4 0x23
#define CTRL_REG5 0x24
#define REFERENCE 0x25
#define OUT_TEMP 0x26
#define STATUS_REG 0x27
#define OUT_X_L 0x28
#define OUT_X_H 0x29
#define OUT_Y_L 0x2A
#define OUT_Y_H 0x2B
#define OUT_Z_L 0x2C
#define OUT_Z_H 0x2D
#define FIFO_CTRL_REG 0x2E
#define FIFO_SRC_REG 0x2F
#define INT1_CFG 0x30
#define INT1_SRC 0x31
#define INT1_TSH_XH 0x32
#define INT1_TSH_XL 0x33
#define INT1_TSH_YH 0x34
#define INT1_TSH_YL 0x35
#define INT1_TSH_ZH 0x36
#define INT1_TSH_ZL 0x37
#define INT1_DURATION 0x38
//****************************************
#define        SlaveAddress   0xD2          //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
//****************变量定义****************
typedef unsigned char  BYTE;
typedef unsigned short WORD;


BYTE  BUF[8];                        //接收数据缓存区             
int  dis_data,d_x,d_y,d_z;                         //变量                       
float temp;
/**************************************
延时函数
**************************************/

void delay(unsigned int k)       
{                                               
unsigned int i,j;                               
for(i=0;i<k;i++)
        {                       
        for(j=0;j<121;j++);                       
        }                                               
}
//延时5微秒(STC90C52RC@12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用1T的MCU时,请调整此延时函数。
void Delay5us()
{
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
}



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

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

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

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

    return CY;
}

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

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

/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE L3G4200D_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_WriteL3G4200D(uchar REG_Address,uchar REG_data)
{
    L3G4200D_Start();                  //起始信号
    L3G4200D_SendByte(SlaveAddress);   //发送设备地址+写信号
    L3G4200D_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf22页
    L3G4200D_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页
    L3G4200D_Stop();                   //发送停止信号
}

//单字节读取*****************************************
uchar Single_ReadL3G4200D(uchar REG_Address)
{  uchar REG_data;
    L3G4200D_Start();                          //起始信号
    L3G4200D_SendByte(SlaveAddress);           //发送设备地址+写信号
    L3G4200D_SendByte(REG_Address);            //发送存储单元地址,从0开始       
    L3G4200D_Start();                          //起始信号
    L3G4200D_SendByte(SlaveAddress+1);         //发送设备地址+读信号
    REG_data=L3G4200D_RecvByte();              //读出寄存器数据
        L3G4200D_SendACK(1);   
        L3G4200D_Stop();                           //停止信号
    return REG_data;
}

//初始化L3G4200D,根据需要请参考pdf进行修改************************
void InitL3G4200D()
{
   Single_WriteL3G4200D(CTRL_REG1, 0x0f);   //
   Single_WriteL3G4200D(CTRL_REG2, 0x00);   //
   Single_WriteL3G4200D(CTRL_REG3, 0x08);   //
   Single_WriteL3G4200D(CTRL_REG4, 0x30);  //+-2000dps
   Single_WriteL3G4200D(CTRL_REG5, 0x00);
}

//x轴数据
void data_x()
{
    BUF[0]= Single_ReadL3G4200D(OUT_X_L);
    BUF[1]= Single_ReadL3G4200D(OUT_X_H); //读取X轴数据

    dis_data=(BUF[1]<<8)+BUF[0];       //合成数据   
    temp=(float)dis_data*0.07;         // 数据手册 第9页,2000度/秒量程
    d_x=(int)temp;

}

//y轴数据
void data_y()
{  
    BUF[2]= Single_ReadL3G4200D(OUT_Y_L);
    BUF[3]= Single_ReadL3G4200D(OUT_Y_H);//读取Y轴数据

    dis_data=(BUF[3]<<8)+BUF[2];              //合成数据   
        temp=(float)dis_data*0.07;                // 数据手册 第9页,2000度/秒量程
    d_y=(int)temp;
       
        //if(d_y>50)led2=1;else led2=0;
}

//z轴数据
void data_z()
{     
    BUF[4]= Single_ReadL3G4200D(OUT_Z_L);
    BUF[5]= Single_ReadL3G4200D(OUT_Z_H);//读取Z轴数据

    dis_data=(BUF[5]<<8)+BUF[4];         //合成数据  
        temp=(float)dis_data*0.07;           // 数据手册 第9页,2000度/秒量程
        d_z=(int)temp;

        //if(d_z>50)led3=1;else led3=0;                      
}

求大神:这样获得的d_x,d_y,d_z是不是角速度呢?怎么才能转换成角度呢?



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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-1-31 15:49:53 | 显示全部楼层
参考下我们战舰V2的ADXL345的历程
回复

使用道具 举报

7

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2016-2-24
在线时间
39 小时
发表于 2018-1-26 16:04:02 | 显示全部楼层
正点原子 发表于 2016-1-31 15:49
参考下我们战舰V2的ADXL345的历程

L3G4200D是陀螺仪传感器  
ADXL345是加速度传感器
怎么参考?
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
904
金钱
904
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-1-26 16:11:24 | 显示全部楼层
1354046363 发表于 2018-1-26 16:04
L3G4200D是陀螺仪传感器  
ADXL345是加速度传感器
怎么参考?

哈哈哈哈哈炒冷饭,好像确实是有点问题哎
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-1 12:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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