Esempio n. 1
0
/**************************实现函数********************************************
*函数原型:		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);	
}
Esempio n. 2
0
/**************************实现函数********************************************
*函数原型:		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);
}
Esempio n. 3
0
 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++;		
	}
}	
Esempio n. 4
0
/*
*********************************************************************************************************
*	函 数 名: 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];
}