智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 19867|回复: 17
打印 上一主题 下一主题

用过MPU6050 的各位大神,都出来分享一下经验吧!!!

  [复制链接]

6

主题

34

帖子

0

精华

高级会员

Rank: 4

积分
600
威望
316
贡献
150
兑换币
193
注册时间
2013-1-15
在线时间
67 小时
跳转到指定楼层
1#
发表于 2013-4-16 21:41:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟近日在搞MPU6050,这个东东读出陀螺仪数值,加计数值,然后融合,然后问题一大堆~~~~~~~

1

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
威望
304
贡献
68
兑换币
35
注册时间
2010-11-24
在线时间
6 小时
推荐
发表于 2013-7-7 11:31:42 | 只看该作者
我用过非常好用,我用在自平衡车上。
  1. //初始化MPU6050,根据需要请参考pdf进行修改

  2. u8 Init_MPU6050(void)
  3. {
  4.   GPIO_InitTypeDef  GPIO_InitStructure;

  5.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE  );
  6.    
  7.         GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10;
  8.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  9.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;  
  10.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  11.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11;
  12.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  14.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  15.                
  16.         if(Single_Read(MPU6050_Addr,WHO_AM_I)==0x68)
  17.         {
  18.           Single_Write(MPU6050_Addr,PWR_MGMT_1, 0x00);//电源管理1,解除休眠状态,时钟为内部8MHz
  19.     Single_Write(MPU6050_Addr,SMPLRT_DIV, 0x07);//采样速率125Hz
  20.     Single_Write(MPU6050_Addr,CONFIG,0x06);
  21.                 //不使能FSYNC,不使用外同步采样速率;DLPF_CFG[2~0],设置任意轴是否通过DLPF,
  22.                 //典型值:0x06(5Hz)低通滤波器带宽5Hz,
  23.                 //对加速度和陀螺仪都有效,输出频率为1kHz,决定SMPLRT_DIV的频率基准

  24.     Single_Write(MPU6050_Addr,GYRO_CONFIG, 0x08);//不自测,量程设置500°/s
  25.     /*?GYRO 量程单位系数
  26.                     +-250  deg/s  131  LSB/deg/s 初始化hex 0x00
  27.                     +-500  deg/s  65.5 LSB/deg/s           0x08   
  28.                     +-1000 deg/s  32.8 LSB/deg/s           0x10
  29.                     +-2000 deg/s  16.4 LSB/deg/s           0x18
  30.                 */
  31.                 Single_Write(MPU6050_Addr,ACCEL_CONFIG, 0x00);//不自测,量程设置2g
  32.                 /*  Accle any axe
  33.                     +-2  g    16384 LSB/g
  34.                     +-4  g    8192  LSB/g
  35.                     +-8  g    4096  LSB/g
  36.                     +-16 g    2048  LSB/g
  37.                 */
  38.                
  39.                 return 0;
  40.          }
  41.         return 1;
  42. }

  43. //******读取MPU6050数据****************************************
  44. //**************************************
  45. //读取mpu6050内部数据,两个字节,合成数据
  46. //**************************************
  47. s16 GetData(u8 REG_Address)                                                                //返回值为有符号的整形,16位
  48. {
  49.         s16 H=0,L=0;
  50.         H = Single_Read(MPU6050_Addr,REG_Address);        //先读高字节,再读低字节
  51.         L = Single_Read(MPU6050_Addr,REG_Address+1);
  52.         return (H<<8)+L;                                                                                                    //合成数据,为有符号整形数
  53. }

  54. //-------------加速度部分解算角度------------------

  55. s32 Read_Acc(void)
  56. {
  57.         s32 Accel_x;             //mpo6050读出的X轴加速度
  58.   s32 Accel_z;       //mpu6050读出的z轴加速度
  59. //-------------加速度部分解算------------------

  60. /*使用是加速度轴x轴正向朝向小车行径方向,y轴陀螺仪的正向 逆时针方向。  
  61.         加速度计的量程范围见配置  不自测,量程设置4g   scal系数为8192
  62. Accle any axe
  63.                     +-2  g    16384 LSB/g
  64.                     +-4  g    8192  LSB/g
  65.                     +-8  g    4096  LSB/g
  66.                     +-16 g    2048  LSB/g
  67. */
  68.        
  69.         Accel_x  = GetData(ACCEL_XOUT_H); //从mpu6050读取X轴加速度
  70.         Accel_z  = GetData(ACCEL_ZOUT_H); //从mpu6050读取z轴加速度
  71.        
  72.         if(Accel_x>0)
  73.         {
  74.                 Angle_accel = atan2((float)Accel_x,(float)Accel_z)*(180/3.14159265);//反正切计算rad
  75. /*    atan2(y,x)是表示X-Y平面上所对应的(x,y)坐标的角度,
  76.                   它的值域范围是(-Pi,Pi)   
  77.       用数学表示就是:atan2(y,x)=arg(y/x)-Pi   
  78.       当y<0时,其值为负,   
  79.       当y>0时,其值为正. atan2*180/Pi可以计算出角度值         */
  80.                
  81.         }
  82.                 else
  83.                 {
  84.                    Angle_accel = atan2((float)Accel_z,(float)Accel_x)*(180/3.14159265)-90;//反正切计算
  85.                         Angle_accel = -Angle_accel;
  86.     }
  87.         //angle_accel物理量单位是角度 deg!
  88.                 return Angle_accel;
  89. }

  90. //陀螺仪计算Y轴的角速度
  91. s32 Read_Gry(void)
  92. {
  93.    s32 read_gyro_y;
  94.    s32 Angle_gyro;       
  95. //-------角速度解算-------------------------
  96. //角速度量程见配置   本处使用1000 deg/s。scal系数为32.8 LSB
  97. /*?GYRO 量程单位系数
  98.                     +-250  deg/s  131  LSB/deg/s    offset 44.38188277*2
  99.                     +-500  deg/s  65.5 LSB/deg/s    offset 44.38188277
  100.                     +-1000 deg/s  32.8 LSB/deg/s ok offset 44.38188277/2
  101.                     +-2000 deg/s  16.4 LSB/deg/s    offset 44.38188277/4
  102. */

  103.   read_gyro_y= GetData(GYRO_YOUT_H)+Gyro_y_offset; //静止时角速度Y轴输出
  104.         //Gyro_y_offset计算方法gyro静止时候N多个数据的算术均值
  105.        
  106.         Angle_gyro= -read_gyro_y/65.5; //去除零点偏移,计算角速度值,负号为方向处理
  107.         //Angle_gyro测量值的单位是 deg/s.测量的物理量是角速度。
  108.         return Angle_gyro;
  109. }
