|
发表于 2011-10-31 20:22:37
|
显示全部楼层
以前写的
I2C_Write(gyro_address, 0x21, 0x06); //高通滤波器设置 ,1Hz
I2C_Write(gyro_address, 0x23, 0xD0); //BDU=1(推荐), BLE=1,正负500dps量程
I2C_Write(gyro_address, 0x24, 0x12); //滤波器使能,高低通都有
I2C_Write(gyro_address, 0x20, 0xFF); //800Hz更新速率,110hz cut-off
------------------------------------------------------------------
if( gyro_status&0x08==0x08)
{
GYRO_Data[0] = I2C_Read(gyro_address, 0x28);//read OUT_X_L_A (MSB)
//Delay(1);
GYRO_Data[1] = I2C_Read(gyro_address, 0x29);//read OUT_X_H_A (LSB)
//Delay(1);
GYRO_Data[2] = I2C_Read(gyro_address, 0x2A);//read OUT_Y_L_A (MSB)
//Delay(1);
GYRO_Data[3] = I2C_Read(gyro_address, 0x2B);//read OUT_Y_H_A (LSB)
//Delay(1);
GYRO_Data[4] = I2C_Read(gyro_address, 0x2C);//read OUT_Z_L_A (MSB)
//Delay(1);
GYRO_Data[5] = I2C_Read(gyro_address, 0x2D);//read OUT_Z_H_A (LSB)
//=======================================
Gx = ((GYRO_Data[0] << 8) | GYRO_Data[1]);
Gy = ((GYRO_Data[2] << 8) | GYRO_Data[3]);
Gz = ((GYRO_Data[4] << 8) | GYRO_Data[5]);
Gx-=4;//陀螺采样值偏移量修正,通过实验方法获得修正量,保证时漂最小化
Gy+=5;
Gz+=27;
//if(Gx>10||Gx<-10)
Gx_ave=(Gx_new+Gx)/2;
// if(Gy>10||Gy<-10)
Gy_ave=(Gy_new+Gy)/2;
// if(Gz>10||Gz<-10)
Gz_ave=(Gz_new+Gz)/2;
/*
Gx_ave=Gx_ave*3/4+Gx/4;
Gy_ave=Gy_ave*3/4+Gy/4;
Gz_ave=Gz_ave*3/4+Gz/4;
*/
Gx_new=Gx;
Gy_new=Gy;
Gz_new=Gz;
//if(Gy_ave>40||Gy_ave<-40)
roll2_dt=(float)Gy_ave*17.5*0.95*2.5/1000.0; //17.5是灵敏度,0.95是灵敏度修正系数(实验得到),2.5是采样时间间隔
//if(Gx_ave>40||Gx_ave<-40)
pitch2_dt=(float)Gx_ave*17.5*0.95*2.5/1000.0;
//if(Gz_ave>40||Gz_ave<-40)
yaw2_dt=(float)Gz_ave*17.5*2.5/1000.0;
roll2+=roll2_dt/1000;
pitch2+=pitch2_dt/1000;
yaw2+=yaw2_dt/1000; |
|