#ifndef __bmi088_h
#define __bmi088_h
#include "gd32f1x0.h"
#include "public.h"
typedef struct{
uint8_t acc_chip_id;
uint8_t gyro_chip_id;
uint8_t acc_raw_buff[6];
uint8_t gyro_raw_buff[6];
float acc_adc_x;
float acc_adc_y;
float acc_adc_z;
float gyro_adc_x;
float gyro_adc_y;
float gyro_adc_z;
float acc_raw_x;
float acc_raw_y;
float acc_raw_z;
float gyro_raw_x;
float gyro_raw_y;
float gyro_raw_z;
s16 out_accx;
s16 out_accy;
s16 out_accz;
s16 out_gyrox;
s16 out_gyroy;
s16 out_gyroz;
float kalman_myax;
float kalman_myay;
float kalman_myaz;
float kalman_mygx;
float kalman_mygy;
float kalman_mygz;
float fyaw_angle;
float fpitch_angle;
float froll_angle;
s16 hyaw_angle;
s16 hpitch_angle;
s16 hroll_angle;
}BMI088_DATA;
typedef struct
{
float q0;
float q1;
float q2;
float q3;
float exInt;
float eyInt;
float ezInt;
float q0q0;
float q0q1;
float q0q2;
float q0q3;
float q1q1;
float q1q2;
float q1q3;
float q2q2;
float q2q3;
float q3q3;
float myq0a;
float myq1a;
float myq2a;
float myq3a;
}Q_DATA;
typedef struct
{
float Last_P;
float Now_P;
float out;
float Kg;
float Q;
float R;
}KALMAN;
extern KALMAN kalman_ax;
extern KALMAN kalman_ay;
extern KALMAN kalman_az;
extern KALMAN kalman_gx;
extern KALMAN kalman_gy;
extern KALMAN kalman_gz;
extern Q_DATA q_data;
#define BMI088_SELECT_MODE_PROT GPIOB
#define BMI088_SELECT_MODE_PIN GPIO_PIN_4
#define BMI088_SELECT_MODE_IIC_ENABLE GPIO_SetBits(BMI088_SELECT_MODE_PROT,BMI088_SELECT_MODE_PIN)
#define BMI088_SELECT_MODE_SPI_ENABLE GPIO_ResetBits(BMI088_SELECT_MODE_PROT,BMI088_SELECT_MODE_PIN)
#define LED_WORK_PROT GPIOA
#define LED_WORK_PIN GPIO_PIN_4
#define LED_WORK_ON GPIO_SetBits(LED_WORK_PROT,LED_WORK_PIN)
#define LED_WORK_OFF GPIO_ResetBits(LED_WORK_PROT,LED_WORK_PIN)
#define BMI088_SPI_MOSI_PROT GPIOA
#define BMI088_SPI_MOSI_PIN GPIO_PIN_7
#define BMI088_SPI_SDA_H GPIO_SetBits(BMI088_SPI_MOSI_PROT,BMI088_SPI_MOSI_PIN)
#define BMI088_SPI_SDA_L GPIO_ResetBits(BMI088_SPI_MOSI_PROT,BMI088_SPI_MOSI_PIN)
#define BMI088_SPI_MISO_PROT GPIOA
#define BMI088_SPI_MISO_PIN GPIO_PIN_6
#define BMI088_SPI_READ GPIO_ReadInputBit(BMI088_SPI_MISO_PROT,BMI088_SPI_MISO_PIN)
#define BMI088_SPI_CLK_PROT GPIOA
#define BMI088_SPI_CLK_PIN GPIO_PIN_5
#define BMI088_SPI_CLK_H GPIO_SetBits(BMI088_SPI_CLK_PROT,BMI088_SPI_CLK_PIN)
#define BMI088_SPI_CLK_L GPIO_ResetBits(BMI088_SPI_CLK_PROT,BMI088_SPI_CLK_PIN)
#define BMI088_ACC_SPI_CS_PROT GPIOB
#define BMI088_ACC_SPI_CS_PIN GPIO_PIN_8
#define BMI088_ACC_SPI_CS_H GPIO_SetBits(BMI088_ACC_SPI_CS_PROT,BMI088_ACC_SPI_CS_PIN)
#define BMI088_ACC_SPI_CS_L GPIO_ResetBits(BMI088_ACC_SPI_CS_PROT,BMI088_ACC_SPI_CS_PIN)
#define BMI088_GYRO_SPI_CS_PROT GPIOB
#define BMI088_GYRO_SPI_CS_PIN GPIO_PIN_3
#define BMI088_GYRO_SPI_CS_H GPIO_SetBits(BMI088_GYRO_SPI_CS_PROT,BMI088_GYRO_SPI_CS_PIN)
#define BMI088_GYRO_SPI_CS_L GPIO_ResetBits(BMI088_GYRO_SPI_CS_PROT,BMI088_GYRO_SPI_CS_PIN)
#define BMI088_ACC_SPI_CS_ENABLE do{BMI088_GYRO_SPI_CS_H;BMI088_ACC_SPI_CS_L;}while(0)
#define BMI088_ACC_SPI_CS_DISABLE do{BMI088_GYRO_SPI_CS_H;BMI088_ACC_SPI_CS_H;}while(0)
#define BMI088_GYRO_SPI_CS_ENABLE do{BMI088_ACC_SPI_CS_H;BMI088_GYRO_SPI_CS_L;}while(0)
#define BMI088_GYRO_SPI_CS_DISABLE do{BMI088_ACC_SPI_CS_H;BMI088_GYRO_SPI_CS_H;}while(0)
#define BMI088_READ_CODE 0x80
#define BMI088_WRITE_CODE 0x7f
#define BMI088_READ_ACC_CHIP_ID 0x00
#define BMI088_READ_ACC 0x12
#define BMI088_ACC_SOFTRESET 0x7E
#define BMI088_ACC_PWR_CTRL 0x7D
#define BMI088_ACC_PWR_CONF 0x7C
#define BMI088_ACC_CONF 0x40
#define BMI088_ACC_RANGE 0x41
#define BMI088_READ_GYRO_CHIP_ID 0x00
#define BMI088_READ_GYRO 0x02
#define BMI088_GYRO_RANGE 0x0F
#define BMI088_GYRO_BANDWIDTH 0x10
#define BMI088_GYRO_LPM1 0x11
#define BMI088_GYRO_SOFTRESET 0x14
#define Acc_Gain 0.00018310546875f
#define Gyro_Gain 0.0609756f
#define Gyro_Gr 0.0010641f
#define G 9.80665f
extern BMI088_DATA g_bmi088_data;
void bmi088_init(void);
void bmi088_hard_spi_init(void);
uint8_t bmi088_spi_read_write_byte(uint8_t data_in);
void bmi088_read_chip_id(void);
void bmi088_set_acc(uint8_t addr, uint8_t data);
void bmi088_set_gyro(uint8_t addr, uint8_t data);
void bmi088_read_acc(uint8_t addr, uint8_t readsize, uint8_t *readdata);
void bmi088_read_gyro(uint8_t addr, uint8_t readsize, uint8_t *readdata);
void imu_prepare_data(float gx,float gy,float gz,float ax,float ay,float az);
void imu_updata(float gx,float gy,float gz,float ax,float ay,float az,Q_DATA *q_data);
float KalmanFilter(KALMAN *kfp,float input);
#endif
#include "bmi088.h"
BMI088_DATA g_bmi088_data={0};
Q_DATA q_data={1,0};
KALMAN kalman_ax;
KALMAN kalman_ay;
KALMAN kalman_az;
KALMAN kalman_gx;
KALMAN kalman_gy;
KALMAN kalman_gz;
void bmi088_init(void)
{
bmi088_hard_spi_init();
delay_ms(10);
bmi088_set_acc(BMI088_ACC_SOFTRESET,0xB6);
bmi088_set_acc(BMI088_ACC_PWR_CTRL,0x04);
bmi088_set_acc(BMI088_ACC_CONF,0x8C);
bmi088_set_acc(BMI088_ACC_RANGE,0x01);
bmi088_set_acc(BMI088_ACC_PWR_CONF,0x00);
bmi088_set_acc(BMI088_GYRO_SOFTRESET,0xB6);
bmi088_set_acc(BMI088_GYRO_RANGE,0x00);
bmi088_set_acc(BMI088_GYRO_BANDWIDTH,0x00);
bmi088_set_acc(BMI088_GYRO_LPM1,0x00);
delay_ms(100);
}
void bmi088_hard_spi_init(void)
{
GPIO_InitPara GPIO_InitStructure;
SPI_InitPara SPI_InitParaStruct;
RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOA | RCC_AHBPERIPH_GPIOB |RCC_AHBPERIPH_GPIOC |
RCC_AHBPERIPH_GPIOD | RCC_AHBPERIPH_GPIOF, ENABLE);
RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_CFG,ENABLE);
RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_SPI1,ENABLE);
GPIO_InitStructure.GPIO_Pin = LED_WORK_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
GPIO_Init(LED_WORK_PROT, &GPIO_InitStructure);
LED_WORK_ON;
GPIO_InitStructure.GPIO_Pin = BMI088_SELECT_MODE_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
GPIO_Init(BMI088_SELECT_MODE_PROT, &GPIO_InitStructure);
BMI088_SELECT_MODE_SPI_ENABLE;
GPIO_InitStructure.GPIO_Pin = BMI088_SPI_MOSI_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_PULLUP;
GPIO_Init(BMI088_SPI_MOSI_PROT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = BMI088_SPI_MISO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_PULLUP;
GPIO_Init(BMI088_SPI_MISO_PROT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = BMI088_SPI_CLK_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_PULLUP;
GPIO_Init(BMI088_SPI_CLK_PROT, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA,GPIO_PINSOURCE5,GPIO_AF_0);
GPIO_PinAFConfig(GPIOA,GPIO_PINSOURCE6,GPIO_AF_0);
GPIO_PinAFConfig(GPIOA,GPIO_PINSOURCE7,GPIO_AF_0);
GPIO_InitStructure.GPIO_Pin = BMI088_ACC_SPI_CS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
GPIO_Init(BMI088_ACC_SPI_CS_PROT, &GPIO_InitStructure);
BMI088_ACC_SPI_CS_H;
GPIO_InitStructure.GPIO_Pin = BMI088_GYRO_SPI_CS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
GPIO_Init(BMI088_GYRO_SPI_CS_PROT, &GPIO_InitStructure);
BMI088_GYRO_SPI_CS_H;
SPI_InitParaStruct.SPI_CRCPOL=7;
SPI_InitParaStruct.SPI_FirstBit=SPI_FIRSTBIT_MSB;
SPI_InitParaStruct.SPI_FrameFormat=SPI_FRAMEFORMAT_8BIT;
SPI_InitParaStruct.SPI_Mode=SPI_MODE_MASTER;
SPI_InitParaStruct.SPI_PSC=SPI_PSC_256;
SPI_InitParaStruct.SPI_SCKPH=SPI_SCKPH_1EDGE;
SPI_InitParaStruct.SPI_SCKPL=SPI_SCKPL_LOW;
SPI_InitParaStruct.SPI_SWNSSEN=SPI_SWNSS_SOFT;
SPI_InitParaStruct.SPI_TransType=SPI_TRANSTYPE_FULLDUPLEX;
SPI_Init(SPI1, &SPI_InitParaStruct);
SPI_Enable(SPI1,ENABLE);
}
uint8_t bmi088_spi_read_write_byte(uint8_t data_in)
{
uint8_t retry=0;
while (SPI_I2S_GetBitState(SPI1, SPI_FLAG_TBE) == RESET)
{
retry++;
if(retry>100)return 0;
}
SPI_I2S_SendData(SPI1, data_in);
retry=0;
while (SPI_I2S_GetBitState(SPI1, SPI_FLAG_RBNE) == RESET)
{
retry++;
if(retry>100)return 0;
}
return SPI_I2S_ReceiveData(SPI1);
}
void bmi088_read_chip_id(void)
{
BMI088_ACC_SPI_CS_ENABLE;
bmi088_spi_read_write_byte(BMI088_READ_ACC_CHIP_ID | BMI088_READ_CODE);
bmi088_spi_read_write_byte(0xFF);
g_bmi088_data.acc_chip_id=bmi088_spi_read_write_byte(0xFF);
BMI088_ACC_SPI_CS_DISABLE;
BMI088_GYRO_SPI_CS_ENABLE;
bmi088_spi_read_write_byte(BMI088_READ_GYRO_CHIP_ID | BMI088_READ_CODE);
g_bmi088_data.gyro_chip_id=bmi088_spi_read_write_byte(0xFF);
BMI088_GYRO_SPI_CS_DISABLE;
}
void bmi088_set_acc(uint8_t addr, uint8_t data)
{
BMI088_ACC_SPI_CS_ENABLE;
bmi088_spi_read_write_byte(addr & BMI088_WRITE_CODE);
bmi088_spi_read_write_byte(data);
delay_ms(50);
BMI088_ACC_SPI_CS_DISABLE;
}
void bmi088_set_gyro(uint8_t addr, uint8_t data)
{
BMI088_GYRO_SPI_CS_ENABLE;
bmi088_spi_read_write_byte(addr & BMI088_WRITE_CODE);
bmi088_spi_read_write_byte(data);
delay_ms(50);
BMI088_GYRO_SPI_CS_DISABLE;
}
void bmi088_read_acc(uint8_t addr, uint8_t readsize, uint8_t *readdata)
{
uint8_t i=0;
BMI088_ACC_SPI_CS_ENABLE;
bmi088_spi_read_write_byte(addr | BMI088_READ_CODE);
bmi088_spi_read_write_byte(0XFF);
for ( i = 0; i < readsize; i++)
{
readdata[i]=bmi088_spi_read_write_byte(0XFF);
}
BMI088_ACC_SPI_CS_DISABLE;
g_bmi088_data.acc_adc_x = ((int16_t)((g_bmi088_data.acc_raw_buff[1]) << 8) | g_bmi088_data.acc_raw_buff[0]);
g_bmi088_data.acc_adc_y = ((int16_t)((g_bmi088_data.acc_raw_buff[3]) << 8) | g_bmi088_data.acc_raw_buff[2]);
g_bmi088_data.acc_adc_z = ((int16_t)((g_bmi088_data.acc_raw_buff[5]) << 8) | g_bmi088_data.acc_raw_buff[4]);
}
void bmi088_read_gyro(uint8_t addr, uint8_t readsize, uint8_t *readdata)
{
uint8_t i=0;
BMI088_GYRO_SPI_CS_ENABLE;
bmi088_spi_read_write_byte(addr | BMI088_READ_CODE);
for ( i = 0; i < readsize; i++)
{
readdata[i]=bmi088_spi_read_write_byte(0XFF);
}
BMI088_GYRO_SPI_CS_DISABLE;
g_bmi088_data.gyro_adc_x = ((int16_t)((g_bmi088_data.gyro_raw_buff[1]) << 8) | g_bmi088_data.gyro_raw_buff[0]);
g_bmi088_data.gyro_adc_y = ((int16_t)((g_bmi088_data.gyro_raw_buff[3]) << 8) | g_bmi088_data.gyro_raw_buff[2]);
g_bmi088_data.gyro_adc_z = ((int16_t)((g_bmi088_data.gyro_raw_buff[5]) << 8) | g_bmi088_data.gyro_raw_buff[4]);
}
static float invSqrt(float x)
{
float halfx = 0.5f * x;
float y = x;
long i = *(long*)&y;
i = 0x5f3759df - (i>>1);
y = *(float*)&i;
y = y * (1.5f - (halfx * y * y));
return y;
}
#define Q_KP 1.50f
#define Q_KI 0.001f
#define Q_HALFT 0.005
void imu_updata(float gx,float gy,float gz,float ax,float ay,float az,Q_DATA *q_data)
{
float vx,vy,vz=0;
float ex,ey,ez=0;
float norm=0;
q_data->q0q0 = q_data->q0 * q_data->q0;
q_data->q0q1 = q_data->q0 * q_data->q1;
q_data->q0q2 = q_data->q0 * q_data->q2;
q_data->q0q3 = q_data->q0 * q_data->q3;
q_data->q1q1 = q_data->q1 * q_data->q1;
q_data->q1q2 = q_data->q1 * q_data->q2;
q_data->q1q3 = q_data->q1 * q_data->q3;
q_data->q2q2 = q_data->q2 * q_data->q2;
q_data->q2q3 = q_data->q2 * q_data->q3;
q_data->q3q3 = q_data->q3 * q_data->q3;
if(ax*ay*az == 0)return;
norm = invSqrt(ax*ax + ay*ay + az*az);
ax = ax * norm;
ay = ay * norm;
az = az * norm;
vx = 2*(q_data->q1q3 - q_data->q0q2);
vy = 2*(q_data->q0q1 + q_data->q2q3);
vz = q_data->q0q0 - q_data->q1q1 - q_data->q2q2 + q_data->q3q3;
ex = (ay*vz - az*vy);
ey = (az*vx - ax*vz);
ez = (ax*vy - ay*vx);
q_data->exInt = q_data->exInt + ex * Q_KI;
q_data->eyInt = q_data->eyInt + ey * Q_KI;
q_data->ezInt = q_data->ezInt + ez * Q_KI;
gx = gx + Q_KP*ex + q_data->exInt;
gy = gy + Q_KP*ey + q_data->eyInt;
gz = gz + Q_KP*ez + q_data->ezInt;
q_data->myq0a=(-q_data->q1*gx - q_data->q2*gy - q_data->q3*gz);
if(fabs(q_data->myq0a)<0.01){q_data->myq0a=0;}
if(fabs(q_data->q0)<0.001){q_data->q0=0;}
q_data->q0 = q_data->q0 + q_data->myq0a * Q_HALFT;
q_data->myq1a=(q_data->q0*gx + q_data->q2*gz - q_data->q3*gy);
if(fabs(q_data->myq1a)<0.01){q_data->myq1a=0;}
if(fabs(q_data->q1)<0.001){q_data->q1=0;}
q_data->q1 = q_data->q1 + q_data->myq1a*Q_HALFT;
q_data->myq2a=(q_data->q0*gy - q_data->q1*gz + q_data->q3*gx);
if(fabs(q_data->myq2a)<0.01){q_data->myq2a=0;}
if(fabs(q_data->q2)<0.001){q_data->q2=0;}
q_data->q2 = q_data->q2 + q_data->myq2a *Q_HALFT;
q_data->myq3a=(q_data->q0*gz + q_data->q1*gy - q_data->q2*gx);
if(fabs(q_data->myq3a)<0.01){q_data->myq3a=0;}
if(fabs(q_data->q3)<0.001){q_data->q3=0;}
q_data->q3 = q_data->q3 + (q_data->myq3a)*Q_HALFT;
norm = invSqrt(q_data->q0 * q_data->q0 + q_data->q1 * q_data->q1 + q_data->q2 * q_data->q2 + q_data->q3 * q_data->q3);
q_data->q0 = q_data->q0 * norm;
q_data->q1 = q_data->q1 * norm;
q_data->q2 = q_data->q2 * norm;
q_data->q3 = q_data->q3 * norm;
g_bmi088_data.fyaw_angle = (float)(atan2(2.f * (q_data->q1q2 + q_data->q0q3), q_data->q0q0 + q_data->q1q1 - q_data->q2q2 - q_data->q3q3)* 57.3f);
g_bmi088_data.hyaw_angle = g_bmi088_data.fyaw_angle*100;
g_bmi088_data.fpitch_angle = (float)(-asin(2.f * (q_data->q1q3 - q_data->q0q2))* 57.3f);
g_bmi088_data.hpitch_angle=g_bmi088_data.fpitch_angle;
g_bmi088_data.froll_angle = (float)(atan2(2.f * q_data->q2q3 + 2.f * q_data->q0q1, q_data->q0q0 - q_data->q1q1 - q_data->q2q2 + q_data->q3q3)* 57.3f);
g_bmi088_data.hroll_angle=g_bmi088_data.froll_angle;
}
float KalmanFilter(KALMAN *kfp,float input)
{
float temp0=0;
kfp->Now_P = kfp->Last_P + kfp->Q;
temp0=(kfp->Now_P + kfp->R);
if(temp0==0){temp0=0.00001;}
kfp->Kg = kfp->Now_P / temp0;
kfp->out = kfp->out + kfp->Kg * (input -kfp->out);
kfp->Last_P = (1-kfp->Kg) * kfp->Now_P;
return kfp->out;
}
void imu_prepare_data(float gx,float gy,float gz,float ax,float ay,float az)
{
float kalman_myax=0;
float kalman_myay=0;
float kalman_myaz=0;
float kalman_mygx=0;
float kalman_mygy=0;
float kalman_mygz=0;
kalman_myax=KalmanFilter(&kalman_ax,ax);
kalman_myay=KalmanFilter(&kalman_ay,ay);
kalman_myaz=KalmanFilter(&kalman_az,az);
kalman_mygx=KalmanFilter(&kalman_gx,gx);
kalman_mygy=KalmanFilter(&kalman_gy,gy);
kalman_mygz=KalmanFilter(&kalman_gz,gz);
g_bmi088_data.out_accx=(float)(kalman_myax * Acc_Gain *1000);
g_bmi088_data.out_accy=(float)(kalman_myay * Acc_Gain *1000);
g_bmi088_data.out_accz=(float)(kalman_myaz * Acc_Gain *1000);
g_bmi088_data.out_gyroz=(float)(kalman_mygz * Gyro_Gain *50);
g_bmi088_data.kalman_myax = (float)kalman_myax * Acc_Gain * G;
g_bmi088_data.kalman_myay = (float)kalman_myay * Acc_Gain * G;
g_bmi088_data.kalman_myaz = (float)kalman_myaz * Acc_Gain * G;
g_bmi088_data.kalman_mygx = (float)kalman_mygx * Gyro_Gr;
g_bmi088_data.kalman_mygy = (float)kalman_mygy * Gyro_Gr;
g_bmi088_data.kalman_mygz = (float)kalman_mygz * Gyro_Gr;
}
int main(void)
{
kalman_ax.Kg=0;
kalman_ax.Now_P=0;
kalman_ax.Last_P=1;
kalman_ax.Q=0.01;
kalman_ax.R=10;
kalman_ax.R=0;
kalman_ay.Kg=0;
kalman_ay.Now_P=0;
kalman_ay.Last_P=1;
kalman_ay.Q=0.01;
kalman_ay.R=10;
kalman_ay.R=0;
kalman_az.Kg=0;
kalman_az.Now_P=0;
kalman_az.Last_P=1;
kalman_az.Q=0.01;
kalman_az.R=10;
kalman_az.R=0;
kalman_gx.Kg=0;
kalman_gx.Now_P=0;
kalman_gx.Last_P=1;
kalman_gx.Q=0.01;
kalman_gx.R=10;
kalman_gx.R=0;
kalman_gy.Kg=0;
kalman_gy.Now_P=0;
kalman_gy.Last_P=1;
kalman_gy.Q=0.01;
kalman_gy.R=10;
kalman_gy.R=0;
kalman_gz.Kg=0;
kalman_gz.Now_P=0;
kalman_gz.Last_P=1;
kalman_gz.Q=0.01;
kalman_gz.R=10;
kalman_gz.R=0;
bmi088_init();
while(1)
{
}
}