ICM20602 姿态解算

2019-07-20 23:34发布

请教一下大家,ICM20602没有DMP可以直接用来合成四元数。只能获取Acce,Gyro六个轴向的原始数据。请教一下大家,如何获取四元数?
我尝试过这个   https://www.cnblogs.com/dchipnau/p/5310088.html  这个链接里面的四元数法,一阶滤波和卡尔曼滤波,最后得到的数据都不稳定。
特别是Yaw轴向,数据一致在循环,如下图所示:  XY方向也不是很稳定。请问这个是为什么。下面是我的代码。
希望哪位高手大神们指点一下,谢谢!!!

#include "bsp_icm20602.h"
#include <stdio.h>
#include <math.h>

/*
* Brief        For read ICM20602 WHO AM I
* Parameters   None
* Return                None
* NOTE         None     
*/
void ICM206XX_ReadWhoAmI(void)
{
    unsigned char ICM206XX_ID;

    ICM206XX_ReadReg(ICM20602_DEV_ADDR, ICM20602_WHO_AM_I, &ICM206XX_ID);

    printf("WHO AM I is: 0x%x ",ICM206XX_ID);
}

/*
* Brief        For ICM206XX self-test
* Parameters   None
* Return                None
* NOTE         None     
*/
void ICM206XX_Self1_Check(void)
{
    unsigned char Read_ID;

    while(0x12 != Read_ID)
    {
        //Always self-test,until to read correct ID
        ICM206XX_ReadReg(ICM20602_DEV_ADDR, ICM20602_WHO_AM_I, &Read_ID);
    }
}

void ICM206XX_Self_Test(void)
{
    unsigned char selfTest_Gyro = 0xE0;
    unsigned char selfTest_Acce = 0xE0;

    ICM206XX_WriteReg(ICM20602_DEV_ADDR, ICM20602_GYRO_CONFIG, &selfTest_Gyro);
    ICM206XX_WriteReg(ICM20602_DEV_ADDR, ICM20602_ACCEL_CONFIG, &selfTest_Acce);
}


/*
* Brief        For ICM206XX init
* Parameters   None
* Return                None
* NOTE         None     
*/
void ICM206XX_Init(void)
{
    unsigned char pwrMgmt = 0x80;
    unsigned char pwrMgmt_test;

    unsigned char cfg_Pwr_mgnt_1        = 0x01;
    unsigned char cfg_Pwr_mgnt_2        = 0x00;
    unsigned char cfg_ICM20602_config   = 0x01;
    unsigned char cfg_Smplrv_div        = 0x07;
    unsigned char cfg_Gyro_config       = 0x18;
    unsigned char cfg_Acce_config_1     = 0x18;  
    unsigned char cfg_Acce_config_2     = 0x23;

    ICM206XX_Self1_Check();  //self-test

    //self_test


    //Reset
    ICM206XX_WriteReg(ICM20602_DEV_ADDR, ICM20602_PWR_MGMT_1, &pwrMgmt);
    IIC_delay(IIC_DELAY_COUNT*10);

    //Wait for reset complete, can also use do...while()
    while(0x80 & pwrMgmt_test)
    {
        ICM206XX_ReadReg(ICM20602_DEV_ADDR, ICM20602_PWR_MGMT_1, &pwrMgmt_test);
    }

    //Config ICM20602
    ICM206XX_WriteReg(ICM20602_DEV_ADDR, ICM20602_PWR_MGMT_1,       &cfg_Pwr_mgnt_1);       //Setting clk
    ICM206XX_WriteReg(ICM20602_DEV_ADDR, ICM20602_PWR_MGMT_2,       &cfg_Pwr_mgnt_2);       //start gyro and acce
    ICM206XX_WriteReg(ICM20602_DEV_ADDR, ICM20602_CONFIG,           &cfg_ICM20602_config);  //set 176Hz 1KHz
    ICM206XX_WriteReg(ICM20602_DEV_ADDR, ICM20602_SMPLRT_DIV,       &cfg_Smplrv_div);       //SAMPLE_RATE = INTERNAL_SAMPLE_RATE / (1 + SMPLRT_DIV)
    ICM206XX_WriteReg(ICM20602_DEV_ADDR, ICM20602_GYRO_CONFIG,      &cfg_Gyro_config);      //&#161;à2000 dps
    ICM206XX_WriteReg(ICM20602_DEV_ADDR, ICM20602_ACCEL_CONFIG,     &cfg_Acce_config_1);    //&#161;à16g
    ICM206XX_WriteReg(ICM20602_DEV_ADDR, ICM20602_ACCEL_CONFIG_2,   &cfg_Acce_config_2);    //Average 8 samples   44.8HZ
    printf("Init Complete! ");
}

