当前位置:   article > 正文

stm32---软件I2C读写MPU6050(了解MPU6050更多需要查阅手册)_datah = mpu6050_readreg(mpu6050_accel_xout_h); dat

datah = mpu6050_readreg(mpu6050_accel_xout_h); datal = mpu6050_readreg(mpu6

图文概述:

代码:

MPU6050.c:

  1. #include "stm32f10x.h" // Device header
  2. #include "MyI2C.h"
  3. #include "MPU6050_Reg.h"
  4. #define MPU6050_ADDRESS 0xD0 //1101 000 0 (高7位是MPU6050的id号,最后1位表示读写状态---1为读,0为写)
  5. /**
  6. * @brief MPU6050_WriteReg---指定地址写数据
  7. * @param RegAddress---指定的地址
  8. * @param Data---写入的数据
  9. * @retval 无
  10. */
  11. void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
  12. {
  13. MyI2C_Start(); //开始时序
  14. MyI2C_SendByte(MPU6050_ADDRESS); //发送从机地址且低位最后一位为0表进行写操作
  15. while(MyI2C_ReceiveAck() != 0); //从机是否发送应答位(0为应答,1为非应答)
  16. MyI2C_SendByte(RegAddress); //发送指定写入的寄存器地址
  17. while(MyI2C_ReceiveAck() != 0); //...
  18. MyI2C_SendByte(Data); //发送写入指定寄存器的数据
  19. while(MyI2C_ReceiveAck() != 0); //...
  20. MyI2C_Stop(); //结束时序
  21. }
  22. /**
  23. * @brief MPU6050_ReadReg---指定地址读数据(需要先通过写数据指定地址然后重新开始时序读,就可以读到指定地址的内容)
  24. * @param RegAddress---指定的地址
  25. * @retval Data---读取指定地址中的内容
  26. */
  27. uint8_t MPU6050_ReadReg(uint8_t RegAddress)
  28. {
  29. uint8_t Data;
  30. MyI2C_Start(); //开始时序
  31. MyI2C_SendByte(MPU6050_ADDRESS); //发送从机地址且低位最后一位为0表进行写操作
  32. while(MyI2C_ReceiveAck() != 0); //从机是否发送应答位(0为应答,1为非应答)
  33. MyI2C_SendByte(RegAddress); //发送指定写入的寄存器地址
  34. while(MyI2C_ReceiveAck() != 0); //...
  35. MyI2C_Start(); //重新开始时序
  36. MyI2C_SendByte(MPU6050_ADDRESS | 0x01); //发送从机地址且低位最后一位为1表进行读操作
  37. while(MyI2C_ReceiveAck() != 0); //...
  38. Data = MyI2C_ReceiveByte(); //读取指定地址的数据并赋值给Data变量
  39. MyI2C_SendAck(1); //主机发送应答位(0为应答,即继续读取;1为非应答,即收回总线的控制权)
  40. MyI2C_Stop(); //结束时序
  41. return Data; //返回读取的数据
  42. }
  43. /**
  44. * @brief MPU6050_Init---初始化MPU6050的配置(查看手册根据实际情况进行配置)
  45. * @param 无
  46. * @retval 无
  47. */
  48. void MPU6050_Init(void)
  49. {
  50. MyI2C_Init();
  51. //对MPU6050芯片的电源管理寄存器1进行配置---解除睡眠,选择陀螺仪时钟
  52. MPU6050_WriteReg(MPU6050_PWR_MGMT_1, 0x01);
  53. //对MPU6050芯片的电源管理寄存器2进行配置---6个轴均不待机
  54. MPU6050_WriteReg(MPU6050_PWR_MGMT_2, 0x00);
  55. //对MPU6050芯片的采样频率分频寄存器进行配置---采样分频为10
  56. MPU6050_WriteReg(MPU6050_SMPLRT_DIV, 0x09);
  57. //对MPU6050芯片的配置寄存器进行配置---滤波参数赋予最大值
  58. MPU6050_WriteReg(MPU6050_CONFIG, 0x06);
  59. //对MPU6050芯片的陀螺仪寄存器进行配置---选择最大计算量程
  60. MPU6050_WriteReg(MPU6050_GYRO_CONFIG, 0x18);
  61. //对MPU6050芯片的加速度计寄存器进行配置---选择最大计算量程
  62. MPU6050_WriteReg(MPU6050_ACCEL_CONFIG, 0x18);
  63. }
  64. /**
  65. * @brief MPU6050_GetID---获取MPU6050芯片的ID号
  66. * @param 无
  67. * @retval MPU6050_ReadReg(MPU6050_WHO_AM_I)---返回芯片的ID号
  68. */
  69. uint8_t MPU6050_GetID(void)
  70. {
  71. return MPU6050_ReadReg(MPU6050_WHO_AM_I);
  72. }
  73. /**
  74. * @brief MPU6050_GetData---获取MPU6050芯片的相关数据,包括3轴加速度计
  75. (Accelerometer):测量X、Y、Z轴的加速度以及3轴陀螺仪传感器
  76. (Gyroscope):测量X、Y、Z轴的角速度
  77. * @param *AccX---X轴的加速度
  78. * @param *AccY---Y轴的加速度
  79. * @param *AccZ---Z轴的加速度
  80. * @param *GyroX---X轴的角速度
  81. * @param *GyroY---Y轴的角速度
  82. * @param *GyroZ---Z轴的角速度
  83. * @retval 无
  84. */
  85. void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ,
  86. int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
  87. {
  88. uint8_t DataH, DataL;
  89. DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);
  90. DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
  91. *AccX = (DataH << 8) | DataL;
  92. DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);
  93. DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);
  94. *AccY = (DataH << 8) | DataL;
  95. DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
  96. DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
  97. *AccZ = (DataH << 8) | DataL;
  98. DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);
  99. DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);
  100. *GyroX = (DataH << 8) | DataL;
  101. DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);
  102. DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);
  103. *GyroY = (DataH << 8) | DataL;
  104. DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);
  105. DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);
  106. *GyroZ = (DataH << 8) | DataL;
  107. }

