单片机学习小组
直播中

李瑜刈

7年用户 171经验值
私信 关注

请问L3G4200D输出的x,y,z值如何换算成角度?

#include  
***it          SCL=P1^0;      //IIC时钟引脚定义
***it           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         {                        
        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是不是角速度呢?怎么才能转换成角度呢?

回帖(2)

王娟

2019-10-17 08:55:13
参考下我们战舰V2的ADXL345的历程
举报

任黎平

2019-10-17 09:10:13
哈哈哈哈哈炒冷饭,好像确实是有点问题哎
举报

更多回帖

发帖
×
20
完善资料,
赚取积分