stm32f103c8t6与mpu6050模块的初见
时间:2022-10-28 03:00:00
**
最近焊了一块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