中科因仑“3+1”工程特种兵精英论坛
标题: MPU6050原始数据的获取 [打印本页]
作者: 贾想 时间: 2018-7-25 08:08
标题: MPU6050原始数据的获取
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
本帖最后由 贾想 于 2018-7-25 08:17 编辑
- #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
- }
- 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
复制代码
欢迎光临 中科因仑“3+1”工程特种兵精英论坛 (http://bbs.enlern.com/) |
Powered by Discuz! X3.4 |