查看: 1132|回复: 1
打印 上一主题 下一主题

MPU6050原始数据的获取

[复制链接]
跳转到指定楼层
沙发
发表于 2018-7-25 08:08:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Arduino IIC小应用

     IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。这种方式简化了信号传输总线接口。

      IIC总线一共有四根线,分别是VCC,GND,SCL,SDA。SCL的为时钟线,SDA为数据线。

      I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。


       IIC发送数据是8位数据(即8个0或1)为一个小单元一起发送。整个协议发送的顺序如下:
     
   
    主发从收:主机发送  START 信号-> 主机发送地址 -> 从机发送ACK应答 -> (主机发送数据 -> 从机发送ACK应答 (循环)) -> 主机发送STOP信号 或 主机发送 START 信号启动下一次传输
    主收从发:主机发送 START 信号-> 从机发送发地址 -> 主机发送ACK应答 -> (从机发送数据 -> 主机发送ACK应答 (循环)) -> 接受至最后一个字节时,主机发送NACK -> 主机发送 STOP 信号或 主机发送START信号 启动下一次传输 。


MPU6050数据在寄存器中的地址:


0x3B,加速度计的X轴分量高八位
0x3C,加速度计的X轴分量低八位
0x3D,加速度计的Y轴分量高八位
0x3E,加速度计的Y轴分量低八位
0x3F,加速度计的Z轴分量高八位
0x40,加速度计的Z轴分量高八位
0x41,当前温度TEMP高八位
0x42,当前温度TEMP低八位
0x43,绕X轴旋转的角速度高八位
0x44,绕X轴旋转的角速度低八位
0x45,绕Y轴旋转的角速度高八位
0x46,绕Y轴旋转的角速度低八位
0x47,绕Z轴旋转的角速度高八位
0x48,绕Z轴旋转的角速度低八位



接线方式
  
       MPU6050                          Arduino uno

         VCC              ——             3.3V/5V
         GND              ——             GND
         SCL              ——             SCL
         SDA              ——             SDA


以下是在ARDUINO上面具体实现代码   
在Arduino ide 1.81版本编译通过



回复

使用道具 举报

板凳
 楼主| 发表于 2018-7-25 08:09:07 | 只看该作者
