/**************************实现函数******************************************** *函数原型: void MPU6050_setI2CMasterModeEnabled(uint8_t enabled) *功 能: 设置 MPU6050 是否为AUX I2C线的主机 *******************************************************************************/ void MPU6050_setI2CMasterModeEnabled(void) { uint8_t data = 0; data = MPU6050_ReadByte(MPU6050_Addr,MPU6050_RA_USER_CTRL); data = data & 0XDF; MPU6050_WriteByte(MPU6050_Addr,MPU6050_RA_USER_CTRL,data); }
/**************************实现函数******************************************** *函数原型: void MPU6050_setI2CBypassEnabled(uint8_t enabled) *功 能: 设置 MPU6050 是否为AUX I2C线的主机 *******************************************************************************/ void MPU6050_setI2CBypassEnabled(void) { uint8_t data = 0; data = MPU6050_ReadByte(MPU6050_Addr,MPU6050_RA_INT_PIN_CFG); data = data | 0X02; MPU6050_WriteByte(MPU6050_Addr,MPU6050_RA_USER_CTRL,data); }
void MPU6050_Read(MPU6050_DATA *sensor_data) { // 温度 mpu6050_buffer[0] = MPU6050_ReadByte(MPU6050_Addr, TEMP_OUT_L); mpu6050_buffer[1] = MPU6050_ReadByte(MPU6050_Addr, TEMP_OUT_H); Temperature = (mpu6050_buffer[1] << 8) | mpu6050_buffer[0]; //16位数据 // 陀螺仪 mpu6050_buffer[2] = MPU6050_ReadByte(MPU6050_Addr, GYRO_XOUT_L); mpu6050_buffer[3] = MPU6050_ReadByte(MPU6050_Addr, GYRO_XOUT_H); sensor_data->gx = (mpu6050_buffer[3] << 8) | mpu6050_buffer[2]; sensor_data->gx -= MPU6050_OFFSER.gx ;// mpu6050_buffer[4] = MPU6050_ReadByte(MPU6050_Addr, GYRO_YOUT_L); mpu6050_buffer[5] = MPU6050_ReadByte(MPU6050_Addr, GYRO_YOUT_H); sensor_data->gy = (mpu6050_buffer[5] << 8) | mpu6050_buffer[4]; sensor_data->gy -= MPU6050_OFFSER.gy;// mpu6050_buffer[6] = MPU6050_ReadByte(MPU6050_Addr, GYRO_ZOUT_L); mpu6050_buffer[7] = MPU6050_ReadByte(MPU6050_Addr, GYRO_ZOUT_H); sensor_data->gz = (mpu6050_buffer[7] << 8) | mpu6050_buffer[6]; sensor_data->gz -= MPU6050_OFFSER.gz;// // 加速度计 mpu6050_buffer[8] = MPU6050_ReadByte(MPU6050_Addr, ACCEL_XOUT_L); mpu6050_buffer[9] = MPU6050_ReadByte(MPU6050_Addr, ACCEL_XOUT_H); sensor_data->ax = (mpu6050_buffer[9] << 8) | mpu6050_buffer[8]; sensor_data->ax -= MPU6050_OFFSER.ax;// mpu6050_buffer[10] = MPU6050_ReadByte(MPU6050_Addr, ACCEL_YOUT_L); mpu6050_buffer[11] = MPU6050_ReadByte(MPU6050_Addr, ACCEL_YOUT_H); sensor_data->ay = (mpu6050_buffer[11] << 8) | mpu6050_buffer[10]; sensor_data->ay -= MPU6050_OFFSER.ay;// mpu6050_buffer[12]=MPU6050_ReadByte(MPU6050_Addr, ACCEL_ZOUT_L); mpu6050_buffer[13]=MPU6050_ReadByte(MPU6050_Addr, ACCEL_ZOUT_H); sensor_data->az = (mpu6050_buffer[13] << 8) | mpu6050_buffer[10]; sensor_data->az -= MPU6050_OFFSER.az;// /******去除零漂*********/ if(GYRO_OFFSET_OK) { static int32_t tempgx=0,tempgy=0,tempgz=0; static uint8_t cnt_g=0; static int i = 0; if(cnt_g==0) { MPU6050_OFFSER.gx=0; MPU6050_OFFSER.gy=0; MPU6050_OFFSER.gz=0; tempgx = 0; tempgy = 0; tempgz = 0; cnt_g = 1; return; } tempgx+= sensor_data->gx; tempgy+= sensor_data->gy; tempgz+= sensor_data->gz; if(cnt_g==200) { MPU6050_OFFSER.gx = tempgx/cnt_g;//49 MPU6050_OFFSER.gy = tempgy/cnt_g;//14 MPU6050_OFFSER.gz = tempgz/cnt_g;//-10 cnt_g = 0; GYRO_OFFSET_OK = 0; EE_SAVE_GYRO_OFFSET();//保存数据 for(i=0;i<3;i++) {all_ON(); delay_ms(300);all_OFF();delay_ms(300);} return; } cnt_g++; } if(ACC_OFFSET_OK) { static int32_t tempax=0,tempay=0,tempaz=0; static uint8_t cnt_a=0; static int i =0; if(cnt_a==0) { MPU6050_OFFSER.ax = 0; MPU6050_OFFSER.ay = 0; MPU6050_OFFSER.az = 0; tempax = 0; tempay = 0; tempaz = 0; cnt_a = 1; return; } tempax+= sensor_data->ax; tempay+= sensor_data->ay; tempaz+= (sensor_data->az - 16384); if(cnt_a==200) { MPU6050_OFFSER.ax = tempax/cnt_a; MPU6050_OFFSER.ay = tempay/cnt_a; MPU6050_OFFSER.az = tempaz/cnt_a; cnt_a = 0; ACC_OFFSET_OK = 0; EE_SAVE_ACC_OFFSET();//保存数据 for(i=0;i<3;i++) {all_ON(); delay_ms(300);all_OFF();delay_ms(300);} return; } cnt_a++; } }
/* ********************************************************************************************************* * 函 数 名: MPU6050_ReadData * 功能说明: 读取 MPU-6050 数据寄存器, 结果保存在全局变量 g_tMPU6050. 主程序可以定时调用该程序刷新数据 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ void MPU6050_ReadData(void) { uint8_t ucReadBuf[14]; uint8_t i; uint8_t ack; #if 1 /* 连续读 */ i2c_Start(); /* 总线开始信号 */ i2c_SendByte(MPU6050_SLAVE_ADDRESS); /* 发送设备地址+写信号 */ ack = i2c_WaitAck(); if (ack != 0) { i2c_Stop(); return; } i2c_SendByte(ACCEL_XOUT_H); /* 发送存储单元地址 */ ack = i2c_WaitAck(); if (ack != 0) { i2c_Stop(); return; } i2c_Start(); /* 总线开始信号 */ i2c_SendByte(MPU6050_SLAVE_ADDRESS + 1); /* 发送设备地址+读信号 */ ack = i2c_WaitAck(); if (ack != 0) { i2c_Stop(); return; } for (i = 0; i < 13; i++) { ucReadBuf[i] = i2c_ReadByte(); /* 读出寄存器数据 */ i2c_Ack(); } /* 读最后一个字节,时给 NAck */ ucReadBuf[13] = i2c_ReadByte(); i2c_NAck(); i2c_Stop(); /* 总线停止信号 */ #else /* 单字节读 */ for (i = 0 ; i < 14; i++) { ucReadBuf[i] = MPU6050_ReadByte(ACCEL_XOUT_H + i); } #endif /* 将读出的数据保存到全局结构体变量 */ g_tMPU6050.Accel_X = (ucReadBuf[0] << 8) + ucReadBuf[1]; g_tMPU6050.Accel_Y = (ucReadBuf[2] << 8) + ucReadBuf[3]; g_tMPU6050.Accel_Z = (ucReadBuf[4] << 8) + ucReadBuf[5]; g_tMPU6050.Temp = (int16_t)((ucReadBuf[6] << 8) + ucReadBuf[7]); g_tMPU6050.GYRO_X = (ucReadBuf[8] << 8) + ucReadBuf[9]; g_tMPU6050.GYRO_Y = (ucReadBuf[10] << 8) + ucReadBuf[11]; g_tMPU6050.GYRO_Z = (ucReadBuf[12] << 8) + ucReadBuf[13]; }