恋芜 发表于 2015-6-17 18:49:34

【开源】模拟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;
}

sfq2008 发表于 2015-6-17 19:02:07

一楼顶了

dongwang_fl 发表于 2015-6-17 19:07:06

这个很不错的哦。

tanto 发表于 2015-6-18 11:53:29

九轴和角速度传感器有硬件,需要购买定制姿态结果的软件,只需要结果,不需要源码,请问谁有的{:call:}

Timingtime 发表于 2015-7-4 09:16:39

tanto 发表于 2015-6-18 11:53
九轴和角速度传感器有硬件,需要购买定制姿态结果的软件,只需要结果,不需要源码,请问谁有的 ...

这个软件圆点博士,匿名科创都有的。


另外请教怎么校准数据?

zrcx 发表于 2015-7-6 16:01:11

不错,留着以后用。

梦幻之旅 发表于 2015-7-6 17:10:58

顶上去,感谢分享

索达客 发表于 2015-7-7 18:41:08

谢谢楼主分享,收藏备用了!

傲翼伟縢 发表于 2015-7-11 12:18:33

本帖最后由 傲翼伟縢 于 2015-7-11 12:24 编辑

楼主,你好,你地磁怎么去零点的?还有读出的地磁原始数据乘以一个系数是取多少?数据手册上说地磁计是16位,测量范围   ±4800uT ,是不是用4800/32767

傲翼伟縢 发表于 2015-7-14 16:51:52

地磁出来的原始数据仿真貌似有问题啊?

沉默胜过白金 发表于 2015-7-28 08:35:00

用的SPI。

zrj 发表于 2015-8-19 17:58:05

刚看了您模拟IIC读9250的帖子,有个疑问,就是x轴的角速度,怎么那么大,4000多。用你的程序,验证了下,发现静止不动的时候,x轴的角速度都有4000多。请问这是怎么回事?

jay744 发表于 2015-9-6 20:58:25

可以用,谢谢分享{:smile:}{:smile:}{:smile:}

talkingbeast 发表于 2015-9-7 12:21:17

谢谢分享,收藏备用。

234355938 发表于 2015-10-30 11:38:39

{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}

Dragontan 发表于 2015-10-30 11:48:48

很多开源的飞控都是采用硬件IIC操作传感器的

taoamdz 发表于 2015-11-1 21:40:01

{:handshake:}

taoamdz 发表于 2015-11-14 08:54:05

楼主,我试了一下您写的驱动,读出了正确的设备ID,角速度(跳变大),加速计(跳变大),但磁力计无法读出来,

Dragontan 发表于 2015-11-14 09:07:22

感谢楼主分享啊

eleboss 发表于 2016-2-6 12:15:47

很不错啊,给我提供了很大的帮助

fy_bk 发表于 2016-3-17 16:41:37

我的9250里面磁力计的数据特别大,而且还跳的厉害,请问这是什么原因啦?两块板子都一样的

ianmay 发表于 2016-3-30 23:10:48

fy_bk 发表于 2016-3-17 16:41
我的9250里面磁力计的数据特别大,而且还跳的厉害,请问这是什么原因啦?两块板子都一样的 ...

可能是有外部磁场影响,正常16bit模式应该在正负300之间,14bit模式在正负70之间。

fy_bk 发表于 2016-4-5 14:48:02

ianmay 发表于 2016-3-30 23:10
可能是有外部磁场影响,正常16bit模式应该在正负300之间,14bit模式在正负70之间。 ...

嗯嗯,谢谢你,我找到问题了,我的地磁数据高低为弄反了

fy_bk 发表于 2016-4-6 15:31:51

现在调试AK8963时遇到了一些问题不明白:
1、测量模式无论是单次测量还是连续测量,每次采样后都需要重新配置模式,否则数据不会更新,参考手册上不是说只有单次采样才会自动进入powerdown吗?
2、AK8963输出的数据范围X:-11-434;Y:-13-487;Z:-490-43,数据输出的范围偏离好大,这样正常吗?

weiqifa 发表于 2016-4-21 18:30:47

#在这里快速回复#你好,我发现我读出来的值特别大,你的值怎么那么小呢?

ianmay 发表于 2016-4-22 02:47:18

fy_bk 发表于 2016-4-6 15:31
现在调试AK8963时遇到了一些问题不明白:
1、测量模式无论是单次测量还是连续测量,每次采样后都需要重新配 ...

问题1,在连续模式下,每次读完数据必须读一下st2寄存器地址(就是磁的数据地址后面紧跟着的一位),这样9250才会刷新新的数据。不然他会认为你没有读完,就会处于锁定状态。不去更新新的数据,防止你在一个读取期间,读到了2次测量的数据。

wdluo 发表于 2016-8-25 12:37:20

最近也在搞这个,基本上全部搞定了,角度计算,卡尔曼融合滤波等,还在测试,效果还可以

qmsolo2004 发表于 2016-11-21 15:17:39

最近也在搞这个,学习下!

451006071 发表于 2017-9-6 17:27:24

这资料确实不错,不好意思,时隔两年来挖资源。。

chenweigang 发表于 2019-4-29 13:32:34

资料不错,谢谢分享

zibouv 发表于 2019-5-16 15:50:02

谢谢分享,正用得着!

heyangfengyue 发表于 2019-5-16 21:24:49

感谢楼主无私分享!!!!

WITSOFT 发表于 2020-4-29 15:22:23

谢谢分享!
页: [1]
查看完整版本: 【开源】模拟IIC读取MPU9250九轴+温度数据