2017-11-05 3 views
1

I2c를 통해 Raspberrypi 2에 연결된 MPU9150을 사용하여 Acc, Gyro, 자기 센서 값을 얻으려면 다음 프로그램을 코딩했습니다. 올바른 acc 및 자이로 값을 얻을 수 있지만 자기 센서 값이 올바르지 않습니다.MPU9150에서 자력계 센서 오류

자기 X 축 (16 비트)의 레지스터 값을 표시했습니다. 상위 바이트는 0x00 또는 0xff이고 하위 바이트는 결과 값 [0x00,0xff]입니다. 그래서 자성의 상위 바이트에는 문제가 있다고 생각합니다. 해결 방법을 알려주십시오.

[출력] 예 1 LSB = 0E, MSB = 00 예 2 LSB = 12, 00 = MSB, 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); 
    } 
} 

답변

1

당신이 올린 결과물에 아무런 이상이 보이지 않습니다.

나는 있으리라 믿고있어 당신이 게시 출력 :

예 1 LSB = 0E, MSB = 00, 예 2 LSB = 12, MSB = 00 하심을 뜻 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μT 인 지구 자기장의 자속 밀도에 적합한 크기 순서입니다.

여전히 잘못된 데이터가 있다고 생각되면 자력계 데이터를 읽기 전에 자력계 ST1 레지스터의 DRDY 비트가 설정 될 때까지 기다리는 지 확인하십시오.

+0

답장을 보내 주셔서 감사합니다. – kkj

+0

나는 지구 자기장의 자속 밀도에 대한 정확한 크기 순서를 오해했다. msb는 항상 2 가지 유형의 값 (0xff 또는 0x00)이므로,이 값은 corect가 아니라는 오해가 있습니다. 그러나 msb는 지구 자기장의 값을 바꾸지 않아야합니다. 왜냐하면 아주 작은 값이기 때문입니다. – kkj

+0

@kkj이 질문에 대한 답변이 되었습니까? – Tim