【开源】模拟IIC读取MPU9250九轴+温度数据
本帖最后由 恋芜 于 2015-6-17 20:00 编辑主控是stm32f103c8t6,采用正点原子开发板提供的模拟IIC程序,uart1输出数据,希望能给正在调试mpu9250的同学提供一个参考
void IIC_MPU9250_init(void)
{
IIC_Write_OneByte(MPU9250_I2C_ADDR,MPU9250_PWR_MGMT_1,0x00); //唤醒mpu9250
IIC_Write_OneByte(MPU9250_I2C_ADDR,MPU9250_CONFIG,0x06); //低通滤波5hz
IIC_Write_OneByte(MPU9250_I2C_ADDR,MPU9250_GYRO_CONFIG,0x18); //不自检,2000deg/s
IIC_Write_OneByte(MPU9250_I2C_ADDR,MPU9250_ACCEL_CONFIG,0x00); //(0x00 +-2g;)( 0x08 +-4g;)(0x10 +-8g;)(0x18 +-16g)
IIC_Write_OneByte(MPU9250_I2C_ADDR,MPU9250_INT_PIN_CFG,0x02);
IIC_Write_OneByte(MPU9250_I2C_ADDR,MPU9250_USER_CTRL,0x00); //使能I2C
IIC_Write_OneByte(AK8963_I2C_ADDR,AK8963_CNTL1,0x10);
delay_ms(50);
IIC_Write_OneByte(AK8963_I2C_ADDR,AK8963_CNTL1,0x11); //单测量模式,16位精度
}
void GetMPU9250Data(void)
{
s16 buf;
u8 i;
/*------------------------------------------------------------------------------------------------------------------------------------*/
//读取加速度、陀螺仪
IIC_Start();
IIC_Send_Byte(MPU9250_I2C_ADDR); //发送地址设备
IIC_Wait_Ack();
IIC_Send_Byte(MPU9250_ACCEL_XOUT_H);//发送寄存器地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(MPU9250_I2C_ADDR+1);//发送设备地址+读信号
IIC_Wait_Ack();
for(i=0;i<14;i++)
{
if(i==13)buf=IIC_Read_Byte(0);//读一个字节+不继续再读,发送NACK
else buf=IIC_Read_Byte(1); //读一个字节+继续读,发送ACK
}
IIC_Stop();
/*-----------------------------------------------------------------------------------------------------------------------------------*/
//读取地磁传感器
IIC_Start();
IIC_Send_Byte(AK8963_I2C_ADDR);//发送地址设备
IIC_Wait_Ack();
IIC_Send_Byte(AK8963_HXL); //发送寄存器地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(AK8963_I2C_ADDR+1);//发送地址设备+读
IIC_Wait_Ack();
for(i=14;i<20;i++)
{
if(i==19)buf=IIC_Read_Byte(0);//读一个字节+不继续再读,发送NACK
else buf=IIC_Read_Byte(1); //读一个字节+继续读,发送ACK
}
IIC_Stop();
IIC_Write_OneByte(AK8963_I2C_ADDR,AK8963_CNTL1,0x11);//每读一次,ak8963自动进入powerdown模式,这里需要重新设定单测量模式
/*-------------------------------------------------------------------------------------------------------------------------------------*/
//加速度
mpu9250.acc_x=(buf<<8)+buf;
mpu9250.acc_y=(buf<<8)+buf;
mpu9250.acc_z=(buf<<8)+buf;
//温度
mpu9250.temp =(buf<<8)+buf;
//陀螺仪
mpu9250.gyro_x=(buf<<8)+buf;
mpu9250.gyro_y=(buf<<8)+buf;
mpu9250.gyro_z=(buf<<8)+buf;
//地磁
mpu9250.mag_x=(buf<<8)+buf;
mpu9250.mag_y=(buf<<8)+buf;
mpu9250.mag_z=(buf<<8)+buf;
}
一楼顶了 这个很不错的哦。 九轴和角速度传感器有硬件,需要购买定制姿态结果的软件,只需要结果,不需要源码,请问谁有的{:call:} tanto 发表于 2015-6-18 11:53
九轴和角速度传感器有硬件,需要购买定制姿态结果的软件,只需要结果,不需要源码,请问谁有的 ...
这个软件圆点博士,匿名科创都有的。
另外请教怎么校准数据? 不错,留着以后用。 顶上去,感谢分享 谢谢楼主分享,收藏备用了! 本帖最后由 傲翼伟縢 于 2015-7-11 12:24 编辑
楼主,你好,你地磁怎么去零点的?还有读出的地磁原始数据乘以一个系数是取多少?数据手册上说地磁计是16位,测量范围 ±4800uT ,是不是用4800/32767 地磁出来的原始数据仿真貌似有问题啊?
用的SPI。 刚看了您模拟IIC读9250的帖子,有个疑问,就是x轴的角速度,怎么那么大,4000多。用你的程序,验证了下,发现静止不动的时候,x轴的角速度都有4000多。请问这是怎么回事? 可以用,谢谢分享{:smile:}{:smile:}{:smile:} 谢谢分享,收藏备用。 {:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:} 很多开源的飞控都是采用硬件IIC操作传感器的 {:handshake:} 楼主,我试了一下您写的驱动,读出了正确的设备ID,角速度(跳变大),加速计(跳变大),但磁力计无法读出来, 感谢楼主分享啊 很不错啊,给我提供了很大的帮助 我的9250里面磁力计的数据特别大,而且还跳的厉害,请问这是什么原因啦?两块板子都一样的 fy_bk 发表于 2016-3-17 16:41
我的9250里面磁力计的数据特别大,而且还跳的厉害,请问这是什么原因啦?两块板子都一样的 ...
可能是有外部磁场影响,正常16bit模式应该在正负300之间,14bit模式在正负70之间。 ianmay 发表于 2016-3-30 23:10
可能是有外部磁场影响,正常16bit模式应该在正负300之间,14bit模式在正负70之间。 ...
嗯嗯,谢谢你,我找到问题了,我的地磁数据高低为弄反了 现在调试AK8963时遇到了一些问题不明白:
1、测量模式无论是单次测量还是连续测量,每次采样后都需要重新配置模式,否则数据不会更新,参考手册上不是说只有单次采样才会自动进入powerdown吗?
2、AK8963输出的数据范围X:-11-434;Y:-13-487;Z:-490-43,数据输出的范围偏离好大,这样正常吗?
#在这里快速回复#你好,我发现我读出来的值特别大,你的值怎么那么小呢? fy_bk 发表于 2016-4-6 15:31
现在调试AK8963时遇到了一些问题不明白:
1、测量模式无论是单次测量还是连续测量,每次采样后都需要重新配 ...
问题1,在连续模式下,每次读完数据必须读一下st2寄存器地址(就是磁的数据地址后面紧跟着的一位),这样9250才会刷新新的数据。不然他会认为你没有读完,就会处于锁定状态。不去更新新的数据,防止你在一个读取期间,读到了2次测量的数据。 最近也在搞这个,基本上全部搞定了,角度计算,卡尔曼融合滤波等,还在测试,效果还可以 最近也在搞这个,学习下! 这资料确实不错,不好意思,时隔两年来挖资源。。 资料不错,谢谢分享 谢谢分享,正用得着! 感谢楼主无私分享!!!! 谢谢分享!
页:
[1]