本帖最后由 贾想 于 2018-7-25 08:17 编辑
  1. #include <Wire.h>
  2. #define ACCEL_XOUT_H 0x3B
  3. #define ACCEL_XOUT_L 0x3C
  4. #define ACCEL_YOUT_H 0x3D
  5. #define ACCEL_YOUT_L 0x3E
  6. #define ACCEL_ZOUT_H 0x3F
  7. #define ACCEL_ZOUT_L 0x40

  8. #define TEMP_OUT_H 0x41
  9. #define TEMP_OUT_L 0x42

  10. #define GYRO_XOUT_H 0x43
  11. #define GYRO_XOUT_L 0x44
  12. #define GYRO_YOUT_H 0x45
  13. #define GYRO_YOUT_L 0x46
  14. #define GYRO_ZOUT_H 0x47
  15. #define GYRO_ZOUT_L 0x48

  16. unsigned char DATA_H, DATA_L;
  17. //float ax,ay,az,gx,gy,gz,temp;
  18. void setup() {

  19. Wire.begin();
  20. Serial.begin(9600);
  21. delay(10);
  22. MPU6050Reset();

  23. }



  24. void loop() {
  25. mpu6050_TEMP_OUT_data();
  26. mpu6050_ACCEL_X_data();
  27. mpu6050_ACCEL_Y_data();
  28. mpu6050_ACCEL_Z_data();
  29. mpu6050_GYRO_X_data();
  30. mpu6050_GYRO_Y_data();
  31. mpu6050_GYRO_Z_data() ;



  32. Serial.print(" ACCEL_X "); Serial.print(mpu6050_ACCEL_X_data()); Serial.print(",");
  33. Serial.print(" ACCEL_Y "); Serial.print(mpu6050_ACCEL_Y_data()); Serial.print(",");
  34. Serial.print(" ACCEL_Z "); Serial.print(mpu6050_ACCEL_Z_data()); Serial.print(",");
  35. Serial.print(" GYRO_X "); Serial.print(mpu6050_GYRO_X_data()); Serial.print(",");
  36. Serial.print(" GYRO_Y "); Serial.print(mpu6050_GYRO_Y_data()); Serial.print(",");
  37. Serial.print(" GYRO_Z "); Serial.print(mpu6050_GYRO_Z_data()); Serial.print(",");
  38. Serial.print(" TEMP_OUT ");Serial.print(mpu6050_TEMP_OUT_data());
  39. Serial.println();




  40. }




  41. void MPU6050Write(unsigned char adr, unsigned char dat)
  42. {

  43. Wire.beginTransmission(0x68); //开启MPU6050的传输
  44. Wire.write(adr); //指定寄存器地址
  45. Wire.write(dat); //写入一个字节的数据
  46. Wire.endTransmission(true); //结束传输,true表示释放总线
  47. }
  48. void MPU6050Reset()
  49. {
  50. MPU6050Write(0x6B, 0x00);
  51. MPU6050Write(0x19, 0x07);
  52. MPU6050Write(0x1A, 0x06);
  53. MPU6050Write(0x1B, 0x18); //2000
  54. MPU6050Write(0x1C, 0x10); //4g

  55. }

  56. unsigned char ReadMPUReg(int nReg) {
  57. Wire.beginTransmission(0x68);
  58. Wire.write(nReg);
  59. Wire.requestFrom(0x68, 1, true);
  60. Wire.endTransmission(true);
  61. return Wire.read();
  62. }

  63. //读 加速度计X轴 数据
  64. int mpu6050_ACCEL_X_data()
  65. {
  66. DATA_H = ReadMPUReg(ACCEL_XOUT_H);
  67. DATA_L = ReadMPUReg(ACCEL_XOUT_L);

  68. return (DATA_H << 8) + DATA_L;

  69. }
  70. //读 加速度计Y轴 数据
  71. int mpu6050_ACCEL_Y_data()
  72. {
  73. DATA_H = ReadMPUReg(ACCEL_YOUT_H);
  74. DATA_L = ReadMPUReg(ACCEL_YOUT_L);
  75. return (DATA_H << 8) + DATA_L;
  76. }
  77. //读 加速度计Z轴 数据
  78. int mpu6050_ACCEL_Z_data()
  79. {
  80. DATA_H = ReadMPUReg(ACCEL_ZOUT_H);
  81. DATA_L = ReadMPUReg(ACCEL_ZOUT_L);
  82. return (DATA_H << 8) + DATA_L;
  83. }
  84. //读 陀螺仪计X轴 数据
  85. int mpu6050_GYRO_X_data()
  86. {
  87. DATA_H = ReadMPUReg(GYRO_XOUT_H);
  88. DATA_L = ReadMPUReg(GYRO_XOUT_L);
  89. return (DATA_H << 8) + DATA_L;
  90. }
  91. //读 陀螺仪计Y轴 数据
  92. int mpu6050_GYRO_Y_data()
  93. {
  94. DATA_H = ReadMPUReg(GYRO_YOUT_H);
  95. DATA_L = ReadMPUReg(GYRO_YOUT_L);
  96. return (DATA_H << 8) + DATA_L;
  97. }
  98. //读 陀螺仪计Z轴 数据
  99. int mpu6050_GYRO_Z_data()
  100. {
  101. DATA_H = ReadMPUReg(GYRO_ZOUT_H);
  102. DATA_L = ReadMPUReg(GYRO_ZOUT_L);
  103. return (DATA_H << 8) + DATA_L;
  104. }
  105. //读 温度 数据
  106. int mpu6050_TEMP_OUT_data()
  107. {
  108. DATA_H = ReadMPUReg(TEMP_OUT_H);
  109. DATA_L = ReadMPUReg(TEMP_OUT_L);
  110. return (DATA_H << 8) + DATA_L;
  111. }



  112. //by Sunlife
复制代码

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表