MPU6050.h:

  1. #ifndef __MPU6050_H
  2. #define __MPU6050_H
  3. void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data);
  4. uint8_t MPU6050_ReadReg(uint8_t RegAddress);
  5. void MPU6050_Init(void);
  6. uint8_t MPU6050_GetID(void);
  7. void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ,
  8. int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ);
  9. #endif

MPU6050_Reg.h:

  1. #ifndef __MPU6050_REG_H
  2. #define __MPU6050_REG_H
  3. /*宏定义MPU6050常用的寄存器地址*/
  4. #define MPU6050_SMPLRT_DIV 0x19
  5. #define MPU6050_CONFIG 0x1A
  6. #define MPU6050_GYRO_CONFIG 0x1B
  7. #define MPU6050_ACCEL_CONFIG 0x1C
  8. #define MPU6050_ACCEL_XOUT_H 0x3B
  9. #define MPU6050_ACCEL_XOUT_L 0x3C
  10. #define MPU6050_ACCEL_YOUT_H 0x3D
  11. #define MPU6050_ACCEL_YOUT_L 0x3E
  12. #define MPU6050_ACCEL_ZOUT_H 0x3F
  13. #define MPU6050_ACCEL_ZOUT_L 0x40
  14. #define MPU6050_TEMP_OUT_H 0x41
  15. #define MPU6050_TEMP_OUT_L 0x42
  16. #define MPU6050_GYRO_XOUT_H 0x43
  17. #define MPU6050_GYRO_XOUT_L 0x44
  18. #define MPU6050_GYRO_YOUT_H 0x45
  19. #define MPU6050_GYRO_YOUT_L 0x46
  20. #define MPU6050_GYRO_ZOUT_H 0x47
  21. #define MPU6050_GYRO_ZOUT_L 0x48
  22. #define MPU6050_PWR_MGMT_1 0x6B
  23. #define MPU6050_PWR_MGMT_2 0x6C
  24. #define MPU6050_WHO_AM_I 0x75
  25. #endif

关键步骤:

