【问题标题】:Magnetometer sensor error in MPU9150MPU9150 中的磁力计传感器错误
【发布时间】:2017-11-05 14:07:11
【问题描述】:

我编写了以下程序,使用通过 I2c 连接 Raspberrypi 2 的 MPU9150 获取 acc、陀螺仪、磁传感器值; 我可以得到正确的 acc 和 gyro 值,但是磁传感器值不正确。

我显示了磁X轴(16bit)的寄存器值。高字节为 0x00 或 0xff,低字节为结果值 [0x00,0xff]。所以,我认为磁性的高字节有问题。请告诉我如何解决它。

[输出]ex.1 lsb=0e,msb=00,ex.2 lsb=12,msb=00,ex.3 lsb=1d,msb=ff

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <wiringPi.h>
#include <wiringPiI2C.h>

#define MPU9150_ADDRESS (0x68)     
#define MPU9150_REG_PWR_MGMT_1 (0x6b) 
#define MPU9150_INT_PIN_CFG (0x37)   
#define MPU9150_GYRO_CFG (0x1b)
#define MPU9150_REG_DATA_START (0x3b) 
#define M_I2C_ADDRESS (0x0c)         
#define M_CNTL (0x0A)
#define M_REG_DATA_START (0x03)     

int main(int argc, char *argv[]) {
    printf("MPU9150 starting\n");
    // Setup Wiring Pi
    wiringPiSetup();
    // Open an I2C connection
    int fd = wiringPiI2CSetup(MPU9150_ADDRESS); 

    // MPU6050_REG_PWR_MGMT_1
    wiringPiI2CWriteReg8(fd, MPU9150_REG_PWR_MGMT_1, 0x00);

    wiringPiI2CWriteReg8(fd,MPU9150_INT_PIN_CFG, 0x02);

    wiringPiI2CWriteReg8(fd,MPU9150_GYRO_CFG, 0x10);

    int fd2 = wiringPiI2CSetup(M_I2C_ADDRESS);
    wiringPiI2CWriteReg8(fd2,M_CNTL, 0x01);

    while(1) {
        uint8_t msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START);
        uint8_t lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+1);
        float accelX = ( msb << 24 | lsb << 16 ) >> 16;

        msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+2);
        lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+3);
        float  accelY = ( msb << 24 | lsb << 16 ) >> 16;

        msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+4);
        lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+5)
        float  accelZ = ( msb << 24 | lsb << 16 ) >> 16;

        msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+6);
        lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+7);
        float  temp = ( msb << 24 | lsb << 16 ) >> 16;

        msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+8);
        lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+9);
        float  gyroX = ( msb << 24 | lsb << 16 ) >> 16;

        msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+10);
        lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+11);
        float  gyroY = ( msb << 24 | lsb << 16 ) >> 16;

        msb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+12);
        lsb = wiringPiI2CReadReg8(fd, MPU9150_REG_DATA_START+13);
        float  gyroZ = ( msb << 24 | lsb << 16 ) >> 16;

        wiringPiI2CWriteReg8(fd2,M_CNTL, 0x01);
        delay(10);
        lsb = wiringPiI2CReadReg8(fd2, M_REG_DATA_START);
        msb = wiringPiI2CReadReg8(fd2, M_REG_DATA_START+1);
        float  magX =  ((int16_t msb << 8 )| lsb ;

        lsb = wiringPiI2CReadReg8(fd2, M_REG_DATA_START+2);
        msb = wiringPiI2CReadReg8(fd2, M_REG_DATA_START+3);
        float  magY = ((int16_t msb << 8 )| lsb ;

        lsb = wiringPiI2CReadReg8(fd2, M_REG_DATA_START+4);
        msb = wiringPiI2CReadReg8(fd2, M_REG_DATA_START+5);
        float  magZ = ((int16_t msb << 8 )| lsb ;

        printf("lsb=%x,msb=%x\n",lsb,msb);
    }
}

【问题讨论】:

    标签: c wiringpi


    【解决方案1】:

    我认为您发布的输出没有任何问题。

    我假设您发布的输出:

    ex.1 lsb=0e,msb=00,ex.2 lsb=12,msb=00,ex.3 lsb=1d,msb=ff

    是来自磁力计的 3 个独立读数:

    lsb=0e,msb=00
    lsb=12,msb=00
    lsb=1d,msb=ff
    

    根据section 6.4 of the MPU-9150 register map,这些读数存储为 16 位 2 的补码,并转换为磁通密度:

    lsb=0e,msb=00 = 0x000e = 14 decimal   =  4.2 uT
    lsb=12,msb=00 = 0x0012 = 18 decimal   =  5.4 uT
    lsb=1d,msb=ff = 0xff1d = -227 decimal = -68.1 uT
    

    对于地球磁场的磁通密度,这些读数处于正确的数量级,约为 35 - 60 uT。

    如果您仍然认为您得到的数据不正确,请确保在读取磁力计数据之前等待磁力计的ST1 寄存器中的DRDY 位被设置。

    【讨论】:

    • 感谢您的回复。
    • 我误解了地球磁场磁通密度的正确数量级。 msb 总是只有两种类型的值(0xff 或 0x00),所以我误解了这个读数值不正确。但是 msb 不应该改变地球磁场中的值,因为它的值很小。
    • @kkj 这回答了你的问题吗?
    • 好的,非常感谢。
    猜你喜欢
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    相关资源
    最近更新 更多