short aacx,aacy,aacz;
short gyrox,gyroy,gyroz;
short temperature;
float Accel_x;
float Accel_y;
float Accel_z;
float Gyro_x;
float Gyro_y;
float Gyro_z;
float Angle_x_temp;
float Angle_y_temp;
float Angle_X_Final;
float Angle_Y_Final;
void Angle_Calcu(void)
{
float accx,accy,accz;
MPU_Get_Accelerometer(&aacx,&aacy,&aacz);
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);
temperature = MPU_Get_Temperature();
Accel_x = aacx;
Accel_y = aacy;
Accel_z = aacz;
Gyro_x = gyrox;
Gyro_y = gyroy;
Gyro_z = gyroz;
if(Accel_x<32764) accx=Accel_x/16384;
else accx=1-(Accel_x-49152)/16384;
if(Accel_y<32764) accy=Accel_y/16384;
else accy=1-(Accel_y-49152)/16384;
if(Accel_z<32764) accz=Accel_z/16384;
else accz=(Accel_z-49152)/16384;
Angle_x_temp=(atan(accy/accz))*180/3.14;
Angle_y_temp=(atan(accx/accz))*180/3.14;
if(Accel_x<32764) Angle_y_temp = +Angle_y_temp;
if(Accel_x>32764) Angle_y_temp = -Angle_y_temp;
if(Accel_y<32764) Angle_x_temp = +Angle_x_temp;
if(Accel_y>32764) Angle_x_temp = -Angle_x_temp;
if(Gyro_x<32768) Gyro_x=-(Gyro_x/16.4);
if(Gyro_x>32768) Gyro_x=+(65535-Gyro_x)/16.4;
if(Gyro_y<32768) Gyro_y=-(Gyro_y/16.4);
if(Gyro_y>32768) Gyro_y=+(65535-Gyro_y)/16.4;
if(Gyro_z<32768) Gyro_z=-(Gyro_z/16.4);
if(Gyro_z>32768) Gyro_z=+(65535-Gyro_z)/16.4;
Kalman_Filter_X(Angle_x_temp,Gyro_x);
Kalman_Filter_Y(Angle_y_temp,Gyro_y);
}
float Q_angle = 0.001;
float Q_gyro = 0.003;
float R_angle = 0.5;
float dt = 0.02;
char C_0 = 1;
float Q_bias, Angle_err;
float PCt_0, PCt_1, E;
float K_0, K_1, t_0, t_1;
float P[4] ={0,0,0,0};
float PP[2][2] = { { 1, 0 },{ 0, 1 } };
void Kalman_Filter_X(float Accel,float Gyro)
{
Angle_X_Final += (Gyro - Q_bias) * dt;
P[0]= Q_angle - PP[0][1] - PP[1][0];
P[1]= -PP[1][1];
P[2]= -PP[1][1];
P[3]= Q_gyro;
PP[0][0] += P[0] * dt;
PP[0][1] += P[1] * dt;
PP[1][0] += P[2] * dt;
PP[1][1] += P[3] * dt;
PCt_0 = C_0 * PP[0][0];
PCt_1 = C_0 * PP[1][0];
E = R_angle + C_0 * PCt_0;
K_0 = PCt_0 / E;
K_1 = PCt_1 / E;
t_0 = PCt_0;
t_1 = C_0 * PP[0][1];
PP[0][0] -= K_0 * t_0;
PP[0][1] -= K_0 * t_1;
PP[1][0] -= K_1 * t_0;
PP[1][1] -= K_1 * t_1;
Angle_err = Accel - Angle_X_Final;
Angle_X_Final += K_0 * Angle_err;
Q_bias += K_1 * Angle_err;
Gyro_x = Gyro - Q_bias;
}
void Kalman_Filter_Y(float Accel,float Gyro)
{
Angle_Y_Final += (Gyro - Q_bias) * dt;
P[0]=Q_angle - PP[0][1] - PP[1][0];
P[1]=-PP[1][1];
P[2]=-PP[1][1];
P[3]=Q_gyro;
PP[0][0] += P[0] * dt;
PP[0][1] += P[1] * dt;
PP[1][0] += P[2] * dt;
PP[1][1] += P[3] * dt;
Angle_err = Accel - Angle_Y_Final;
PCt_0 = C_0 * PP[0][0];
PCt_1 = C_0 * PP[1][0];
E = R_angle + C_0 * PCt_0;
K_0 = PCt_0 / E;
K_1 = PCt_1 / E;
t_0 = PCt_0;
t_1 = C_0 * PP[0][1];
PP[0][0] -= K_0 * t_0;
PP[0][1] -= K_0 * t_1;
PP[1][0] -= K_1 * t_0;
PP[1][1] -= K_1 * t_1;
Angle_Y_Final += K_0 * Angle_err;
Q_bias += K_1 * Angle_err;
Gyro_y = Gyro - Q_bias;
}
=====================
```c
#ifndef __KALMAN_H
#define __KALMAN_H
extern float Angle_X_Final;
extern float Angle_Y_Final;
extern short temperature;
extern short aacx,aacy,aacz;
extern short gyrox,gyroy,gyroz;
void Angle_Calcu(void);
void Kalman_Filter_X(float Accel,float Gyro);
void Kalman_Filter_Y(float Accel,float Gyro);
#endif