一·学习过程及目标
- 学会对MPU6050寄存器的读写操作
- 了解主要寄存器的含义
- 参考源代码,自己编写程序,让MPU6050工作起来,然后读出加速度、陀螺仪、温度等数据
二·先决条件
了解MPU6050
下面是本人看过的帖子,前面两个是比较入门的
本人所用源码为第四个,源码中还包含oled的功能,但是因为我没有使用oled的功能,所以未进行学习。(所有代码均为C语言)
三·学习过程
1.因为我的开发板引脚使用和源代码冲突,所以先修改了引脚使用,改为
#define MPU_I2C_SCL 16
#define MPU_I2C_SDA 17
2.开始理解代码,如:
i2c_write(st.hw->addr, st.reg->pwr_mgmt_1, 1, &tmp);
本句的意思是将tmp写进某个寄存器长度为1个字节
同理,
i2c_read(st.hw->addr, st.reg->pwr_mgmt_1, 1, &tmp);
这句的意思是从某个寄存器里读1个字节的长度读进tmp
3.在简单的了解读写操作过后我开始阅读MPU6050的寄存器手册着手了解寄存器的作用和如何使用
部分中文MPU6050 DataSheet
链接:https://pan.baidu.com/s/1J7wZ3StnW9tAtv_z23tumw?pwd=igzs
提取码:igzs
4.结合前面了解过的寄存器读写操作,开始测试。
如:
tmp=0x80;
i2c_write(st.hw->addr, st.reg->pwr_mgmt_1, 1, &tmp);
i2c_read(st.hw->addr, st.reg->pwr_mgmt_1, 1, &data);
printf("st.reg->pwr_mgmt_1:%x\n",data);
会发现data的值为40;
在查看源代码定义的寄存器命名后知道pwr_mamt_1是电源管理1
查看寄存器手册
我们知道16进制0x80转换为二级制为“10000000”,对应为DEVICE_RESET位为1,所以寄存器复位,各位变为默认值,寄存器内的值为“01000000”,所以读出的值为40。
接下来一个一个尝试,先写进寄存器再读出,观察是否符合实际。
当然部分寄存器是不可写入数据的,如
这个寄存器是由其他寄存器自动写入的,是不能人为写入的,所以我们只能读也只需要读出数据就行。
5.在熟悉寄存器的读写操作和寄存器的作用后,我们开始尝试编写代码操作。
在另一份源代码中我们找到了初始化MPU6050的操作,接下来就是模仿,尝试自己编写代码完成初始化操作。
比如
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //唤醒MPU6050
将0x00写入电源管理器1,在我们的代码中就应该是
tmp=0x00;
i2c_write(st.hw->addr, st.reg->pwr_mgmt_1, 1, &tmp);
过程不演示了,请自行完成。
我开始尝试替换源代码中初始化MPU6050的功能,初次尝试时我直接注释掉了原本的代码,但是报错了。在看过源码后,我发现它在初始化MPU6050时还初始化了IIC接口,我并没有这一步,在简单的改动后成功完成初始化功能。
四·成果展示
接下来就是简单的找出所需的数据打印出来
如图: