添加MPU6050陀螺仪模块
又是新的一天,今天开始撸MPU6050模块!
平衡小车最重要的就是平衡,加入MPU6050陀螺仪模块可以有效控制小车得以平衡!
--------------------------------------------- 分 界 线 ---------------------------------------------------------------------------
MPU6050是个神奇的东西!更确切的说IIC是个神奇的东西!不好好搭建基础,就要做好啃土的准备
-------------------------------------------------------------------------------------------------------------------------------------
1、IIC引脚配置问题
针对MPU6050,其主要通讯在于IIC,如若引脚配置出现问题,则将无法提取相关信息!
其中主要关注有几下几点:
I/O配置(参考了正点原子相关文档)
//初始化IIC
void MPU_IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外设IO PORTB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIO
GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9); //PB10,PB11 输出高
}
//IO方向设置
#define MPU_SDA_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}
#define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=3<<4;}
//IO操作函数
#define MPU_IIC_SCL PBout(8) //SCL
#define MPU_IIC_SDA PBout(9) //SDA
#define MPU_READ_SDA PBin(9) //输入SDA
以上2个是对引脚的配置信息,其中难以理解的是后面的I/O方向设置,采用了寄存器配置,可能没学过的就难以理解,具体参考芯片手册中I/O输入输出模式寄存器设置相关介绍,而端口配置又分为低寄存器和高寄存器,低寄存器包括(0、1、2、3、4、5、6、7),高寄存器包括(8、9、10、11、12、13、14、15),其中每一位需要配置CNFy和MODEy,以此来控制其输入输出模式以及其配置速度!
端口低寄存器配置方法:
端口高寄存器配置方法
上面为端口配置方法,下面具体按程序来讲解细节部分,首先此程序配置的SCL为端口PB8、SDA为端口PB9,其余大概都能有所了解下面重点分析一下寄存器配置部分:
//IO方向设置
#define MPU_SDA_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}
#define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=3<<4;}
具体细节只是此处不做详细介绍,博主也是一个渣渣,哈哈,大概意会一下就行~
其中若是对高位寄存器进行配置,则是GPIOB->CRH
;若是对低位寄存器进行配置,则是GPIOB->CRL
。
因为此处对PB9进行定义,而PB9又是在高位的第二个,所以先对此位置零,即0XFFFFFF0F
。然后进行配置,此处对于MPU_SDA_IN()
来说是需要对PB9口进行上拉/下拉输入模式,因此配置CNFy和MODEy位时,参照芯片手册,选择对应模式,得到CNFy配置为10、MODEy配置为00。因此此时需要将此位配置成1000,二进制换算一下就是8。GPIOB->CRH|=8<<4
这个就是将8左移四位送至PB9寄存器中!
对MPU_SDA_OUT()
的配置类似上面,其模式有所不同,配置在输出50MHZ下。
举个例子,如果对PB2进行IIC引脚配置,则相关程序如下:
//IO方向设置
#define MPU_SDA_IN() {GPIOB->CRL&=0XFFFFF0FF;GPIOB->CRL|=8<<4*2;}
#define MPU_SDA_OUT() {GPIOB->CRL&=0XFFFFF0FF;GPIOB->CRL|=3<<4*2;}
2、DMP数字移动处理器
参考了不少姿态融合运算方案,有的说卡尔曼滤波处理好,有的说DMP处理简单,本博主资历尚浅,不做评价~ 各位图方便直接借用学习就行~
说到底,博主就是菜
3、MPU6050开启注意事项
初始化程序,即开机时,要保持模块处于静态稳定,否则无法初始化,使得无法得到四元数!
这是一个神奇的东西,目前尚未明白其中原因,后续亟待更新,huany若有大佬知晓原理,欢迎留言!
以上相关更新信息,参考了数篇博主文档并加以理解总结而成~ 如有不妥之处,请多指正!