首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MPU9150中的磁强计传感器误差

MPU9150中的磁强计传感器误差
EN

Stack Overflow用户
提问于 2017-11-05 14:07:11
回答 1查看 193关注 0票数 1

我编写了以下程序,利用通过MPU9150连接的I2c,得到acc、陀螺仪、磁传感器的值;我可以得到合适的acc和陀螺仪值,但磁传感器的值不合适。

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

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

代码语言:javascript
复制
#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);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2017-11-07 00:33:22

我看不出你发布的输出有什么问题。

我假设你发布的输出:

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

是来自磁强计的三个不同的读数:

代码语言:javascript
复制
lsb=0e,msb=00
lsb=12,msb=00
lsb=1d,msb=ff

根据MPU-9150注册地图第6.4节的说法,这些读数被存储为16位2的补码,并转换成磁通密度如下:

代码语言:javascript
复制
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寄存器中的ST1位。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47122474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档