/*
* Brief        For ICM206XX init
* Parameters   *Src_Acce: get Accelerate source data
* Return                None
* NOTE         None     
*/
void ICM206XX_GetAcceSrcData(int short *Src_Acce)
{
    unsigned char temp_acce[6];

    ICM206XX_MultiReadReg(ICM20602_DEV_ADDR, ICM20602_ACCEL_XOUT_H, temp_acce, 6);

    IIC_delay(IIC_DELAY_COUNT*100);
    Src_Acce[0] = (temp_acce[0] << 8) | temp_acce[1];
    Src_Acce[1] = (temp_acce[2] << 8) | temp_acce[3];
    Src_Acce[2] = (temp_acce[4] << 8) | temp_acce[5];
}

/*
* Brief        For ICM206XX init
* Parameters   *Src_Acce: get Accelerate source data
* Return                None
* NOTE         None     
*/
void ICM206XX_GetGyroSrcData(int short *Src_Gyro)
{
    unsigned char temp_gyro[6];

    ICM206XX_MultiReadReg(ICM20602_DEV_ADDR, ICM20602_GYRO_XOUT_H, temp_gyro, 6);

    IIC_delay(IIC_DELAY_COUNT*100);
    Src_Gyro[0] = (temp_gyro[0] << 8) | temp_gyro[1];
    Src_Gyro[1] = (temp_gyro[2] << 8) | temp_gyro[3];
    Src_Gyro[2] = (temp_gyro[4] << 8) | temp_gyro[5];
}

#if 0

//====================================quaternion================================
#define Kp 100.0f                           // ±èày&#212;&#246;ò&#230;&#214;§&#197;&#228;&#194;êê&#213;á2μ&#189;&#188;ó&#203;ù&#182;è&#188;&#198;
#define Ki 0.002f                           // &#187;y·&#214;&#212;&#246;ò&#230;&#214;§&#197;&#228;&#194;êμ&#196;íó&#194;Yò&#199;&#198;&#171;&#188;&#251;μ&#196;&#207;&#206;&#189;ó
#define halfT 0.001f                        // 2é&#209;ù&#214;ü&#198;úμ&#196;ò&#187;°&#235;

float q0 = 1, q1 = 0, q2 = 0, q3 = 0;       // &#203;&#196;&#212;aêyμ&#196;&#212;a&#203;&#216;£&#172;′ú±í1à&#188;&#198;·&#189;&#207;ò
float exInt = 0, eyInt = 0, ezInt = 0;      // °′±èày&#203;&#245;D&#161;&#187;y·&#214;&#206;ó2&#238;

float Yaw,Pitch,Roll;                       // &#198;&#171;o&#189;&#189;&#199;£&#172;&#184;&#169;&#209;&#246;&#189;&#199;£&#172;1&#246;×a&#189;&#199;

