当前位置:   article > 正文

MPU6050详解(含源码)

mpu6050

前言MPU6050是一款强大的六轴传感器,需要理解MPU6050首先得有IIC的基础,MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器,并且含有一个第二 IIC 接口,可用于连接外部磁力传感器,内部有硬件算法支持.

1.IO分配(MPU6050模块)

1. SCL 和 SDA 是连接 MCU 的 IIC 接口, MCU 通过这个 IIC 接口来控制 MPU6050,
另外还有一个 IIC 接口

2.AUX_CL 和 AUX_DA,这个接口可用来连接外部从设备,比如磁传感
器,这样就可以组成一个九轴传感器。

3.AD0 是从 IIC 接口(接 MCU)的地址控制引脚,该引脚控制 IIC 地址的最低位。如果接 GND,则 MPU6050 的 IIC 地址是: 0X68,如果接 VDD,则是 0X69.

2.MPU6050初始化(PA15 接 AD0 = GND)

注意:PA15默认是JTAG引脚,使用PA15时,需要使用IO的重映射功能。

(1)设置MPU6050的地址(AD0的电平) 

  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开辅助功能时钟
  2. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  3. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //
  4. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  5. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  6. GPIO_Init(GPIOA, &GPIO_InitStructure);
  7. GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
  8. MPU_AD0_CTRL=0; //设置为低电平

注:这里使用PA15是默认是JTAG引脚 ,需要重映射。

(2)完成IIC的初始化 

  1. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//ÏÈʹÄÜÍâÉèIO PORTBʱÖÓ
  2. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; // ¶Ë¿ÚÅäÖÃ
  3. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
  4. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO¿ÚËÙ¶ÈΪ50MHz
  5. GPIO_Init(GPIOB, &GPIO_InitStructure); //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIO
  6. GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11); //PB10,PB11 Êä³ö¸ß

(3)配置MPU6050的设置

  1. MPU_IIC_Init();//初始化IIC总线
  2. MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //复位MPU6050
  3. delay_ms(100);
  4. MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //唤醒MPU6050
  5. MPU_Set_Gyro_Fsr(3); //陀螺仪传感器,±2000dps
  6. MPU_Set_Accel_Fsr(0); //加速度传感器,±2g
  7. MPU_Set_Rate(50); //设置采样率50Hz
  8. MPU_Write_Byte(MPU_INT_EN_REG,0X00); //关闭所有中断
  9. MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C主模式关闭
  10. MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //关闭FIFO
  11. MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT引脚低电平有效
  12. res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
  13. if(res==MPU_ADDR)//器件ID正确
  14. {
  15. MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01); //设置CLKSEL,PLL X轴为参考
  16. MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00); //加速度与陀螺仪都工作
  17. MPU_Set_Rate(50); //设置采样率为50Hz
  18. }

注:这里配置MPU6050的操作,都是通过IIC协议,直接对MPU6050的寄存器进行访问.

这里提供一个芯片初始化是否成功的小技巧,通常每个芯片都有自己的芯片ID,通常可以把初始化函数设置为u8类型,通过读取ID是否正确,返回不同类型的值(return 1或0),如:while(mpu_dmp_init())

 3.MPU6050通信协议分析

发送一个字节

(1)MCU发送一个起始信号。

(2)传输从机7位地址+读/写位,等待应答信号

(3)发送寄存器地址,等待应答

(4)发送1个字节数据,等待应答

(5)结束信号

使用IIC写一个字节数据,程序如下:

  1. u8 MPU_Write_Byte(u8 reg,u8 data)
  2. {
  3. MPU_IIC_Start();
  4. MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令
  5. if(MPU_IIC_Wait_Ack()) //等待应答
  6. {
  7. MPU_IIC_Stop();
  8. return 1;
  9. }
  10. MPU_IIC_Send_Byte(reg); //写寄存器地址
  11. MPU_IIC_Wait_Ack(); //等待应答
  12. MPU_IIC_Send_Byte(data);//发送数据
  13. if(MPU_IIC_Wait_Ack()) //等待ACK
  14. {
  15. MPU_IIC_Stop();
  16. return 1;
  17. }
  18. MPU_IIC_Stop();
  19. return 0;
  20. }

 读取IIC多个字节数据

  1. u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  2. {
  3. MPU_IIC_Start();
  4. MPU_IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令
  5. if(MPU_IIC_Wait_Ack()) //等待应答
  6. {
  7. MPU_IIC_Stop();
  8. return 1;
  9. }
  10. MPU_IIC_Send_Byte(reg); //写寄存器地址
  11. MPU_IIC_Wait_Ack(); //等待应答
  12. MPU_IIC_Start();
  13. MPU_IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令
  14. MPU_IIC_Wait_Ack(); //等待应答
  15. while(len)
  16. {
  17. if(len==1)*buf=MPU_IIC_Read_Byte(0);//读数据,发送nACK
  18. else *buf=MPU_IIC_Read_Byte(1); //读数据,发送ACK
  19. len--;
  20. buf++;
  21. }
  22. MPU_IIC_Stop(); //产生一个停止条件
  23. return 0;
  24. }

代码连接: 

 链接:https://pan.baidu.com/s/1SKYUonB0yKy9iG6hjabvGQ?pwd=a81l 
提取码:a81l

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/454874
推荐阅读
相关标签
  

闽ICP备14008679号