打印

[小应用]GD32F103+MPU9150 四轴飞行器第一步:9DOF姿态融合

[复制链接]
楼主: zkcaptain
手机看帖
扫描二维码
随时随地手机跟帖
261
楼主在吗?能帮我解答一下吗?

使用特权

评论回复
262
jayelva2003| | 2014-6-10 15:35 | 只看该作者
楼主,我之前I2C用的是stm32的硬件I2C来做的,后来我参照你的软件模拟的I2C来做了以后自检函数是可以通过了,但是dmp_read_fifo读不出数据,然后走单步调试发现读FIFO时候FIFO已经溢出了,请问这是什么原因?
还有,我现在没使用磁力计,因为磁力计在初始化的时候找不到,磁力计的地址好像不对,请问下这又是什么原因?

使用特权

评论回复
263
bpp15802963098| | 2014-6-11 08:20 | 只看该作者
jayelva2003 发表于 2014-6-10 15:35
楼主,我之前I2C用的是stm32的硬件I2C来做的,后来我参照你的软件模拟的I2C来做了以后自检函数是可以通过了 ...

我刚开始磁力计在初始化的时候找不到,可能是IIC时序的问题,你试试调一下时序

使用特权

评论回复
264
jayelva2003| | 2014-6-11 09:41 | 只看该作者
bpp15802963098 发表于 2014-6-11 08:20
我刚开始磁力计在初始化的时候找不到,可能是IIC时序的问题,你试试调一下时序 ...

是调I2C_delay这个函数的延时时间吗?

使用特权

评论回复
265
bpp15802963098| | 2014-6-11 09:56 | 只看该作者
jayelva2003 发表于 2014-6-11 09:41
是调I2C_delay这个函数的延时时间吗?

恩,我是调的那个

使用特权

评论回复
266
jayelva2003| | 2014-6-11 10:13 | 只看该作者
bpp15802963098 发表于 2014-6-11 09:56
恩,我是调的那个

我现在里面的循环变量i设的是7,你设的是多少?

使用特权

评论回复
267
bpp15802963098| | 2014-6-11 10:46 | 只看该作者
jayelva2003 发表于 2014-6-11 10:13
我现在里面的循环变量i设的是7,你设的是多少?

我用的是f4,我设的24

使用特权

评论回复
268
jayelva2003| | 2014-6-11 11:26 | 只看该作者
bpp15802963098 发表于 2014-6-11 10:46
我用的是f4,我设的24

你主频用的是72M吗?

使用特权

评论回复
269
bpp15802963098| | 2014-6-11 17:21 | 只看该作者
本帖最后由 bpp15802963098 于 2014-6-11 17:24 编辑

急需楼主帮忙,楼主我现在遇到一个问题读出来AKM_REG_ST1这个寄存器的tmp[0]=0,导致后面的直接返回,所以磁力计的数据一直有错

tmp0=0.png (30.39 KB )

tmp0=0.png

使用特权

