|
楼主 |
发表于 2017-5-8 23:51:34
|
显示全部楼层
这是完整的角度获取程序,帮忙看看,调了好久感觉就是这个滤波的问题,谢谢!
void Get_Angle(float *Angle_Bal,float *Gyro_Bal,u8 way)
{
float Accel_X,Accel_Y,Accel_Z,Gyro_Y,Gyro_Z;
// float Angle_X;
if(way==1) //DMP
{
Read_DMP(); //===读取加速度、角速度、倾角
*Angle_Bal=Pitch; //===更新平衡倾角
*Gyro_Bal=gyro[1]; //===更新平衡角速度
}
else
{
Gyro_X=(I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_XOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_XOUT_L); //读取X轴陀螺仪
Gyro_Y=(I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_YOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_YOUT_L); //读取Y轴陀螺仪
Gyro_Z=(I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_ZOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_GYRO_ZOUT_L); //读取Z轴陀螺仪
Accel_X=(I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_XOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_XOUT_L); //读取X轴加速度计
Accel_Y=(I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_YOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_YOUT_L); //读取Y轴加速度计
Accel_Z=(I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_ZOUT_H)<<8)+I2C_ReadOneByte(devAddr,MPU6050_RA_ACCEL_ZOUT_L); //读取Z轴加速度计
if(Gyro_X>32768)
Gyro_X-=65536;
if(Gyro_Y>32768)
Gyro_Y-=65536; //数据类型转换,也可通过short强制类型转换
if(Gyro_Z>32768)
Gyro_Z-=65536; //数据类型转换
if(Accel_X>32768)
Accel_X-=65536; //数据类型转换
if(Accel_Y>32768)
Accel_Y-=65536; //数据类型转换
if(Accel_Z>32768)
Accel_Z-=65536; //数据类型转换
*Gyro_Bal=Gyro_X; //得到x轴角速度
Gyro_X=Gyro_X/16.4; //陀螺仪量程转换为+-2000C/S
Angle_X=atan2(Accel_Y,Accel_Z)*180/PI; //计算X轴倾角
// if(way==2) //卡尔曼滤波
if(way==3)
angle1= 0.02 * Angle_X+ (1-0.02) * (angle1-Gyro_X * 0.005);//一阶滤波
// angle2 =Kalman_Filter(Angle_X,-Gyro_X); //卡尔曼滤波
*Angle_Bal=angle1;
}
} |
|