我试图从我的MPU-9150磁力计读出数据并得到一些奇数。我已经访问了IMU中的磁力计,并且获得的数据随着IMU的方向而变化,但不在产品规格指南规定的范围内。我认为它可能与我用于存储数据的变量类型或我用来操纵二进制补码数据以使其可读的方法有关,所以这里的代码无论如何......
void MPU9150::getMag(double* mag_X, double* mag_Y, double* mag_Z){
uint8_t asax, asay, asaz;
I2Cdev::writeByte(MPU9150_ADDRESS, INT_PIN_CFG, 0x02);//Set i2c bypass enable pin to true to access magnetometer.
I2Cdev::writeByte(MPU9150_MAG_ADDRESS, MPU9150_MAG_CNTRL, 0x0f);//Fuse Rom access mode.
I2Cdev::readBytes(MPU9150_MAG_ADDRESS, MPU9150_MAG_ASAX, 3, buffer);//Get sensitivity adjustment values.
asax = buffer[0];
asay = buffer[1];
asaz = buffer[2];
// Serial.print("asax = "); Serial.print(asax); Serial.print("\n");
// Serial.print("asay = "); Serial.print(asay); Serial.print("\n");
// Serial.print("asaz = "); Serial.print(asaz); Serial.print("\n\n");
I2Cdev::writeByte(MPU9150_MAG_ADDRESS, MPU9150_MAG_CNTRL, 0X01);//Enable the magnetometer.
delay(10);
I2Cdev::readBytes(MPU9150_MAG_ADDRESS, MPU9150_MAG_XOUT_L, 6, buffer);//Read magnetometer readings.
mx = ((((int16_t)buffer[0]) << 8) | buffer[1]) * 0.3;
my = ((((int16_t)buffer[2]) << 8) | buffer[3]) * 0.3;
mz = ((((int16_t)buffer[4]) << 8) | buffer[5]) * 0.3;
*mag_X = mx * ((((asax - 128)*0.5)/(128)) + 1);//Adjust readings with sensitivity adjustment values.
*mag_Y = my * ((((asay - 128)*0.5)/(128)) + 1);
*mag_Z = mz * ((((asaz - 128)*0.5)/(128)) + 1);
}
每个轴的小数范围应在4096和-4096之间,并且有6个数据寄存器,每个寄存器包含每个轴的8位高和低值。我得到的数据似乎在> 10000到<-10000的范围内,具有我在9830看到的最高值。如果有人有任何想法,他们将不胜感激,谢谢:)
EDIT:Buffer是一个私有整数数组,用于保存轴寄存器中的字节。
private:
uint8_t buffer[14];
同样颠倒字节的顺序(因为我已经意识到应该在每个寄存器的第一个字节为低电平且第二个高电平时完成)导致输出范围减小到大约-170到170的范围...
mx = (((int16_t)buffer[1]) << 8) | buffer[0];
my = (((int16_t)buffer[3]) << 8) | buffer[2];
mz = (((int16_t)buffer[5]) << 8) | buffer[4];