void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
{
    float norm;
    float vx, vy, vz;
    float ex, ey, ez;  

    // 2aá&#191;&#213;y3£&#187;ˉ
    norm = sqrt(ax*ax + ay*ay + az*az);      
    ax = ax / norm;                   //???
    ay = ay / norm;
    az = az / norm;      

    // 1à&#188;&#198;·&#189;&#207;òμ&#196;&#214;&#216;á|
    vx = 2*(q1*q3 - q0*q2);
    vy = 2*(q0*q1 + q2*q3);
    vz = q0*q0 - q1*q1 - q2*q2 + q3*q3;

    // ′í&#206;óμ&#196;áìóòoí·&#189;&#207;ò′&#171;&#184;D&#198;÷2aá&#191;2&#206;&#191;&#188;·&#189;&#207;ò&#214;&#174;&#188;&#228;μ&#196;&#189;&#187;2&#230;3é&#188;¨μ&#196;×üoí
    ex = (ay*vz - az*vy);
    ey = (az*vx - ax*vz);
    ez = (ax*vy - ay*vx);

    // &#187;y·&#214;&#206;ó2&#238;±èày&#187;y·&#214;&#212;&#246;ò&#230;
    exInt = exInt + ex*Ki;
    eyInt = eyInt + ey*Ki;
    ezInt = ezInt + ez*Ki;

    // μ÷&#213;&#251;oóμ&#196;íó&#194;Yò&#199;2aá&#191;
    gx = gx + Kp*ex + exInt;
    gy = gy + Kp*ey + eyInt;
    gz = gz + Kp*ez + ezInt;

    // &#213;&#251;o&#207;&#203;&#196;&#212;aêy&#194;êoí&#213;y3£&#187;°
    q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
    q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
    q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
    q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;  

    // &#213;y3£&#187;°&#203;&#196;&#212;aêy
    norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
    q0 = q0 / norm;
    q1 = q1 / norm;
    q2 = q2 / norm;
    q3 = q3 / norm;



    Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch ,?????
    Roll  = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // rollv
    Yaw   = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;                //??????,??
}
//====================================quaternion================================
#endif


#if 1
//====================================ò&#187;&#189;×&#187;¥21&#194;&#203;2¨==============================
#define Kp      10.0f                       // &#213;aà&#239;μ&#196;Kpó&#195;óúμ÷&#213;&#251;&#188;ó&#203;ù&#182;è&#188;&#198;DT&#213;yíó&#194;Yò&#199;μ&#196;&#203;ù&#182;è
#define Ki      0.008f                        
#define halfT   0.001f                      // 2é&#209;ù&#214;ü&#198;úμ&#196;ò&#187;°&#235;£&#172;ó&#195;óú&#199;ó&#189;a&#203;&#196;&#212;aêy&#206;¢·&#214;·&#189;3ìê±&#188;&#198;&#203;&#227;&#189;&#199;&#212;&#246;á&#191;
float   q0 = 1, q1 = 0, q2 = 0, q3 = 0;     // 3&#245;ê&#188;×&#203;ì&#172;&#203;&#196;&#212;aêy
float   exInt = 0, eyInt = 0, ezInt = 0;    //μ±&#199;°&#188;ó&#188;&#198;2aμ&#195;μ&#196;&#214;&#216;á|&#188;ó&#203;ù&#182;è&#212;úèy&#214;áé&#207;μ&#196;·&#214;á&#191;ó&#235;ó&#195;μ±&#199;°×&#203;ì&#172;&#188;&#198;&#203;&#227;μ&#195;à′μ&#196;&#214;&#216;á|&#212;úèy&#214;áé&#207;μ&#196;·&#214;á&#191;μ&#196;&#206;ó2&#238;μ&#196;&#187;y·&#214;

float Yaw,Pitch,Roll;                       // &#198;&#171;o&#189;&#189;&#199;£&#172;&#184;&#169;&#209;&#246;&#189;&#199;£&#172;1&#246;×a&#189;&#199;

