[四轴技术交流] mpu6050

[复制链接]
4445|29
 楼主| 虾米一代 发表于 2015-2-9 12:00 | 显示全部楼层 |阅读模式
各位读取mpu6050有没碰到这样的问题:可以读取数据但是不停的震荡

得到的欧拉角

得到的欧拉角
icecut 发表于 2015-2-10 16:53 | 显示全部楼层
干扰?还是正常震荡?

评分

参与人数 1威望 +1 收起 理由
虾米一代 + 1 赞一个!

查看全部评分

coody 发表于 2015-2-10 23:42 | 显示全部楼层
强大的MPU6050怎么可能有震荡?几十元的商售小四轴,飞得稳稳的。。。。
 楼主| 虾米一代 发表于 2015-2-11 15:42 | 显示全部楼层
coody 发表于 2015-2-10 23:42
强大的MPU6050怎么可能有震荡?几十元的商售小四轴,飞得稳稳的。。。。

不是模块问题啊,是我程序的问题。是这样的,有现成的stm32程序,然后完全仿照stm32程序,我又编写了个dsp程序,但是dsp死活不行,得到的波形就是这样,但是stm32可以的。总共就2个函数,一个初始化,一个读acc和gyr的函数:初始化,我是配置好了后重新读取出来发送到串口看,是正确的;读acc和gyr的函数是一个读连续地址寄存器的IIC函数,我又重新写了一段连续地址的寄存器,同样用那个读连续地址寄存器的IIC函数读取,也是对的。。同样的配置方法和IIC函数,用stm32完全木有问题。。然后我就不知道怎么搞了。。我是想学习dsp,所以死活想用dsp实现功能。求大神指导
 楼主| 虾米一代 发表于 2015-2-11 15:44 | 显示全部楼层
icecut 发表于 2015-2-10 16:53
干扰?还是正常震荡?

是不正常的震荡。。是我程序的问题。是这样的,有现成的stm32程序,然后完全仿照stm32程序,我又编写了个dsp程序,但是dsp死活不行,得到的波形就是这样,但是stm32可以的。总共就2个函数,一个初始化,一个读acc和gyr的函数:初始化,我是配置好了后重新读取出来发送到串口看,是正确的;读acc和gyr的函数是一个读连续地址寄存器的IIC函数,我又重新写了一段连续地址的寄存器,同样用那个读连续地址寄存器的IIC函数读取,也是对的。。同样的配置方法和IIC函数,用stm32完全木有问题。。然后我就不知道怎么搞了。。我是想学习dsp,所以死活想用dsp实现功能。
 楼主| 虾米一代 发表于 2015-2-11 16:02 | 显示全部楼层
这是部分程序和波形图像
iic读取.png
mpu6050初始化.png
read.png
stm32 dsp.jpg
icecut 发表于 2015-2-11 18:05 | 显示全部楼层
用示波器看波形.是不是太快了
 楼主| 虾米一代 发表于 2015-2-12 10:10 | 显示全部楼层
icecut 发表于 2015-2-11 18:05
用示波器看波形.是不是太快了

没懂你意思。我是用上位机看我上传的mpu6050数据啊
icecut 发表于 2015-2-12 13:36 | 显示全部楼层
虾米一代 发表于 2015-2-12 10:10
没懂你意思。我是用上位机看我上传的mpu6050数据啊

硬件如果真的这么简单.早就解决了
 楼主| 虾米一代 发表于 2015-2-13 11:16 | 显示全部楼层
icecut 发表于 2015-2-12 13:36
硬件如果真的这么简单.早就解决了

问题已解决。是传输函数的问题。只是不明白,这个传输函数在stm32上用的好好的,在TMS320F28335上咋就不行。高8位和低8位的截取。
#define BYTE0(dwTemp)       (*(char *)(&dwTemp))
#define BYTE1(dwTemp)       (*((char *)(&dwTemp) + 1))
#define BYTE2(dwTemp)       (*((char *)(&dwTemp) + 2))
#define BYTE3(dwTemp)       (*((char *)(&dwTemp) + 3))

