【求助】MPU9150读磁力计数据问题
本帖最后由 zhongjiequan 于 2015-6-8 00:19 编辑我对mpu9150开了I2C pass-by模式,能读出AK8976的ID,但写测量命令后,还是无法读出磁力计数据
写自检命令,却能读到磁力的自检。。。
以下我mpu9150的代码
mpu6050_reset(mpu9150_device.i2c_bus);
mpu9150_delay_ms(100);
mpu6050_set_sleep_enabled(mpu9150_device.i2c_bus,RT_FALSE);// Activate MPU6050
mpu6050_set_temp_sensor_enabled(mpu9150_device.i2c_bus,RT_TRUE);// Enable temp sensor
mpu6050_set_int_enabled(mpu9150_device.i2c_bus,RT_FALSE);// Disable interrupts
mpu6050_set_rate(mpu9150_device.i2c_bus,1);
mpu6050_set_DLFP_mode(mpu9150_device.i2c_bus,MPU6050_DLPF_BW_188);// Set digital low-pass bandwidth
mpu6050_set_clock_source(mpu9150_device.i2c_bus,MPU6050_CLOCK_PLL_XGYRO);// Set x-axis gyro as clock source
mpu6050_set_full_scale_gyro_range(mpu9150_device.i2c_bus,MPU6050_GYRO_FS_2000);// Set gyro full scale range
mpu6050_set_full_scale_accel_range(mpu9150_device.i2c_bus,MPU6050_ACCEL_FS_16);// Set accelerometer full scale range
mpu6050_set_I2C_bypass_enabled(mpu9150_device.i2c_bus,RT_TRUE);
rt_kprintf("ak8975_get_device_ID = 0x%2x\n",ak8975_get_device_ID(mpu9150_device.i2c_bus));
ak8975_set_operation_mode(mpu9150_device.i2c_bus,AK8975_CNTL_MODE_SINGLE);
rt_int16_t gx,gy,gz,ax,ay,az,mx,my,mz;
rt_uint8_t flag;
while(1)
{
flag = ak8975_get_data_ready(mpu9150_device.i2c_bus);
rt_kprintf("ak8975_get_data_ready = 0x%2x\n",flag);
mpu6050_set_I2C_bypass_enabled(mpu9150_device.i2c_bus,RT_FALSE);
if(flag == 0x01)
{
ak8975_get_magnetometer(mpu9150_device.i2c_bus,&mx,&my,&mz);
rt_kprintf("mx=%d,my=%d,mz=%d\n",mx,my,mz);
ak8975_set_operation_mode(mpu9150_device.i2c_bus,AK8975_CNTL_MODE_SINGLE);
}
rt_thread_delay(100);
} 自己顶一下,就没人懂??? http://bbs.21ic.com/icview-605405-1-1.html你可以看看这贴怎样 楼主你好,这几天我也在弄mpu915的磁力计部分,差不多也遇到跟你相似的问题。我9150里关于6050的数据是能读出来的,但是按照网上说的去读取磁力计,就只有2个值,要么是0要么是-256.这是我的代码,希望能有大神来给我们这种菜鸟指点一二,在这里万分感谢void MPU6050_Init()
{
IIC_Init();
//device init
IIC_Write_Data(MPU6050_Addr,PWR_MGMT_1,0x00);
IIC_DelayMs(20);
IIC_Write_Data(MPU6050_Addr,PWR_MGMT_1,0x03);
IIC_Write_Data(MPU6050_Addr,CONFIG_MPU6050,0x02);
IIC_Write_Data(MPU6050_Addr,SMPLRT_DIV,0x00);
IIC_Write_Data(MPU6050_Addr,GYRO_CONFIG,0x18);
IIC_Write_Data(MPU6050_Addr,ACCEL_CONFIG,0x08);
//IIC_Write_Data(MPU6050_Addr,PWR_MGMT_1,0x00);
//IIC_Write_Data(MPU6050_Addr,SMPLRT_DIV,0x07);
//IIC_Write_Data(MPU6050_Addr,CONFIG, 0x06);
IIC_Write_Data(MPU6050_Addr,INT_PIN_CFG,0x02);
IIC_Write_Data(MPU6050_Addr,USER_CTRL,0x00);
IIC_Write_Data(MAGADD,CNTL, 0x00);
IIC_DelayMs(2);
IIC_Write_Data(MAGADD,CNTL, 0x01);
//IIC_Read_Data_N(MAGADD,0X10,3,mag_sens_adj);
}
uint16_t MPU6050_Read(unsigned char REG_Address)
{
uint8_t H,L;
uint16_t temp;
H=IIC_Read_Data(MPU6050_Addr,REG_Address);
L=IIC_Read_Data(MPU6050_Addr,REG_Address+1);
temp= (H<<8)|L ;
return temp;
}
uint16_t COMPASS_Read(unsigned char REG_Address)
{
uint8_t H,L;
uint16_t temp;
H=IIC_Read_Data(MAGADD,REG_Address);
IIC_Write_Data(MAGADD,CNTL, 0x01);
L=IIC_Read_Data(MAGADD,REG_Address-1);
IIC_Write_Data(MAGADD,CNTL, 0x01);
temp= (H<<8)|L ;
return temp;
}
void MPU6050_CONVENT()
{
ACC.X=MPU6050_Read(ACCEL_XOUT_H)-ACC_OFFSET.X;
ACC.Y=MPU6050_Read(ACCEL_YOUT_H)-ACC_OFFSET.Y;
ACC.Z=MPU6050_Read(ACCEL_ZOUT_H)-ACC_OFFSET.Z;
GYR_RATE.X=MPU6050_Read(GYRO_XOUT_H);
GYR_RATE.Y= MPU6050_Read(GYRO_YOUT_H);
GYR_RATE.Z=MPU6050_Read(GYRO_ZOUT_H);
COMPASS.X=COMPASS_Read(HXH);
COMPASS.Y=COMPASS_Read(HYH);
COMPASS.Z=COMPASS_Read(HZH);
//COMPASS.X=((long)COMPASS.X * mag_sens_adj) >> 8;
//COMPASS.Y=((long)COMPASS.X * mag_sens_adj) >> 8;
//COMPASS.Z=((long)COMPASS.X * mag_sens_adj) >> 8;
GYR.X= GYR_RATE.X-GYR_OFFSET.X;
GYR.Y= GYR_RATE.Y-GYR_OFFSET.Y;
GYR.Z= GYR_RATE.Z-GYR_OFFSET.Z;
} #define SMPLRT_DIV 0x19 //ÍÓÂÝÒDzÉÑùÂÊ£¬µäÐÍÖµ£º0x07(125Hz)
#define CONFIG_MPU6050 0x1A //µÍͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x06(5Hz)
#define GYRO_CONFIG 0x1B //ÍÓÂÝÒÇ×Լ켰²âÁ¿·¶Î§£¬µäÐÍÖµ£º0x18(²»×Լ죬2000deg/s)
#define ACCEL_CONFIG 0x1C //¼ÓËÙ¼Æ×Լ졢²âÁ¿·¶Î§¼°¸ßͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x01(²»×Լ죬2G£¬5Hz)
#define ACCEL_XOUT_H 0x3B
#define ACCEL_XOUT_L 0x3C
#define ACCEL_YOUT_H 0x3D
#define ACCEL_YOUT_L 0x3E
#define ACCEL_ZOUT_H 0x3F
#define ACCEL_ZOUT_L 0x40
#define TEMP_OUT_H 0x41
#define TEMP_OUT_L 0x42
#define GYRO_XOUT_H 0x43
#define GYRO_XOUT_L 0x44
#define GYRO_YOUT_H 0x45
#define GYRO_YOUT_L 0x46
#define GYRO_ZOUT_H 0x47
#define GYRO_ZOUT_L 0x48
#define PWR_MGMT_1 0x6B //µçÔ´¹ÜÀí£¬µäÐÍÖµ£º0x00(Õý³£ÆôÓÃ)
#define WHO_AM_I 0x75 //IICµØÖ·¼Ä´æÆ÷(ĬÈÏÊýÖµ0x68£¬Ö»¶Á)
//#define SMPLRT_DIV 0x19 //??????,???:0x07(125Hz)
#define CONFIG 0x1A //??????,???:0x06(5Hz)
#define HXL 0X03
#define HXH 0X04
#define HYL 0X05
#define HYH 0X06
#define HZL 0X07
#define HZH 0X08
#define CNTL 0X0A
#define INT_PIN_CFG 0X37
#define USER_CTRL 0X6A
#define MPU9150SLAADD 0XD0
#define MAGADD 0X18
//#define PWR_MGMT_1 0x6B //????,???:0x00(????)
#define WHO_AM_I 0x75 //IIC?????(????0x68,??)
//****************************
#define MPU6050_Addr 0xD0 //¶¨ÒåÆ÷¼þÔÚIIC×ÜÏßÖеĴӵØÖ·,¸ù¾ÝALTADDRESSµØÖ·Òý½Å²»Í¬ÐÞ¸Ä TheBest 发表于 2015-6-15 13:59
啥意思?
Timingtime 发表于 2015-6-13 12:07
http://bbs.21ic.com/icview-605405-1-1.html你可以看看这贴怎样
看过,不能解决我的问题 zhongjiequan 发表于 2015-6-15 16:03
看过,不能解决我的问题
看过,没啥用,找了几个程序安照他们的配置,compass.x输出的值要么是0要么是-256,没啥用。严重怀疑我芯片是不是出问题了,或者接线不对(只接了SCL SDAVCC GND)。真心感觉没啥问题 IIC_Write_Data(MPU6050_Addr,PWR_MGMT_1,0x01);
IIC_Write_Data(MPU6050_Addr,CONFIG_MPU6050,0x03);
IIC_Write_Data(MPU6050_Addr,GYRO_CONFIG,0x18);
IIC_Write_Data(MPU6050_Addr,ACCEL_CONFIG,0x08);
IIC_Write_Data(MPU6050_Addr,INT_PIN_CFG,0x32);
IIC_Write_Data(MPU6050_Addr,USER_CTRL,0x00);
IIC_DelayMs(10);
IIC_Write_Data(MAGADD,CNTL, 0x01);
IIC_DelayMs(10); 每读一次地磁三个轴数据,都得写一次CNTL为0x01,不知楼主写了没? 还有,地磁传感器的数据读取周期不能小于7ms。亲测8毫秒是可以的 恋芜 发表于 2015-6-15 20:32
每读一次地磁三个轴数据,都得写一次CNTL为0x01,不知楼主写了没?
有写,也等了10ms。可是。。。哎 我发了一个开源帖子,看能解决你的问题不【开源】模拟IIC读取MPU9250九轴+温度数据 CC2541软件模拟i2c读取没问题,但是硬件i2c读取加速计和陀螺仪没有问题,磁力计数据有问题,
要么不对要么读不出来! 问题已经解决,噢耶! maskblue 发表于 2015-8-6 15:30
问题已经解决,噢耶!
敢问是怎么解决的 解决了不分享下<(-︿-)>
页:
[1]