我是靠谱客的博主 平淡豆芽,最近开发中收集的这篇文章主要介绍MPU6050原始数据的获取,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

MPU6050采用IIC通讯,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版本编译通过


  
#include <Wire.h>

#define
ACCEL_XOUT_H
0x3B
#define
ACCEL_XOUT_L
0x3C
#define
ACCEL_YOUT_H
0x3D
#define
ACCEL_YOUT_L
0x3E
#define
ACCEL_ZOUT_H
0x3F
#define
ACCEL_ZOUT_L
0x40
#define
TEMP_OUT_H
0x41
#define
TEMP_OUT_L
0x42
#define
GYRO_XOUT_H
0x43
#define
GYRO_XOUT_L
0x44
#define
GYRO_YOUT_H
0x45
#define
GYRO_YOUT_L
0x46
#define
GYRO_ZOUT_H
0x47
#define
GYRO_ZOUT_L
0x48
unsigned char
DATA_H, DATA_L;
//float ax,ay,az,gx,gy,gz,temp;
void setup() {
Wire.begin();
Serial.begin(9600);
delay(10);
MPU6050Reset();
}
void loop() {
mpu6050_TEMP_OUT_data();
mpu6050_ACCEL_X_data();
mpu6050_ACCEL_Y_data();
mpu6050_ACCEL_Z_data();
mpu6050_GYRO_X_data();
mpu6050_GYRO_Y_data();
mpu6050_GYRO_Z_data() ;
Serial.print("
ACCEL_X
"); Serial.print(mpu6050_ACCEL_X_data()); Serial.print(",");
Serial.print("
ACCEL_Y
"); Serial.print(mpu6050_ACCEL_Y_data()); Serial.print(",");
Serial.print("
ACCEL_Z
"); Serial.print(mpu6050_ACCEL_Z_data()); Serial.print(",");
Serial.print("
GYRO_X
"); Serial.print(mpu6050_GYRO_X_data()); Serial.print(",");
Serial.print("
GYRO_Y
"); Serial.print(mpu6050_GYRO_Y_data()); Serial.print(",");
Serial.print("
GYRO_Z
"); Serial.print(mpu6050_GYRO_Z_data()); Serial.print(",");
Serial.print("
TEMP_OUT
");Serial.print(mpu6050_TEMP_OUT_data());
Serial.println();
}
void MPU6050Write(unsigned char adr, unsigned char dat)
{
Wire.beginTransmission(0x68); //开启MPU6050的传输
Wire.write(adr); //指定寄存器地址
Wire.write(dat); //写入一个字节的数据
Wire.endTransmission(true); //结束传输,true表示释放总线
}
void MPU6050Reset()
{
MPU6050Write(0x6B, 0x00);
MPU6050Write(0x19, 0x07);
MPU6050Write(0x1A, 0x06);
MPU6050Write(0x1B, 0x18); //2000
MPU6050Write(0x1C, 0x10); //4g
/*寄存器的设置参考此文章http://blog.sina.com.cn/s/blog_8240cbef01018i10.html
*/
}
unsigned char ReadMPUReg(int nReg) {
Wire.beginTransmission(0x68);
Wire.write(nReg);
Wire.requestFrom(0x68, 1, true);
Wire.endTransmission(true);
return Wire.read();
}
//读 加速度计X轴 数据
int mpu6050_ACCEL_X_data()
{
DATA_H = ReadMPUReg(ACCEL_XOUT_H);
DATA_L = ReadMPUReg(ACCEL_XOUT_L);
return (DATA_H << 8) + DATA_L;
}
//读 加速度计Y轴 数据
int mpu6050_ACCEL_Y_data()
{
DATA_H = ReadMPUReg(ACCEL_YOUT_H);
DATA_L = ReadMPUReg(ACCEL_YOUT_L);
return (DATA_H << 8) + DATA_L;
}
//读 加速度计Z轴 数据
int mpu6050_ACCEL_Z_data()
{
DATA_H = ReadMPUReg(ACCEL_ZOUT_H);
DATA_L = ReadMPUReg(ACCEL_ZOUT_L);
return (DATA_H << 8) + DATA_L;
}
//读 陀螺仪计X轴 数据
int mpu6050_GYRO_X_data()
{
DATA_H = ReadMPUReg(GYRO_XOUT_H);
DATA_L = ReadMPUReg(GYRO_XOUT_L);
return (DATA_H << 8) + DATA_L;
}
//读 陀螺仪计Y轴 数据
int mpu6050_GYRO_Y_data()
{
DATA_H = ReadMPUReg(GYRO_YOUT_H);
DATA_L = ReadMPUReg(GYRO_YOUT_L);
return (DATA_H << 8) + DATA_L;
}
//读 陀螺仪计Z轴 数据
int mpu6050_GYRO_Z_data()
{
DATA_H = ReadMPUReg(GYRO_ZOUT_H);
DATA_L = ReadMPUReg(GYRO_ZOUT_L);
return (DATA_H << 8) + DATA_L;
}
//读 温度 数据
int mpu6050_TEMP_OUT_data()
{
DATA_H = ReadMPUReg(TEMP_OUT_H);
DATA_L = ReadMPUReg(TEMP_OUT_L);
return (DATA_H << 8) + DATA_L;
}
//by Sunlife

在ide里面选择串口监视器可以看见数据

波特率设为9600


最后

以上就是平淡豆芽为你收集整理的MPU6050原始数据的获取的全部内容,希望文章能够帮你解决MPU6050原始数据的获取所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部