**
最近焊了一块mpu6050,听说这东西用在平衡车,我也有打算做一个平衡车。先计划熟悉一下,因为在这个模块踩下的坑众多,忙了一两天也算能跑,但有bug.时而可以通过串口打印时而半天不出结果。将问题和代码发出来大家帮忙看看问题。
首先将正点原子代码直接拉出来,我们这里仅仅通过串口打印一下角度,所以将不需要的代码删除,由于mpu6050寄存器众多,我也不可能去一个个去了解,这里参考里其他人的代码。唯一不理解的是为什么这里需要用到温度传感器,所以我把它注释了,有知道用处的伙伴可以告诉我。
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
int main(void)
{
float pitch,roll,yaw; //欧拉角
short aacx,aacy,aacz; //加速度传感器原始数据
short gyrox,gyroy,gyroz; //陀螺仪原始数据
// short temp; //温度
uart_init(115200);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(); //延时函数初始化
MPU_Init();
while(mpu_dmp_init()!=0){ }
while(1)
{
while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0) { }
// temp=MPU_Get_Temperature(); //得到温度值
MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器数据
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz); //得到陀螺仪数据
printf("roll:%d pitch:%d yaw:%d\r\n",(int)(roll*100),(int)(pitch*100),(int)(yaw*100));
delay_ms(500);
}
}
同时还要修改iic定义的sdl和scl,正点原子mni版原来的代码用的是PC11和PC12,在f103板子上找个半天没有,所以将源代码定义接口修改
#define MPU_SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=8<<12;}
#define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=3<<12;
//IO操作函数
#define MPU_IIC_SCL PBout(12) //SCL
#define MPU_IIC_SDA PBout(11) //SDA
#define MPU_READ_SDA PBin(11) //
正点原子的mini版代码非常完善,我们只需要修改很少的部分,基本上只需要将main函数里面的稍微修改一下就可以拿回来用。至此,代码修改完毕。代码中while里面函数的判断至于有用,什么大家可以继续百度,由于我也是懵懵懂懂就不给介绍了
完成代码以后连接硬件,串口无法打印hello world,一片白。网上介绍说是模块坏了,于是火速又买了一个,但是但是,在我要关闭调试窗口时,代码竟然动了…
跑完这三行就不动了,很迷惑。然后就是拔掉usb重插,代码重新编译下载。多次实验发现,模块在某些位置可以运行成功
实验到这里每一个问题都搞得我精疲力尽,但是我们怎么能停下来呢,到这里就要开始找原因了,首先换着花样的注释第一个和第三个while,毕竟程序跑不通他俩责任占一大半,但结果还是一样,有时候能跑出来欧拉角都为0的信息有时候根本打印不出来,这时候换个思路,第一第三个while后面跟着一个空括号,作用是等待dmp开始启动,我在这里打印错误信息可以知道运行情况。
可以看到错误显示既有错误1和错误2,说明程序在第一个while和第三个while都有问题
继续调整模块至某个位置,在错误2和成功初始化之间来回摆动,至此可以基本确定是硬件问题导致代码无法正常运行。
实际上在这个模块上我犯下的错误远比上述的要多,最后还是得到了一个结果,同时希望学习的小伙伴们永不放弃。最后附上百度云链接,以供大家参考
链接:https://pan.baidu.com/s/18-wUaB2TelK1MoVXwmatoA
提取码:l36k