我编写了以下程序,通过使用通过I2c连接Raspberrypi 2的MPU9150获得acc,gyro,磁传感器值; 我可以获得适当的acc和陀螺仪值,但磁传感器值不合适。
我显示了磁X轴(16位)的寄存器值。高字节为0x00或0xff,低字节为后果值[0x00,0xff]。所以,我认为磁性的高字节有问题。请让我知道如何解决它。
[output] 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);
}
}
答案 0 :(得分:1)
我发布的输出没有任何问题。
我假设您发布的输出:
ex.1 lsb = 0e,msb = 00,ex.2 lsb = 12,msb = 00,ex.3 lsb = 1d,msb = ff
是磁力计的三个独立读数:
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。
如果您仍然认为数据不正确,请确保在读取磁力计数据之前等待磁力计的DRDY
寄存器中的ST1
位。