关于MPU6050模块的食用>_<(本人比较菜,写的不好或有错误的地方欢迎大佬指出)
最近学校冬令营发了个MPU6050模块,第一次弄也花了我花了不少时间,于是就把其中一些步骤以及要点简单说下。
至于MPU6050的介绍啥的,我也不细说了,很多地方都有,我就说下怎么移植现成的代码。(用的核心板是F401CCU6)
把代码下载一下,芝士地址 (提取码:1145) (里面有些头文件如果报错的话删掉就行了)
代码分成两部分,一个是对mpu6050寄存器的读取,另一个是dmp库,也就是把读取的原始信息进行一系列操作得到的三轴角速度以及欧拉角等信息。
然后就是CubeMX里的配置
1、尝龟配置,开烧录口,以及时钟配置
2、与MPU6050建立IIC通信:
找两个IO口,我选择的是A0与A1,都设置为开漏输出,上拉,其他不变(如图)
3、开启串口用于调试
这里我选择的是UART1,要是选别的串口的话后面printf重定向代码记得改一下
4、project manager里正常配置即可
接线:只用MPU6050的SDA,SCL,GND,VCC四个引脚即可,其他的话目前不需要,引脚对着图接即可
我用的是DAPLINK,就用DAPLINK上的TX接单片机的RX,RX对TX即可
之后就是keil里的部分
先把移植文件都导入进去,根据引脚配置改一下mpuiic.h里的宏定义,然后定义一下三个欧拉角变量(pitch,roll,yaw)
再写一下printf重定向,把下面代码加在usart.c即可
/* USER CODE BEGIN 0 */ typedef struct __FILE FILE; struct __FILE { int handle; }; FILE __stdout; /* USER CODE END 0 */ /* USER CODE BEGIN 1 */ int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0); //这里是usart1,用别的串口记得改 USART1->DR = (uint8_t) ch; return ch; } /* USER CODE END 1 */
然后是main函数里的代码
/* USER CODE BEGIN 2 */ MPU_Init(); printf("print ok\n"); while(mpu_dmp_init()) { HAL_Delay(20); printf("no_dmp\n"); } printf("ok_dmp\n"); /* USER CODE END 2 */ /* USER CODE BEGIN 3 */ while(mpu_dmp_get_data(&pitch,&roll,&yaw)){} printf(" pitch:%f\n roll:%f\n yaw:%f\n",pitch,roll,yaw); HAL_Delay(1000); /* USER CODE END 3 */
然后打开串口助手,就可以收到MPU6050发送的三个欧拉角信息啦
值得注意的一些地方:
1、两个GPIO口的配置均为开漏输出,如果是推挽输出的话会导致dmp初始化不成功(返回值为4)
2、烧录的时候MPU6050记得放平,不然容易出现误差
3、因为没加地磁计,所以yaw的零点漂移会比较严重
4、其他问题可以参考这篇博客里最后的问题汇总
第一次写博客,还请多多指教>_<
后面有空可能会写pid的东西()
标签:CODE,HAL,MPU6050,dmp,USER,FILE,printf,STM32F4 From: https://www.cnblogs.com/Asaka-QianXiang/p/17031005.html