OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13170|回复: 18

分享一个MPU6050精简版驱动(自己封装),新手可以参考。之前我帖子说MPU6050原始6轴数据噪声比MPU9150大,问题已经解决,方法和源码如下。上图

[复制链接]

156

主题

1201

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1413
金钱
1413
注册时间
2014-5-21
在线时间
335 小时
发表于 2015-10-23 11:04:16 | 显示全部楼层 |阅读模式
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

156

主题

1201

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1413
金钱
1413
注册时间
2014-5-21
在线时间
335 小时
 楼主| 发表于 2015-10-23 11:07:59 | 显示全部楼层
II:后来问题找到了,其中一个原因是应美盛官方驱动有点小问题


改成这样好了。还有一个问题就是MDK优化问题,我们一般设置三级优化,存数的结构体修饰一下别被优化出了问题。原始数据波形调美了,下面转换欧拉角什么就准了

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

156

主题

1201

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1413
金钱
1413
注册时间
2014-5-21
在线时间
335 小时
 楼主| 发表于 2015-10-23 11:11:00 | 显示全部楼层
III:改好后波形好了。
MATLAB图:



自己上次分享的小工具示波也对了

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

156

主题

1201

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1413
金钱
1413
注册时间
2014-5-21
在线时间
335 小时
 楼主| 发表于 2015-10-23 11:13:46 | 显示全部楼层
IV:下面分享源码吧。先分享精简版的
[mw_shl_code=c,true] #ifndef _MPU9150_H_ #define _MPU9150_H_ #include "bsp_i2c.h" #include "stm32f0xx_i2c.h" #define SlvAddr 0xD0 //AD0_pin如果接GND,则MPU6050的IIC地址是:0xD0; AD0_pin如果接VDD,则MPU6050的IIC地址是:0xD1 #define SMPLRT_DIV 0x19 //陀螺仪采样率,典型值:0x07(125Hz) #define CONFIG 0x1A //低通滤波频率,典型值:0x06(5Hz) #define GYR_CONFIG 0x1B //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) #define ACC_CONFIG 0x1C //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz) #define INT_PIN_CFG 0x37 #define ACC_XOUT_H 0x3B #define ACC_XOUT_L 0x3C #define ACC_YOUT_H 0x3D #define ACC_YOUT_L 0x3E #define ACC_ZOUT_H 0x3F #define ACC_ZOUT_L 0x40 #define TMP_OUT_H 0x41 #define TMP_OUT_L 0x42 #define GYR_XOUT_H 0x43 #define GYR_XOUT_L 0x44 #define GYR_YOUT_H 0x45 #define GYR_YOUT_L 0x46 #define GYR_ZOUT_H 0x47 #define GYR_ZOUT_L 0x48 #define USER_CTRL 0x6A #define PWR_MGMT_1 0x6B //电源管理,典型值:0x00(正常启用) #define PWR_MGMT_2 0x6C //电源管理,典型值:0x00(正常启用) #define WHO_AM_I 0x75 //IIC地址寄存器(默认数值0x68,只读) /******************************************************************************************************* ** 功能描述: 所有PWR_MGMT_1寄存器位 ********************************************************************************************************/ #define Get_Bit(BIT,flag) (BIT) & (flag) #define Set_Bit(BIT,flag) (BIT) |= (flag) #define Clr_Bit(BIT,flag) (BIT) &= ~(flag) #define Clr_All_BITs(BIT) (BIT) = 0x00 #define Set_All_BITs(BIT) (BIT) = 0xFF /******************************************************************************************************* ** 结构名称: PWR_MGMT_1_BITs ** 功能描述: 其所有寄存器位 ********************************************************************************************************/ typedef enum { CLKSEL_0 =1, CLKSEL_1 =(1<<1), CLKSEL_2 =(1<<2), CYCLE =(1<<5), SLEEP =(1<<6), DEVICE_RESET =(1<<7), }PWR_MGMT_1_BITs; /******************************************************************************************************* ** 结构名称: ACC_CONFIG_BITs ** 功能描述: 其所有寄存器位 ********************************************************************************************************/ typedef enum { AFS_SEL_0 =1, AFS_SEL_1 =(1<<1), ZA_ST =(1<<5), YA_ST =(1<<6), XA_ST =(1<<7), }ACC_CONFIG_BITs; /******************************************************************************************************* ** 结构名称: GYR_CONFIG_BITs ** 功能描述: 其所有寄存器位 ********************************************************************************************************/ typedef enum { FS_SEL_0 =(1<<3), FS_SEL_1 =(1<<4), ZG_ST =(1<<5), YG_ST =(1<<6), XG_ST =(1<<7), }GYR_CONFIG_BITs; /******************************************************************************************************* ** 结构名称: GYR_CONFIG_BITs ** 功能描述: 其所有寄存器位 ********************************************************************************************************/ typedef enum { DLPF_CFG_0 =1, DLPF_CFG_1 =(1<<1), DLPF_CFG_2 =(1<<2), EXT_SYNC_SET_0 =(1<<3), EXT_SYNC_SET_1 =(1<<4), EXT_SYNC_SET_2 =(1<<5), }CONFIG_BITs; /* 高通滤波门限设置 */ enum ACC_HPF { HPF_0HZ = 0, HPF_5HZ, HPF_2_5HZ, HPF1_25HZ, HPF_0_63HZ, HPF_HOLD = 7 }; typedef enum { Error = 0, Success = !Error }Status; extern unsigned char PWR_MGMT_1_BITS; extern unsigned char PWR_MGMT_2_BITS; extern unsigned char ACC_CONFIG_BITS; extern unsigned char GYR_CONFIG_BITS; extern unsigned char CONFIG_BITS; extern unsigned char SMPRT_DIV_BITS; extern void Move_Average_Filter_32(short* data); extern Status IMU_Init(void);/* 初始化MPU6050 */ extern Status Get_ACC_Raw(short *data);/* 获取原始数据 */ extern Status Get_GYR_Raw(short *data); //extern Status Get_TMP_Raw(short *data);//获取温度 void Delay_ms(unsigned int tick); #endif [/mw_shl_code]

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

