首先写好本单片机的IIC 相关的初始化代码,
如,IIC 时钟,GPIO口,使能等.
然后参考:
1.
b站 使用STM32F103 读取MPU6050 实例,其中使用DMP库算出各个方向的角度
https://www.bilibili.com/video/BV1Ma4y1i7Py/
百度网盘链接: https://pan.baidu.com/s/1guc85gIjGAVGJn-V-1ZddQ
提取码: d0bk
2.
其中csdn:
超详细(简略介绍了一下)陀螺仪MPU6050模块输出姿态角(有完整版源码)
https://blog.youkuaiyun.com/lihaotian111/article/details/117307644
注意点:
A.
其中, 在 inv_mpu.c 文件中有几个函数需要实现,其实也就是iic 读写的函数,还要实现单片机相关的延时函数,
具体位置在这里:
#if defined MOTION_DRIVER_TARGET_MSP430
/*#include "msp430.h"
#include "msp430_i2c.h"
#include "msp430_clock.h"
#include "msp430_interrupt.h" */
#define i2c_write mpu_write_len
#define i2c_read mpu_read_len
#define delay_ms delay_ms
#define get_ms myget_ms
mpu_write_len,mpu_read_len,delay_ms 这三个需要实现,myget_ms是空函数
为啥是 MOTION_DRIVER_TARGET_MSP430 这个宏定义,
因为 DMP 官方为MSP430 写的,移植过来的,不要考虑这些.
其中1.中的代码:
在定时器中使用
void Read_DMP(float *Pitch,float *Roll,float *Yaw);
即可.或者在main函数中的while(1)直接使用。注意申明变量,函数返回即可得到角度值。
B. 代码编译ok后,为啥三个角度的值都是0呢? (在确保IIC 已经正常通讯获取设备地址的情况下)
有网友说是,没有重置,没有唤醒,或者是延时时间不够
其中1.的代码处:
void DMP_Init(void);中 int mpu_init(void);函数
已经对设备进行 reset 并且wakeup .难道不是吗?
后面在正点原子的例子中找到:
FIFO 中数据的频率需与宏 DEFAULT_MPU_HZ 定义的频率一致 (也是是定时器读取的速度要匹配)
/**
* * 读取得太快或太慢都可能导致读取失败
* 读取太快 6050 还未采样,FIFO 中无数据,读取失败
* 读取太慢 6050 的 FIFO 溢出,读取失败
*/
C. 关于读取角度值后. Yaw角度有飘移的问题.
这个问题目前没有很好的解法,或者修正,或者加精度高的辅助
MPU6050 资料链接:
MPU6050 卖家网盘地址连接:
GY-521 MPU6050资料请自行下载:
https://pan.baidu.com/s/17HVp2y87gfl-iHyGud-mLw?pwd=8888
提取码: 8888
正点原子网盘地址:
六轴传感器模块ATK-MPU6050
http://www.openedv.com/docs/modules/other/ATK-MPU6050.html
百度网盘-链接:
https://pan.baidu.com/s/1nk37K_esFaRrobjVyJJDfA
提取码: t206