评论回复
270
zkcaptain|  楼主 | 2014-6-11 18:10 | 只看该作者
bpp15802963098 发表于 2014-6-11 17:21
急需楼主帮忙,楼主我现在遇到一个问题读出来AKM_REG_ST1这个寄存器的tmp[0]=0,导致后面的直接返回,所以磁 ...

      tmp[6]=0x00;
      data_write[6]=0x01;
      i2cread(Compass_Addr, Compass_ST1, 1, tmp+6);
      if(tmp[6] == 1)
      {
        i2cread(Compass_Addr, Compass_HXL, 6, tmp);//读取compass
            mag[0] = (((signed short int)tmp[1]) << 8) | tmp[0];
        mag[1] = (((signed short int)tmp[3]) << 8) | tmp[2];
        mag[2] = (((signed short int)tmp[5]) << 8) | tmp[4];

            mag[0] = ((long)mag[0] * mag_sens_adj_val[0]) >> 8;  //灵敏度调整
        mag[1] = ((long)mag[1] * mag_sens_adj_val[1]) >> 8;
        mag[2] = ((long)mag[2] * mag_sens_adj_val[2]) >> 8;
                //修正mag
            init_mx =(float)mag[1] * MXgain + MXoffset;                //转换坐标轴                               
        init_my =(float)mag[0] * MYgain + MYoffset;
        init_mz =(float)-mag[2] * MZgain + MZoffset;
            i2cwrite(Compass_Addr, Compass_CNTL, 1, data_write+6);         //开启compass:single measurement mode



参考一下吧

使用特权

评论回复
271
bpp15802963098| | 2014-6-11 20:43 | 只看该作者
本帖最后由 bpp15802963098 于 2014-6-11 23:26 编辑
zkcaptain 发表于 2014-6-11 18:10
tmp[6]=0x00;
      data_write[6]=0x01;
      i2cread(Compass_Addr, Compass_ST1, 1, tmp+6);

谢谢楼主,你说我的那个问题你说可能是什么问题,我觉得不是IIC的问题,因为它读其它数据是正确的,但是我又不找不出是哪儿的问题,i2c_read(st.chip_cfg.compass_addr, AKM_REG_ST1, 1, tmp);他读出来的是0,这个原因是是不是数据没准备好,如果是的话,这要如何解决?

使用特权

评论回复
272
zkcaptain|  楼主 | 2014-6-12 09:14 | 只看该作者
本帖最后由 zkcaptain 于 2014-6-12 09:22 编辑
bpp15802963098 发表于 2014-6-11 20:43
谢谢楼主,你说我的那个问题你说可能是什么问题,我觉得不是IIC的问题,因为它读其它数据是正确的,但是我 ...

9150的磁力计是单独的一个芯片,它的读取跟另外两个不一样,需要注意时序和读取流程,不管哪个没弄好都度不对,也不排除芯片本身有问题,更可能的是你焊接问题

使用特权

评论回复
273
zkcaptain|  楼主 | 2014-6-12 09:20 | 只看该作者
本帖最后由 zkcaptain 于 2014-6-12 09:23 编辑
jayelva2003 发表于 2014-6-10 15:35
楼主,我之前I2C用的是stm32的硬件I2C来做的,后来我参照你的软件模拟的I2C来做了以后自检函数是可以通过了 ...

单步调DMP有时候是有问题,感觉起来好像是单步调会错过DMP内部的一些东西,最好设断点调,中间不要停顿,直接执行到断点
DMP这部分除非你代码有问题,不然不会读不出数据。
磁力计地址是0x0C,注意I2C读写函数里要有addr<<1,具体看楼上

使用特权

评论回复
274
jayelva2003| | 2014-6-12 09:45 | 只看该作者
zkcaptain 发表于 2014-6-12 09:20
单步调DMP有时候是有问题,感觉起来好像是单步调会错过DMP内部的一些东西,最好设断点调,中间不要停顿, ...

刚试了下可以了,我的I2C读写是直接输出地址的,所以磁力计一直不对,那其实磁力计的地址不是0x0C,而是移位过后的0x18吧。
还有一个问题,我想问下你的算法对pitch旋转到90度,其他轴的角度开始乱跳的现象有消除吗?就是万向节锁的状况

使用特权

评论回复
275
bpp15802963098| | 2014-6-12 10:17 | 只看该作者
zkcaptain 发表于 2014-6-12 09:14
9150的磁力计是单独的一个芯片,它的读取跟另外两个不一样,需要注意时序和读取流程,不管哪个没弄好都度 ...

我是直接买的模块,焊接估计没问题

使用特权

评论回复
276
bpp15802963098| | 2014-6-12 20:54 | 只看该作者
zkcaptain 发表于 2014-6-12 09:14
9150的磁力计是单独的一个芯片,它的读取跟另外两个不一样,需要注意时序和读取流程,不管哪个没弄好都度 ...

楼主,可不可以说一说磁力计的读取流程,谢谢了

使用特权

评论回复
277
zkcaptain|  楼主 | 2014-6-13 08:51 | 只看该作者
bpp15802963098 发表于 2014-6-12 20:54
楼主,可不可以说一说磁力计的读取流程,谢谢了

代码都给你了,还怎么说流程?

使用特权

评论回复
278
bpp15802963098| | 2014-6-13 09:02 | 只看该作者
zkcaptain 发表于 2014-6-13 08:51
代码都给你了,还怎么说流程?

楼主,我现在是AKM_REG_ST1这个寄存器的读出来的值一直是0,磁力计的数据也一直是一个数,这是不是哪儿的操作的读写或设置有问题(我的代码是把你给的那个代码移植到STM32f4单片机中的),现在不知道是哪儿的问题

使用特权

评论回复
279
bpp15802963098| | 2014-6-13 09:07 | 只看该作者
zkcaptain 发表于 2014-6-13 08:51
代码都给你了,还怎么说流程?

楼主,我现在是AKM_REG_ST1这个寄存器读出来的数据一直是0,正确的话应该是1,磁力计的数据一直是一个数,但我读AKM_REG_WHOAMI这个寄存器是对的,可不可以说明我的IIC是正确的,还有就是磁力计的数据一直是一个数据

使用特权

评论回复
280
zkcaptain|  楼主 | 2014-6-13 10:09 | 只看该作者
bpp15802963098 发表于 2014-6-13 09:02
楼主,我现在是AKM_REG_ST1这个寄存器的读出来的值一直是0,磁力计的数据也一直是一个数,这是不是哪儿的 ...

把你compass部分的代码贴出来吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则