156

主题

1201

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1413
金钱
1413
注册时间
2014-5-21
在线时间
335 小时
 楼主| 发表于 2015-10-23 11:14:31 | 显示全部楼层
[mw_shl_code=c,true] #include "mpu9150.h" unsigned char PWR_MGMT_1_BITS=0x00,PWR_MGMT_2_BITS=0x00,ACC_CONFIG_BITS=0x00,GYR_CONFIG_BITS=0x00,CONFIG_BITS=0x00,SMPRT_DIV_BITS=0x00; /******************************************************************************************************** ** 函数名称: MPU_Init ** 功能描述: MPU9150初始化 ********************************************************************************************************/ Status IMU_Init(void) { /*Step1*/ // Set_Bit(PWR_MGMT_1_BITS,DEVICE_RESET);/*复位IMU*/ // if (I2C_OK!=I2C1_Write_NBytes(SlvAddr,PWR_MGMT_1,1,&WR_MGMT_1_BITS)){return Error;} // Delay_ms(0xffff); /*Step2*/ Clr_All_BITs(PWR_MGMT_1_BITS);/*唤醒IMU*/ if (I2C_OK!=I2C1_Write_NBytes(SlvAddr,PWR_MGMT_1,1,&WR_MGMT_1_BITS)){return Error;} /*Step3*/ Set_Bit(PWR_MGMT_1_BITS,CLKSEL_0);/*PLL,使用陀螺仪X轴做参考比默认内部8MHz系统时钟源精确点*/ if (I2C_OK!=I2C1_Write_NBytes(SlvAddr,PWR_MGMT_1,1,&WR_MGMT_1_BITS)){return Error;} /*Step3*/ if (I2C_OK!=I2C1_Write_NBytes(SlvAddr,PWR_MGMT_2,1,&WR_MGMT_2_BITS)){return Error;} /*Step3*/ Set_Bit(SMPRT_DIV_BITS,4);/*200Hz设置陀螺仪采样分频系数 Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV)*/ if (I2C_OK!=I2C1_Write_NBytes(SlvAddr,SMPLRT_DIV,1,&SMPRT_DIV_BITS)){return Error;} /*Step4*/ Set_Bit(CONFIG_BITS,DLPF_CFG_2);/*设置DLPF数字低通滤波器ACC【Bandwidth(21Hz) Delay(8.5ms)】,GYR【Bandwidth(20Hz) Delay(8.3ms)】,Fs (1kHz)*/ if (I2C_OK!=I2C1_Write_NBytes(SlvAddr,CONFIG,1,&CONFIG_BITS)){return Error;} /*Step3*/ Set_Bit(GYR_CONFIG_BITS,FS_SEL_0|FS_SEL_1);/*默认11b,GYR量程±2000°/s*/ if (I2C_OK!=I2C1_Write_NBytes(SlvAddr,GYR_CONFIG,1,&GYR_CONFIG_BITS)){return Error;} /*Step4*/ Clr_All_BITs(ACC_CONFIG_BITS);/*设置00b,ACC量程±2G*/ ACC_CONFIG_BITS=HPF_0HZ;/*设置00b, */ if (I2C_OK!=I2C1_Write_NBytes(SlvAddr,ACC_CONFIG,1,&ACC_CONFIG_BITS)){return Error;} return Success; } /******************************************************************************************************** ** 函数名称: Get_ACC_Raw ** 功能描述: 获取ACC原始值 ********************************************************************************************************/ Status Get_ACC_Raw(short *raw) { unsigned char tmp[6]; if (I2C_OK!=I2C1_Read_NBytes(SlvAddr,ACC_XOUT_H,6,tmp)) { return Error; } raw[0] = (short)(tmp[0] << 8 | tmp[1]); raw[1] = (short)(tmp[2] << 8 | tmp[3]); raw[2] = (short)(tmp[4] << 8 | tmp[5]); //printf("%d,",raw[0]); return Success; } /******************************************************************************************************** ** 函数名称: Get_GYR_Raw ** 功能描述: 获取GYR原始值 ********************************************************************************************************/ Status Get_GYR_Raw(short *raw) { unsigned char tmp[6]; if (I2C_OK!=I2C1_Read_NBytes(SlvAddr,GYR_XOUT_H,6,tmp)) { return Error; } raw[0] = (short)(tmp[0] << 8 | tmp[1]); raw[1] = (short)(tmp[2] << 8 | tmp[3]); raw[2] = (short)(tmp[4] << 8 | tmp[5]); return Success; } ///******************************************************************************************************** //** 函数名称: Get_TMP_Ra //** 功能描述: 获取TMP原始值 //********************************************************************************************************/ //Status Get_TMP_Raw(short *raw) //{ // unsigned char tmp[2]; // if (I2C_OK!=I2C1_Read_NBytes(SlvAddr,TMP_OUT_H,2,tmp)) // { // return Error; // } // *raw= (tmp[0] << 8) | tmp[1]; // return Success; //} /******************************************************************************************************** ** 函数名称: Delay ** 功能描述: 粗略延时 ********************************************************************************************************/ void Delay_ms(unsigned int tick) { unsigned char j,k; for(j=0;j<tick;j++) for(k=0;k<15;k++); } [/mw_shl_code]

彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

156

主题

1201

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1413
金钱
1413
注册时间
2014-5-21
在线时间
335 小时
 楼主| 发表于 2015-10-23 11:16:35 | 显示全部楼层
V:这是上次修改官方驱动MPU9150兼容MPU6050驱动
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-6-23
在线时间
13 小时
发表于 2015-10-23 16:48:37 | 显示全部楼层
楼主威武,谢谢分享
回复 支持 反对

使用道具 举报

70

主题

6671

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12236
金钱
12236
注册时间
2012-11-26
在线时间
3644 小时
发表于 2015-10-23 17:22:34 | 显示全部楼层
mark一下  感谢楼主分享
学无止境
回复 支持 反对

使用道具 举报

156

主题

1201

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1413
金钱
1413
注册时间
2014-5-21
在线时间
335 小时
 楼主| 发表于 2015-10-24 11:12:45 | 显示全部楼层
回复【7楼】jsxh538:
---------------------------------
回复【8楼】jermy_z:
---------------------------------
能用上最好了。我怀疑应美盛内部LPF HPF什么是数字滤波,希望是内置硬件滤波就好了
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2015-10-24 19:17:23 | 显示全部楼层
谢谢分享....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2015-6-23
在线时间
13 小时
发表于 2015-10-25 13:20:01 | 显示全部楼层
回复【9楼】cornrn:
---------------------------------
我用的MPU6050,原子的DMP 。修改了一下。大概9到10分钟会出现读取数据失败一次
回复 支持 反对

使用道具 举报

1

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
349
金钱
349
注册时间
2014-7-25
在线时间
43 小时
发表于 2015-11-8 10:04:24 | 显示全部楼层
谢谢分享。。
爱我的人我会加倍爱Ta;恨我的人,我会尊敬Ta;谦虚谦逊,不是无能的表现,只是说明,9年义务教育没白学!
回复 支持 反对

使用道具 举报

156

主题

1201

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1413
金钱
1413
注册时间
2014-5-21
在线时间
335 小时
 楼主| 发表于 2015-11-8 12:58:09 | 显示全部楼层
回复【11楼】jsxh538:
---------------------------------
要么有官方的,要么用自己写的 ,github很多国外网友分享的程序
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

3

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2015-6-26
在线时间
5 小时
发表于 2016-1-7 15:36:47 | 显示全部楼层
谢谢分享     
回复 支持 反对

使用道具 举报

10

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2014-7-10
在线时间
51 小时
发表于 2016-1-9 17:13:55 | 显示全部楼层
楼主利害呀!支持一个
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2016-5-24
在线时间
2 小时
发表于 2016-6-14 20:56:35 | 显示全部楼层
谢谢分享啊  
回复 支持 反对

使用道具 举报

0

主题

19

帖子

0

精华

高级会员

Rank: 4

积分
700
金钱
700
注册时间
2016-7-7
在线时间
84 小时
发表于 2016-7-7 15:53:13 | 显示全部楼层
感谢楼主
回复 支持 反对

使用道具 举报

1

主题

27

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1273
金钱
1273
注册时间
2015-11-21
在线时间
527 小时
发表于 2016-11-16 22:16:03 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2017-7-22
在线时间
1 小时
发表于 2017-7-22 18:05:32 | 显示全部楼层
很好很好,利害
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-11 18:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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