void Data_Send_Status(void)
{
        unsigned char _cnt=0;
        int _temp;
        unsigned char sum = 0;
        unsigned char i=0;
        data_to_send[_cnt++]=0xAA;
        data_to_send[_cnt++]=0xAA;
        data_to_send[_cnt++]=0x01;
        data_to_send[_cnt++]=0;
       
        _temp = (int)(Rool*100);
        data_to_send[_cnt++]=BYTE1(_temp);
        data_to_send[_cnt++]=BYTE0(_temp);
        _temp = (int)(Pitch*100);
        data_to_send[_cnt++]=BYTE1(_temp);
        data_to_send[_cnt++]=BYTE0(_temp);
        _temp = (int)(Yaw*100);
        data_to_send[_cnt++]=BYTE1(_temp);
        data_to_send[_cnt++]=BYTE0(_temp);
…………
最后用了简单的方式:
dwTemp & 0xFF
(dwTemp >> 8) & 0xFF
c语言没学好,第一种匿名四轴的方式没看懂
icecut 发表于 2015-2-13 12:27 | 显示全部楼层
你是不是遇到大小端问题了啊

评分

参与人数 1威望 +1 收起 理由
虾米一代 + 1 赞一个!

查看全部评分

 楼主| 虾米一代 发表于 2015-2-13 15:20 | 显示全部楼层
icecut 发表于 2015-2-13 12:27
你是不是遇到大小端问题了啊

太专业了。。木有懂。。之前也有人这么说,不懂大小端是什么问题啊
keer_zu 发表于 2015-2-13 16:30 | 显示全部楼层
虾米一代 发表于 2015-2-13 15:20
太专业了。。木有懂。。之前也有人这么说,不懂大小端是什么问题啊

别那么懒,google一下啊

评分

参与人数 1威望 +3 收起 理由
虾米一代 + 3 很给力!

查看全部评分

 楼主| 虾米一代 发表于 2015-2-15 12:14 | 显示全部楼层
keer_zu 发表于 2015-2-13 16:30
别那么懒,google一下啊

教训的是!
TMS320C28x中的字节是16位的,char也是16位的,这个应该是问题所在。
经int checkCPU()
{
        union w
        {
                int a;
                char b;
        }c;
        c.a=1;
        return(c.b==1);
}函数验证。dsp28335是小端,stm32也是小端。这个函数是网上百度的,原理也不大懂。
谢谢指教
keer_zu 发表于 2015-2-15 12:32 | 显示全部楼层
虾米一代 发表于 2015-2-15 12:14
教训的是!
TMS320C28x中的字节是16位的,char也是16位的,这个应该是问题所在。
经int checkCPU()

寻址的单位是字节,
而 short
int
long
struct xxx
class xxx 本事都需要占用多个字节存放空间

那么,问题就来了:
类似int这样的数,低权值(个十百千...是十进制的权值,明白权值是什么了吧)到高权值的存放顺序是低地址到高地址或是相反呢?这就是大小端的问题,这是处理器平台决定的,比如ARM和X86就可能不同。

struct类似,它除了有上面的问题外,还有成员的存放顺序,不过道理一样。明白大小端的区别了吗?

评分

参与人数 1威望 +3 收起 理由
虾米一代 + 3 很给力!

查看全部评分

keer_zu 发表于 2015-2-15 12:32 | 显示全部楼层
虾米一代 发表于 2015-2-15 12:14
教训的是!
TMS320C28x中的字节是16位的,char也是16位的,这个应该是问题所在。
经int checkCPU()

寻址的单位是字节,
而 short
int
long
struct xxx
class xxx 本事都需要占用多个字节存放空间

那么,问题就来了:
类似int这样的数,低权值(个十百千...是十进制的权值,明白权值是什么了吧)到高权值的存放顺序是低地址到高地址或是相反呢?这就是大小端的问题,这是处理器平台决定的,比如ARM和X86就可能不同。

struct类似,它除了有上面的问题外,还有成员的存放顺序,不过道理一样。明白大小端的区别了吗?

评分

参与人数 1威望 +3 收起 理由
虾米一代 + 3 很给力!

查看全部评分

keer_zu 发表于 2015-2-15 12:39 | 显示全部楼层
虾米一代 发表于 2015-2-15 12:14
教训的是!
TMS320C28x中的字节是16位的,char也是16位的,这个应该是问题所在。
经int checkCPU()

其实简单写个程序,判断一下一个不对称的short变量s的值是否:  p ==  *(char *)(&s) + *(((char *)(&s)) + 1) * 256
就可以知道该平台是是大端还是小端了。
 楼主| 虾米一代 发表于 2015-2-15 16:40 | 显示全部楼层
keer_zu 发表于 2015-2-15 12:39
其实简单写个程序,判断一下一个不对称的short变量s的值是否:  p ==  *(char *)(&s) + *(((char *)(&s)) ...

明白了,谢谢解答
小营七郎 发表于 2015-2-17 21:47 | 显示全部楼层
一看就是CCS的界面,楼主我也有用28335去做个四轴的想法。哈哈。

评分

参与人数 1威望 +1 收起 理由
虾米一代 + 1 赞一个!

查看全部评分

 楼主| 虾米一代 发表于 2015-2-21 10:19 | 显示全部楼层
小营七郎 发表于 2015-2-17 21:47
一看就是CCS的界面,楼主我也有用28335去做个四轴的想法。哈哈。

好牛啊。。这都看得出来。。可以啊,到时候我们一起探讨探讨。。只是四轴现在做有点晚了,我是想学28335才做的四轴
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

72

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部