1. 指定地址写数据:

 

  1. /**
  2. * @brief MPU6050_WriteReg---指定地址写数据
  3. * @param RegAddress---指定的地址
  4. * @param Data---写入的数据
  5. * @retval 无
  6. */
  7. void MPU6050_WriteReg(uint8_t RegAddress, uint8_t Data)
  8. {
  9. MyI2C_Start(); //开始时序
  10. MyI2C_SendByte(MPU6050_ADDRESS); //发送从机地址且低位最后一位为0表进行写操作
  11. while(MyI2C_ReceiveAck() != 0); //从机是否发送应答位(0为应答,1为非应答)
  12. MyI2C_SendByte(RegAddress); //发送指定写入的寄存器地址
  13. while(MyI2C_ReceiveAck() != 0); //...
  14. MyI2C_SendByte(Data); //发送写入指定寄存器的数据
  15. while(MyI2C_ReceiveAck() != 0); //...
  16. MyI2C_Stop(); //结束时序
  17. }

2. 指定地址读数据:

 

  1. /**
  2. * @brief MPU6050_ReadReg---指定地址读数据(需要先通过写数据指定地址然后重新开始时序读,就可以读到指定地址的内容)
  3. * @param RegAddress---指定的地址
  4. * @retval Data---读取指定地址中的内容
  5. */
  6. uint8_t MPU6050_ReadReg(uint8_t RegAddress)
  7. {
  8. uint8_t Data;
  9. MyI2C_Start(); //开始时序
  10. MyI2C_SendByte(MPU6050_ADDRESS); //发送从机地址且低位最后一位为0表进行写操作
  11. while(MyI2C_ReceiveAck() != 0); //从机是否发送应答位(0为应答,1为非应答)
  12. MyI2C_SendByte(RegAddress); //发送指定写入的寄存器地址
  13. while(MyI2C_ReceiveAck() != 0); //...
  14. MyI2C_Start(); //重新开始时序
  15. MyI2C_SendByte(MPU6050_ADDRESS | 0x01); //发送从机地址且低位最后一位为1表进行读操作
  16. while(MyI2C_ReceiveAck() != 0); //...
  17. Data = MyI2C_ReceiveByte(); //读取指定地址的数据并赋值给Data变量
  18. MyI2C_SendAck(1); //主机发送应答位(0为应答,即继续读取;1为非应答,即收回总线的控制权)
  19. MyI2C_Stop(); //结束时序
  20. return Data; //返回读取的数据
  21. }

3. 获取MPU6050芯片的相关数据(3轴加速度计+3轴陀螺仪传感器):

  1. /**
  2. * @brief MPU6050_GetData---获取MPU6050芯片的相关数据,包括3轴加速度计
  3. (Accelerometer):测量X、Y、Z轴的加速度以及3轴陀螺仪传感器
  4. (Gyroscope):测量X、Y、Z轴的角速度
  5. * @param *AccX---X轴的加速度
  6. * @param *AccY---Y轴的加速度
  7. * @param *AccZ---Z轴的加速度
  8. * @param *GyroX---X轴的角速度
  9. * @param *GyroY---Y轴的角速度
  10. * @param *GyroZ---Z轴的角速度
  11. * @retval 无
  12. */
  13. void MPU6050_GetData(int16_t *AccX, int16_t *AccY, int16_t *AccZ,
  14. int16_t *GyroX, int16_t *GyroY, int16_t *GyroZ)
  15. {
  16. uint8_t DataH, DataL;
  17. DataH = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_H);
  18. DataL = MPU6050_ReadReg(MPU6050_ACCEL_XOUT_L);
  19. *AccX = (DataH << 8) | DataL;
  20. DataH = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_H);
  21. DataL = MPU6050_ReadReg(MPU6050_ACCEL_YOUT_L);
  22. *AccY = (DataH << 8) | DataL;
  23. DataH = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_H);
  24. DataL = MPU6050_ReadReg(MPU6050_ACCEL_ZOUT_L);
  25. *AccZ = (DataH << 8) | DataL;
  26. DataH = MPU6050_ReadReg(MPU6050_GYRO_XOUT_H);
  27. DataL = MPU6050_ReadReg(MPU6050_GYRO_XOUT_L);
  28. *GyroX = (DataH << 8) | DataL;
  29. DataH = MPU6050_ReadReg(MPU6050_GYRO_YOUT_H);
  30. DataL = MPU6050_ReadReg(MPU6050_GYRO_YOUT_L);
  31. *GyroY = (DataH << 8) | DataL;
  32. DataH = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_H);
  33. DataL = MPU6050_ReadReg(MPU6050_GYRO_ZOUT_L);
  34. *GyroZ = (DataH << 8) | DataL;
  35. }

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

闽ICP备14008679号