1 Star 2 Fork 1

cyt / mpu6050

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

MPU6050

包含有六个轴,三轴陀螺仪,三轴的加速计,一个温度计和一个磁力计,一般使用IIC通信来驱动该模块,也可以使用SPI

mpu6050的datasheet和寄存器表已经放在目录MPU6050文件下,里面还有dmp库的源码文件

模块接口定义(购买模块引出或者叫法不同)

VCC 3.3V电源接口 GND 与单片机的GND相连

SCL:MPU6050作为从设备的时钟线 SDA:MPU6050作为从设备的数据线

XCL:MPU6050作为主设备的时钟线 XDA:MPU6050作为主设备的数据线

ADO:MPU6050设备地址位。如果该位为低电平,地址为0x68,如果为高电平,地址为0x69。要注意,此时的地址是7bit,不包括读写标志位。而hal库的硬件spi中,传入地址需要8位地址,包含读写标志位(0为写,1为读)。所以对应起来,0x68加上最后一位0的话,应该是0xD0。使用hal库函数时,应使用0xD0这个地址,无论读写(当AD0为低电平)。

工程的使用

在文件mpu6050.h存在两个宏定义。

#define IIC_WAY 0   //1使用硬件IIC,0使用软件IIC
#define ENABLE_DMP 1  //1使用dmp,0不适用

另外,如果使用了软件iic,需要到iic_drv.h中修改配置的gpio口,以及寄存器的操作。(如何操作在下面会有记录)

需要修改的代码有

#define SCL GPIO_PIN_8
#define SDA GPIO_PIN_9
//直接修改寄存器来配置,比使用hal库初始化更方便
#define SDA_IN() {GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=(uint32_t)8<<4;}
#define SDA_OUT() {GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=(uint32_t)1<<4;}

#define SCL_HIGH() HAL_GPIO_WritePin(GPIOA,SCL,GPIO_PIN_SET)
#define SCL_LOW() HAL_GPIO_WritePin(GPIOA,SCL,GPIO_PIN_RESET)
#define SDA_HIGH() HAL_GPIO_WritePin(GPIOA,SDA,GPIO_PIN_SET)
#define SDA_LOW() HAL_GPIO_WritePin(GPIOA,SDA,GPIO_PIN_RESET)

如果需要使用dmp库,stm32f1系列已经写好 了,如果是f4需要自己重新修改。移植方法将在后面记录

如果使用了硬件spi,如果使用的是iic1无需修改,如果使用了iic2,需要在dmp文件夹下两个文件里面修改这两个

#define i2c_write(a,b,c,d) \
    HAL_I2C_Mem_Write(&hi2c1,a,b,I2C_MEMADD_SIZE_8BIT,d,c,2)
#define i2c_read(a,b,c,d)  \
    HAL_I2C_Mem_Read(&hi2c1,a,b,I2C_MEMADD_SIZE_8BIT,d,c,2)

cubemx配置

硬件spi

image-20220815150200794

软件spi

image-20220815150318438

注意点:需要把两个引脚配置为推挽输出。是否上下拉都可以,上拉可以一定程度上加大传输速率。

软件IIC注意点

使用寄存器修改GPIO口的输出输入模式

在stm32f103c8t6中,GPIO口配置使用的是GPIOx_CRH和GPIOx_CRL寄存器,前者储存8-15,后者储存0-7

#define SDA_IN() {GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=(uint32_t)8<<4;}
#define SDA_OUT() {GPIOA->CRH&=0XFFFFFF0F;GPIOA->CRH|=(uint32_t)1<<4;}

上面的第一句,是清空对应的位,以GPIOA9为例子

image-20220815151206046

依靠高位寄存器的4到7位来配置。所以首先使用&=来清空这四个位,再用|=来设置对应的功能。

image-20220815151345553

由上图可以得知,高两位的CNF是配置具体的模式,MODE是控制输出或者输入模式。

从上面的8<<4,8的2进制为1000,左移四个位,就是1000 0000。也就是,把4-7位配置为1000。CNF为10,MODE为00。就是配置为了上拉/下拉输入模式。

同理1<<4,最终,CNF为00,MODE为01,配置为了输出速度为10MHZ的通用推挽输出模式。

软件iic的时序,就是根据iic的时序使用gpio进行了模拟,具体的原理在iic通信原理中记录。

DMP库移植

首先需要把MPU6050文件里面的\motion_driver_6.12\motion_driver_6.12\arm\STM32F4_MD6\Projects\eMD6\core\driver\eMPL

目录下面的所有文件拷贝到自己的工程文件夹中。打开inv_mpu_init.c,在其头部加入(结合自己使用的芯片进行修改)。注意,其中define后面的第一个名字不能修改,不然会引起很多的报错。

#if defined EMPL_TARGET_STM32F1_IIC_SOFTWARE
#include "main.h"
#include "stdio.h"
#include "iic_drv.h"
#include "delay.h"


#define i2c_write(a,b,c,d) \
    IIC_Write_nByte(a,b,d,c)
#define i2c_read(a,b,c,d)  \
    IIC_Read_nByte(a,b,d,c)
//#define delay_ms(n)    delay_ms(n)
#define get_ms(m)      do{*m = HAL_GetTick();}while(0)
#define log_i      printf
#define log_e       printf
#define min(a,b) ((a<b)?a:b)
#define fabs        fabsf
#define min(a,b) ((a<b)?a:b)

接着在该文件的前面加上

#define MPU6050
#define [上面定义的名字]

另外一个.c文件也需要做相同的操作

接着,初始化dmp库,可以参考mpu6050.cpp里面的写法,也可以参考dmp库的官方使用手册。

最后,需要注意,自检的时候,mpu6050一定要放置平稳,否则会无法通过自检或者造成比较大的误差。

最后 记录一下一个坑。软件iic的gpio配置,配置为推挽和开漏都可以,但是不可以配置为复用。复用是指定给芯片内部操作的,如硬件spi和硬件iic。另外,输入模式,设置浮空和上拉都可以,但不能使用保留和模拟输入。

原因很简单,要理解好各种模式的功能和作用,不能从网上道听途说。

空文件

简介

mpu6050模块的使用,包括了软件iic和硬件iic,以及dmp库的移植。硬件iic部分,对mpu6050使用了面向对象思想进行封装。 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C++
1
https://gitee.com/cyt-curry/mpu6050.git
git@gitee.com:cyt-curry/mpu6050.git
cyt-curry
mpu6050
mpu6050
main

搜索帮助