复制代码
回复 支持 0 反对 1

使用道具 举报

6

主题

34

帖子

0

精华

高级会员

Rank: 4

积分
600
威望
316
贡献
150
兑换币
193
注册时间
2013-1-15
在线时间
67 小时
2#
 楼主| 发表于 2013-4-19 09:23:35 | 只看该作者
解决了,关键是以前没有融合过
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
147
威望
69
贡献
48
兑换币
12
注册时间
2012-11-14
在线时间
15 小时
毕业学校
沈航
3#
发表于 2013-4-24 16:56:00 | 只看该作者
大神,具体讲讲怎么融合的啊。用的什么算法?互补滤波么?
回复 支持 反对

使用道具 举报

6

主题

34

帖子

0

精华

高级会员

Rank: 4

积分
600
威望
316
贡献
150
兑换币
193
注册时间
2013-1-15
在线时间
67 小时
4#
 楼主| 发表于 2013-4-25 11:59:50 | 只看该作者
是,卡尔曼
回复 支持 反对

使用道具 举报

7

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
349
威望
166
贡献
71
兑换币
86
注册时间
2012-12-21
在线时间
56 小时
5#
发表于 2013-5-1 11:05:53 | 只看该作者
你好,我也在用6050,读出了原始数据,请问怎么转化为角度?谢谢啦
回复 支持 反对

使用道具 举报

6

主题

34

帖子

0

精华

高级会员

Rank: 4

积分
600
威望
316
贡献
150
兑换币
193
注册时间
2013-1-15
在线时间
67 小时
6#
 楼主| 发表于 2013-5-8 12:42:01 | 只看该作者
群号:336079701 大家一起做
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
威望
304
贡献
68
兑换币
35
注册时间
2010-11-24
在线时间
6 小时
8#
发表于 2013-7-7 11:33:33 | 只看该作者
角度解算方法,可以度娘一下陀螺仪解算方法,文库里面大把的是。
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
威望
161
贡献
99
兑换币
104
注册时间
2013-6-11
在线时间
26 小时
9#
发表于 2013-7-25 19:57:03 | 只看该作者
bg8wj 发表于 2013-7-7 11:31
我用过非常好用,我用在自平衡车上。

神一样的代码,注解之详细!对于 mpu6050本来还有一点不懂的,看了全部懂了,谢谢
回复 支持 反对

使用道具 举报

30

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2063
威望
1008
贡献
633
兑换币
600
注册时间
2013-3-9
在线时间
211 小时
毕业学校
杭州电子科技大学
10#
发表于 2013-8-15 12:41:48 | 只看该作者
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|亿加合和智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-5-6 19:00 , Processed in 0.069456 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表