void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)//g±íê&#190;íó&#194;Yò&#199;£&#172;a±íê&#190;&#188;ó&#188;&#198;
{

  float q0temp,q1temp,q2temp,q3temp;    //&#203;&#196;&#212;aêy&#212;Y′&#230;±&#228;á&#191;£&#172;&#199;ó&#189;a&#206;¢·&#214;·&#189;3ìê±òaó&#195;
  float norm;                           //ê&#184;á&#191;μ&#196;&#196;£&#187;ò&#213;&#223;&#203;&#196;&#212;aêyμ&#196;·&#182;êy
  float vx, vy, vz;                     //μ±&#199;°×&#203;ì&#172;&#188;&#198;&#203;&#227;μ&#195;à′μ&#196;&#214;&#216;á|&#212;úèy&#214;áé&#207;μ&#196;·&#214;á&#191;
  float ex, ey, ez;                     //μ±&#199;°×&#203;ì&#172;&#188;&#198;&#203;&#227;μ&#195;à′μ&#196;&#214;&#216;á|&#188;ó&#203;ù&#182;è&#212;úèy&#214;áé&#207;μ&#196;·&#214;á&#191;£&#172;ó&#235;μ±&#199;°×&#203;ì&#172;&#188;&#198;&#203;&#227;μ&#195;à′μ&#196;&#214;&#216;á|&#212;úèy&#214;á·&#214;á&#191;μ&#196;&#206;ó2&#238;&#161;£

  // &#207;è°&#209;&#213;aD&#169;ó&#195;μ&#195;μ&#189;μ&#196;&#214;μ&#203;&#227;o&#195;
  float q0q0 = q0*q0;
  float q0q1 = q0*q1;
  float q0q2 = q0*q2;
  float q1q1 = q1*q1;
  float q1q3 = q1*q3;
  float q2q2 = q2*q2;
  float q2q3 = q2*q3;
  float q3q3 = q3*q3;  

  if(ax*ay*az==0)       // &#188;ó&#188;&#198;′|óú×&#212;óé&#194;&#228;ì&#229;×′ì&#172;ê±£&#172;2&#187;&#189;&#248;DD×&#203;ì&#172;&#189;a&#203;&#227;£&#172;òò&#206;a&#187;á2úéú·&#214;&#196;&#184;&#206;T&#199;&#238;′óμ&#196;&#199;é&#191;&#246;
        return;

  norm = sqrt(ax*ax + ay*ay + az*az);   // μ¥&#206;&#187;&#187;ˉ&#188;ó&#203;ù&#188;&#198;
  ax = ax /norm;                        // &#213;a&#209;ù±&#228;&#184;üá&#203;á&#191;3ìò22&#187;DèòaDT&#184;&#196;Kp2&#206;êy£&#172;òò&#206;a&#213;aà&#239;1éò&#187;&#187;ˉá&#203;
  ay = ay / norm;
  az = az / norm;

  //μ±&#199;°×&#203;ì&#172;&#188;&#198;&#203;&#227;3&#246;&#214;&#216;á|&#212;úèy&#184;&#246;&#214;áé&#207;μ&#196;·&#214;á&#191;
  //2&#206;&#191;&#188;×&#248;±ên&#207;μ×a&#187;ˉμ&#189;&#212;&#216;ì&#229;×&#248;±êb&#207;μμ&#196;ó&#195;&#203;&#196;&#212;aêy±íê&#190;μ&#196;·&#189;&#207;òóà&#207;ò&#190;&#216;&#213;óμúèyáD
  vx = 2*(q1q3 - q0q2);        
  vy = 2*(q0q1 + q2q3);
  vz = q0q0 - q1q1 - q2q2 + q3q3;

  //&#188;&#198;&#203;&#227;2aμ&#195;&#214;&#216;á|ó&#235;&#188;&#198;&#203;&#227;μ&#195;μ&#189;μ&#196;&#214;&#216;á|&#188;&#228;μ&#196;&#206;ó2&#238;£&#172;&#207;òá&#191;ía&#187;y&#191;éò&#212;±íê&#190;&#213;aò&#187;&#206;ó2&#238;
  //&#212;-ê&#188;&#206;òàí&#189;aê&#199;òò&#206;a&#213;aá&#189;&#184;&#246;&#207;òá&#191;ê&#199;μ¥&#206;&#187;&#207;òá&#191;&#199;òsin0 = 0£&#187;
  //2&#187;1yòaê&#199;&#188;D&#189;&#199;ê&#199;180&#182;è&#196;&#216;~&#213;a&#184;&#246;&#187;1&#195;&#187;àí&#189;a
  ex = (ay*vz - az*vy) ;                                                                  
  ey = (az*vx - ax*vz) ;
  ez = (ax*vy - ay*vx) ;

  exInt = exInt + ex * Ki;            //&#182;&#212;&#206;ó2&#238;&#189;&#248;DD&#187;y·&#214;
  eyInt = eyInt + ey * Ki;
  ezInt = ezInt + ez * Ki;

  // adjusted gyroscope measurements
  gx = gx + Kp*ex + exInt;  //&#189;&#171;&#206;ó2&#238Ioó213¥μ&#189;íó&#194;Yò&#199;£&#172;&#188;′213¥á&#227;μ&#227;&#198;ˉò&#198;
  gy = gy + Kp*ey + eyInt;
  gz = gz + Kp*ez + ezInt;    //&#213;aà&#239;μ&#196;gzóéóú&#195;&#187;óD1&#219;2a&#213;&#223;&#189;&#248;DDD£&#213;y&#187;á2úéú&#198;ˉò&#198;£&#172;±í&#207;&#214;3&#246;à′μ&#196;&#190;íê&#199;&#187;y·&#214;×&#212;&#212;&#246;&#187;ò&#213;&#223;×&#212;&#188;&#245;

  //&#207;&#194;&#195;&#230;&#189;&#248;DD×&#203;ì&#172;μ&#196;&#184;üD&#194;£&#172;ò2&#190;íê&#199;&#203;&#196;&#212;aêy&#206;¢·&#214;·&#189;3ìμ&#196;&#199;ó&#189;a
  q0temp=q0;    //&#212;Y′&#230;μ±&#199;°&#214;μó&#195;óú&#188;&#198;&#203;&#227;
  q1temp=q1;    //í&#248;é&#207;′&#171;μ&#196;&#203;&#227;·¨′ó&#182;à&#195;&#187;óD×¢òa&#213;a&#184;&#246;&#206;êìa£&#172;&#212;ú′&#203;&#184;ü&#213;y
  q2temp=q2;
  q3temp=q3;

  //2éó&#195;ò&#187;&#189;×±è&#191;¨&#189;a·¨£&#172;&#207;à1&#216;&#214;aê&#182;&#191;éò&#212;2&#206;&#188;&#251;&#161;&#182;1&#223;D&#212;&#198;÷&#188;tó&#235;μ&#188;o&#189;&#207;μí3&#161;·P212
  q0 = q0temp + (-q1temp*gx - q2temp*gy -q3temp*gz)*halfT;
  q1 = q1temp + (q0temp*gx + q2temp*gz -q3temp*gy)*halfT;
  q2 = q2temp + (q0temp*gy - q1temp*gz +q3temp*gx)*halfT;
  q3 = q3temp + (q0temp*gz + q1temp*gy -q2temp*gx)*halfT;

  //μ¥&#206;&#187;&#187;ˉ&#203;&#196;&#212;aêy&#212;ú&#191;&#213;&#188;&#228;Dy×aê±2&#187;&#187;áà-éì£&#172;&#189;&#246;óDDy×a&#189;&#199;&#182;è£&#172;&#213;aàà&#203;&#198;óú&#207;&#223;D&#212;′úêyà&#239;&#195;&#230;μ&#196;&#213;y&#189;&#187;±&#228;&#187;ˉ
  norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
  q0 = q0 / norm;
  q1 = q1 / norm;
  q2 = q2 / norm;
  q3 = q3 / norm;

  //&#203;&#196;&#212;aêyμ&#189;&#197;·à-&#189;&#199;μ&#196;×a&#187;&#187;
  //&#198;&#228;&#214;DYAWo&#189;&#207;ò&#189;&#199;óéóú&#188;ó&#203;ù&#182;è&#188;&#198;&#182;&#212;&#198;&#228;&#195;&#187;óDDT&#213;y×÷ó&#195;£&#172;òò′&#203;′&#203;′|&#214;±&#189;óó&#195;íó&#194;Yò&#199;&#187;y·&#214;′úì&#230;
  Yaw   = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3; // yaw  
  Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)*57.3; // pitch
  Roll  = atan2(2 * q2 * q3 + 2 * q0 * q1,-2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
}
#endif
//====================================ò&#187;&#189;×&#187;¥21&#194;&#203;2¨==============================

