【问题标题】:bno055 IMU Calibrationbno055 IMU 校准
【发布时间】:2020-04-07 17:37:46
【问题描述】:

我正在尝试从 IMU BNO055 中获得一些读数,下面是 ADA Fruit 的实现。

https://cdn-learn.adafruit.com/downloads/pdf/adafruit-bno055-absolute-orientation-sensor.pdf

我好像无法通过校准步骤。

BNO055 手册可以在下面找到: https://cdn-shop.adafruit.com/datasheets/BST_BNO055_DS000_12.pdf

我没有使用库,而是直接使用 I2C 进行通信并从设备寄存器读取和写入。

我正在做的配置如下:

    // The opening of the device and so on, works, so the line below is not a problem.
    if (ioctl(data_exchange->file_imu_sensor, I2C_SLAVE, data_exchange->imu_addr) < 0) {
                 printf("Impossible to communicate with the IMU in the i2c. Make sure that the address you have is correct!\n");
                 exit(1);
             }
    // Here is where I start with the configuration. First I reset the device.
    //SYS_TRIGGER Register. ADD 3F
    //CLK_SEL (0 internal oscillator) REST_INT(reset interrumptions)RST_SYS(1 to reset) x x x x Self_TEST(1 to make a self test.)
    // 00xxxx0
    buf[0] = 0x3F;
    buf[1] = 0x20; //00100000
    write_buf(data_exchange,buf,3);
    printf("IMU WAS COMMANDED TO RESET");
    sleep(1); //It needs some time to reset. With one sec should be sufficient.
    // Here I start with the real configuration.

    // G range 2G xxxxxx00
    // BW 7.81Hz  xxx000xx
    // Op mod normal 000xxxxx
    //So I will write a 0 to the register ACC_condfi
    buf[0] = 0x0D;
    buf[1] = 0x00;
    write_buf(data_exchange,buf,3);
    // Now unit selection.UNIT_SEL Page 30.
    //Accelaration m/s2 xxxxxxx0b
    // Magnetic field in micro Teslas (always)
    // Angular rate defrees ps xxxxxx0xb
    // Euler angles Degress> xxxxxxxb
    // Quaternion in Quaernion units always.
    //Temperatyre deg xxx0xxxxb
    // NPI The data output format can be selected by writing to the UNIT_SEL register, this allows user to switch between the orientation definition described by Windows and Android operating systems
    // Windows> 0xxxxxxxb
    // Android> 1xxxxxxxb. Page 30.
    // Bits 5 and 6 are reserved. So it does not matter. So we write a 0.
    buf[0] = 0x03;
    buf[1] = 0x00;
    write_buf(data_exchange,buf,3);

    //We now need to set the operation mode:
    //Register OPR_MODE Page 21.
    //Fusion mode NDOF. xxxx1100b
    buf[0] = 0x1C;
    buf[1] = 0x0C; //00001100
    write_buf(data_exchange,buf,3);

    // GYR_Config_0
    buf[0] = 0x0B;
    buf[1] = 0x00; //00001100
    write_buf(data_exchange,buf,3);


    // PWR_MODE. Normal mode is xxxxxx00b
    buf[0] = 0x3E;
    buf[1] = 0x00; //00000000
    write_buf(data_exchange,buf,3);

现在,我应该等待执行芯片的内部校准。但它似乎还没有完成。

我通过检查寄存器0x35来检查它,如果校准完成,它应该>0。

         char buf[10];
         int status=0;
         read_buf(dataset_pointer,0x35,3,buf);
         status=buf[0];
         if(status>0){
//Here is where I perform all the reading and so on.
}

我是否在配置中遗漏了什么?我在网上查了一下,我发现了一些关于使用设备在空中制作 8 符号的建议(也根据 IMU 手册),我这样做了,但无论如何校准都没有完成。

我认为这不是电源问题(我在 Bosh 论坛中找到了一些关于此问题的参考资料),因为我将 VIN 连接到 5.0V,将 3VO 连接到 3.3V,将 GND 连接到 GND。

对此的任何评论都会有很大帮助。我是否配置设备错误?我错过了任何寄存器吗?

谢谢!

【问题讨论】:

    标签: c imu


    【解决方案1】:

    我跟进了 ADAFruit 网页上的讨论。

    见:

    https://forums.adafruit.com/viewtopic.php?f=19&t=164389&p=808106#p808106

    总而言之,方法是:

    1. 进入配置模式(OP_MODE (0x3D) 设置为 0x00)
    2. 我们选择寄存器映射 0。(PAGE_ID (0x37) 设置为 0x00)
    3. 我们重置了设备(SYS_TRIGGER (0x3F) 设置为 0x20)
    4. 电源模式到正常模式(POWER_MODE (0x3E) 设置为 0x00)
    5. 在 SYS_TRIGGER 中选取的内部时钟(SYS_TRIGGER (0x3F) 设置为 0x00)
    6. OP_MODE 设置为 NDOF(因为我想)(OP_MODE (0x3D) 设置为 0x0B)

    可选,根据 Gammaburst ADA Fruit 论坛建议:

    1. //AXIS_MAP_CONFIG 0x41寄存器到0x21。
    2. //AXIS_MAP_SIGN 0x42寄存器转0x02;

    .

    buf[0] = 0X3D; //OP_MODE;
    buf[1] = 0x00; // Config mode
    write_buf(data_exchange,buf,3);
    
    
    buf[0] = 0x07; // BNO055_PAGE_ID_ADDR
    buf[1] = 0x00; // We want to access the Register Map 0. See page 51 of the Manual https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bno055-ds000.pdf
    write_buf(data_exchange,buf,3);
    
    buf[0] = 0x3F; //(SYS_TRIGGER)
    buf[1] = 0x20; //00100000 Reset!
    write_buf(data_exchange,buf,3);
    printf("IMU WAS COMMANDED TO RESET");
    sleep(0.65); //It needs some time to reset. With one sec should be sufficient.
    
    
    buf[0] = 0x3E; //(POWER_MODE)
    buf[1] = 0x00; //00000000 Normal mode
    write_buf(data_exchange,buf,3);
    
    
    buf[0] = 0x3F; // SYS_TRIGGER
    buf[1] = 0x00; //00000000 Iternal clock
    write_buf(data_exchange,buf,3);
    
    buf[0] = 0X3D; //OP_MODE;
    buf[1] = 0x0B; //NDOF
    write_buf(data_exchange,buf,3);
    
    //These two are optional as per suggestion from gammaburst user in ADAFruit forums
    //AXIS_MAP_CONFIG
    buf[0] = 0x41;
    buf[1] = 0x21;
    write_buf(data_exchange,buf,3);
    
    
    // AXIS_MAP_SIGN
     buf[0] = 0x42;
     buf[1] = 0x02;
     write_buf(data_exchange,buf,3);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 2011-04-05
      • 2016-02-27
      • 1970-01-01
      相关资源
      最近更新 更多