MPU9150的磁力计数据错误
读取MPU9150加速度计和陀螺仪数据没问题,读取磁力计数据时,mx一直为负,my和mz一直等于-1,试过各种方法,self-test结果也是如此,顶多mx变化一下,my和mz万年不变,加过灵敏度调整,也没用。之前用过HMC的磁力计,也是容易焊坏,我想说的是磁力计都是大爷啊,就这么容易焊坏?我风枪温度才250度,不高啊 可能买的质量不好 好吧,楼主表示已经搞好了,说下经验给还没搞好的少年吧
1.这个mpu9150的磁力计没我想象中的那么脆弱,300摄氏度,用风枪没焊好,找高人改用烙铁焊好了。。。。(这不科学啊)
2.采用官方库,读取mpu9150磁力计代码如下:
mpu_set_bypass(1); //开启bypass
mpu_get_compass_reg(mag, ×tamp);
init_mx =(float)mag;
init_my =(float)mag;
init_mz =(float)mag;
mpu_set_bypass(0); //关闭bypass
注意要先开启bypass,然后读完要关闭bypass,如果不关bypass那么磁力计出来的数据是不会变的,这一点可难为死我了。。
如果不开bypass,mx my mz都是0 本帖最后由 zksniper 于 2013-8-9 14:48 编辑
还有,这个mpu9150的DMP的一个蛋疼的bug:
代码如下:
dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors, &more);
if(sensors & INV_XYZ_GYRO)
{
init_gx=(float)(gyro / (Gyro_500_Scale_Factor * 57.3)); //单位转化成:弧度/s
init_gy=(float)(gyro / (Gyro_500_Scale_Factor * 57.3));
init_gz=(float)(gyro / (Gyro_500_Scale_Factor * 57.3));
}
if(sensors & INV_XYZ_ACCEL)
{
init_ax=(float)accel;
init_ay=(float)accel;
init_az=(float)accel;
}
各位有没有发现,再第一次执行这个代码时,sensors & INV_XYZ_GYRO和sensors & INV_XYZ_ACCEL是等于0的,以至于读取不出陀螺仪和加速度计的数值,
还有更扯淡的第二部分,这个语句是放在while(1)循环里的,经过楼主实测,每过一段不定期的时间,sensors & INV_XYZ_GYRO和sensors & INV_XYZ_ACCEL都会咪涨的等于0一次。。。。。。。。。
不过这个问题的第二部分楼主已经解决了,我也不知道怎么解决的,只不过是把读取磁力计的代码放到了if(sensors & INV_XYZ_ACCEL)下而已。。 还有seanwood大师的此贴:http://www.amobbs.com/thread-5492189-1-1.html,我各个楼层反复看了不下10遍了,用了里面的融合accel gyro和compass的那个算法,四元数也初始化了,最后循环调用AHRSupdate来读取q0123并转成pitch roll yaw,发现这三个角没一个是对的,现象就是要么时间长了这三个角一动不动定在一个数值上小波动一下,要么就是乱动。
有2个问题,求各位解惑:
1.我想了好长时间,是不是因为我把accel gyro和compass的坐标轴没定对?accel和gyro的xyz轴我没变,用的是mpu9150默认的那个方向,compass的xyz我转成了和accel gyro一样的方向,因为mpu9150 compass的轴和accel gyro的轴向不一致。
2.accel、gyro和compass的轴向分别如何定,才能符合AHRSupdate这个算法呢?是z指天、x指东、y指北这个方式?还是z指地、x指北、y指东?这俩都满足右手定律,但是好像都不行,试了好多方式,不得要领。 {:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:} 新手 学习一下, 有用arduino 调试Mpu9150的?,为何磁力计输出为零 ,gyro accel 都正常?
感谢楼主所发现的问题和解答,给了我莫大的帮助,谢谢。 楼主您好,您这个是软件模拟i2c读取,还是硬件i2c读取,我软件i2c读取磁力计数据是没有问题的;
但是硬件读取i2c是有问题,不知道需要注意什么;
经过我的查看这个地方的地址不一样
/* Find compass. Possible addresses range from 0x0C to 0x0F. */
for (akm_addr = 0x0C; akm_addr <= 0x0F; akm_addr++) {
int result;
result = i2c_read(akm_addr, AKM_REG_WHOAMI, 1, data);
if (!result && (data == AKM_WHOAMI))
break;
}
if (akm_addr > 0x0F) {
/* TODO: Handle this case in all compass-related functions. */
log_e("Compass not found.\n");
return -1;
}
st.chip_cfg.compass_addr = akm_addr;
程序执行到return -1了,左移没有读取到,请指导一下,谢谢! 问题已经解决,噢耶! 我用的是MPU9150,我如果只用ACC和GRYO的数据姿态解出来是对的,只是会慢慢的飘,但是我将磁力计MAG的数据如果一起融合进去,YAW这个方向角就不对了,不知道是什么原因,请教 Zhang_Peike 发表于 2014-5-16 08:30
新手 学习一下, 有用arduino 调试Mpu9150的?,为何磁力计输出为零 ,gyro accel 都正常?
...
请问下你怎么解决磁力计读数全0的问题啊。。我也是及速度和陀螺仪都是对的 bypass也开启了,每次读数后都重置为singlemeassure了。。。但是读数全是0
页:
[1]