/*
* Brief        For ICM206XX get angular velocity pitch roll yaw
* Parameters   *Temp_GyroX: get X-axis angular velocity
*              *Temp_GyroY: get Y-axis angular velocity
*              *Temp_GyrpZ: get Z-axis angular velocity
* Return                None
* NOTE         None     
*/
void ICM206XX_GetGyroVelocity(float *Temp_GyroX, float *Temp_GyroY, float *Temp_GyroZ)
{
    int short test_acce[3];
    int short Gyro_Offset[3];
    unsigned char offset_SrcData[6];
    int Sensitivity_X = 131;      //Gyro_Sensitivity = 131 LSB/(deg/s)
    int Sensitivity_Y = 131;      //Gyro_Sensitivity = 131 LSB/(deg/s)
    int Sensitivity_Z = 131;      //Gyro_Sensitivity = 131 LSB/(deg/s)

    ICM206XX_GetAcceSrcData(test_acce);

    ICM206XX_MultiReadReg(ICM20602_DEV_ADDR, ICM20602_XG_OFFS_USRH, offset_SrcData, 6);

    Gyro_Offset[0] = (offset_SrcData[0] << 8) | offset_SrcData[1];
    Gyro_Offset[1] = (offset_SrcData[2] << 8) | offset_SrcData[3];
    Gyro_Offset[2] = (offset_SrcData[4] << 8) | offset_SrcData[5];

    *Temp_GyroX = (test_acce[0] - Gyro_Offset[0])/(Sensitivity_X);
    *Temp_GyroY = (test_acce[1] - Gyro_Offset[1])/(Sensitivity_Y);
    *Temp_GyroZ = (test_acce[2] - Gyro_Offset[2])/(Sensitivity_Z);
}

/*
* Brief        For ICM206XX get acce pitch roll yaw
* Parameters   *Temp_AcceX: get X-axis Acce velocity
*              *Temp_AcceY: get Y-axis Acce velocity
*              *Temp_AcceZ: get Z-axis Acce velocity
* Return                None
* NOTE         None     
*/
void ICM206XX_GetAcceVelocity(float *Temp_AcceX, float *Temp_AcceY, float *Temp_AcceZ)
{
    int short test_acce[3];

    ICM206XX_GetAcceSrcData(test_acce);

    *Temp_AcceX = test_acce[0]/8192.0;
    *Temp_AcceY = test_acce[1]/8192.0;
    *Temp_AcceZ = test_acce[2]/8192.0;
}
//=====================================Test=====================================
/*
* Brief        For ICM206XX Test
* Parameters   None
* Return                None
* NOTE         None     
*/
void ICM206XX_Test(void)
{
//    unsigned char i;
//    int short test_acce[3];
//    int short test_gyro[3];
    float AcceX,AcceY,AcceZ;
    float GyroX,GyroY,GyroZ;


    //ICM206XX_ReadWhoAmI();

//    ICM206XX_GetAcceSrcData(test_acce);
//    ICM206XX_GetGyroSrcData(test_gyro);

//    //&#182;¨&#214;μ2aê&#212;êy&#190;Yê&#199;·&#241;ì&#248;&#182;ˉ£&#172;è&#244;2&#187;ì&#248;&#182;ˉ£&#172;&#212;ò&#203;&#196;&#212;aêy&#203;&#227;·¨&#195;&#187;&#206;êìa   
//    GyroX = 0x50;
//    GyroY = 0x50;
//    GyroZ = 0x50;
//    AcceX = 0.9;
//    AcceY = 0.9;
//    AcceZ = 0.9;

    ICM206XX_GetGyroVelocity(&GyroX, &GyroY, &GyroZ);
    ICM206XX_GetAcceVelocity(&AcceX, &AcceY, &AcceZ);



//    printf("Gyro[0] = %+5.1f, Gyro[1] = %+5.1f, Gyro[2] = %+5.1f, Acce[0] = %+5.1f, Acce[1] = %+5.1f, Acce[2] = %+5.1f ",
//            GyroX,GyroY,GyroZ, AcceX,AcceY,AcceZ);


    IMUupdate(GyroX,GyroY,GyroZ, AcceX,AcceY,AcceZ);
    //IIC_delay(IIC_DELAY_COUNT*100000);
    printf("itch = %+5.1f, Roll = %+5.1f, Yaw = %5.1f ",Pitch, Roll, Yaw);
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。