Esempio n. 1
0
static int mpu6050_reset(struct mpu6050_data *data)
{
	unsigned char val = 0;
	int error;

	error = MPU6050_READ(data, MPU6050_CHIP_I2C_ADDR,
			MPU6050_REG_PWR_MGMT_1,	1, &val, "Reset");
	if (error) {
		dev_err(data->dev, "fail to read PWR_MGMT_1 reg\n");
		return error;
	}

	/* Reset sequence */
	val |= MPU6050_DEVICE_RESET;
	error = MPU6050_WRITE(data, MPU6050_CHIP_I2C_ADDR,
			MPU6050_REG_PWR_MGMT_1,	val, "Reset");
	if (error) {
		dev_err(data->dev, "fail to set reset bit\n");
		return error;
	}

	error = MPU6050_READ(data, MPU6050_CHIP_I2C_ADDR,
			MPU6050_REG_PWR_MGMT_1, 1, &val, "Reset");
	if (error) {
		dev_err(data->dev, "fail to read PWR_MGMT_1 reg\n");
		return error;
	}

	if (val & MPU6050_DEVICE_RESET) {
		dev_err(data->dev, "Reset failed\n");
		return val;
	}

	/*
	 * Reset of PWR_MGMT_1 reg puts the device in sleep mode,
	 * so disable the sleep mode
	 */
	mpu6050_enable_sleep(data, 0);

	return 0;
}
Esempio n. 2
0
static int mpu6050_enable_sleep(struct mpu6050_data *data, int action)
{
	unsigned char val = 0;

	MPU6050_READ(data, MPU6050_CHIP_I2C_ADDR,
			MPU6050_REG_PWR_MGMT_1, 1, &val, "Enable Sleep");
	if (action)
		val |= MPU6050_DEVICE_SLEEP_MODE;
	else
		val &= ~MPU6050_DEVICE_SLEEP_MODE;

	MPU6050_WRITE(data, MPU6050_CHIP_I2C_ADDR,
			MPU6050_REG_PWR_MGMT_1,	val, "Enable Sleep");

	MPU6050_READ(data, MPU6050_CHIP_I2C_ADDR,
			MPU6050_REG_PWR_MGMT_1, 1, &val, "Enable Sleep");

	if (val & MPU6050_DEVICE_SLEEP_MODE)
		dev_err(data->dev, "Enable Sleep failed\n");
	return 0;
}
Esempio n. 3
0
static ssize_t mpu6050_registers_show(struct device *dev,
			      struct device_attribute *attr, char *buf)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct mpu6050_data *data = platform_get_drvdata(pdev);
	unsigned i, n, reg_count;
	uint8_t value;

	reg_count = sizeof(mpu6050_regs) / sizeof(mpu6050_regs[0]);
	for (i = 0, n = 0; i < reg_count; i++) {
		MPU6050_READ(data, MPU6050_CHIP_I2C_ADDR,
			mpu6050_regs[i].reg, 1, &value, mpu6050_regs[i].name);
		n += scnprintf(buf + n, PAGE_SIZE - n,
			       "%-20s = 0x%02X\n",
			       mpu6050_regs[i].name, value);
	}

	return n;
}
Esempio n. 4
0
//*****TIM2中断函数2ms*****//
void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)//检测TIM2溢出中断是否发生
	{
		TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
		
		time2_tick++;
		time2_tick = time2_tick%1000;//2HZ
		
		//LED0(ON);
		//START////////////////////数据读取+姿态解算+PID控制 1.4ms////////////////////////////
		
		MPU6050_READ();//读取
	
		acc[0] = MPU6050_ACC_LAST.X;
		acc[1] = MPU6050_ACC_LAST.Y;
		acc[2] = MPU6050_ACC_LAST.Z;
		
		gyro[0] = MPU6050_GYRO_LAST.X - GYRO_OFFSET.X;
		gyro[1] = -(MPU6050_GYRO_LAST.Y - GYRO_OFFSET.Y);
		gyro[2] = MPU6050_GYRO_LAST.Z - GYRO_OFFSET.Z;
		if(gyro[2]>=-5 &&gyro[2]<=5) gyro[2] = 0;//Z轴陀螺仪,漂移处理
		
		//printf("%d,%d,%d",acc[0],acc[1],acc[2]);
		IMUupdate(gyro[0],gyro[1],gyro[2],acc[0],acc[1],acc[2],Vaule_2_Gyro());//非全姿态角解算
		//IMUupdate1(number_to_dps1(gyro[0]),number_to_dps1(gyro[1]),number_to_dps1(gyro[2]),acc[0],acc[1],acc[2]);
		//IMUupdate2(number_to_dps1(gyro[0]),number_to_dps1(gyro[1]),number_to_dps1(gyro[2]),acc[0],acc[1],acc[2]);
		
		CONTROL(Q_ANGLE.ROLL,Q_ANGLE.PITCH,Q_ANGLE.YAW,Value_2_Thr(),Value_2_Roll(),Value_2_Pitch(),Vaule_2_Gyro());//对电机进行PID控制
		
		//CONTROL1(Q_ANGLE.ROLL,Q_ANGLE.PITCH,Q_ANGLE.YAW,Value_2_Thr(),Value_2_Roll(),Value_2_Pitch(),Vaule_2_Gyro(), acc, gyro);
		
		//END///////////////////////////////////////////////////////////////////////
		//LED0(OFF);
		
		
		if(time2_tick%5 == 0)//10ms  --  100HZ进行一次
		{
			
		}
		
		if(time2_tick%25 == 0)//50ms	--	20HZ进行一次
		{
			DMA_DATA_SEND_FLAG = 1;//上传数据
		}
		if(time2_tick%50 == 0)//100ms  --  10HZ进行一次
		{
			
		}
		if(time2_tick%500 == 0)//1000ms  --  1HZ进行一次
		{
			if(ARMED == 1)
			{
				Is_DisArmed(RC_CH[3-1],RC_CH[4-1]);//是否加锁
			}
			else
			{
				Is_Armed(RC_CH[3-1],RC_CH[4-1]);//是否解锁
			}
		}
		
		time2_led++;
		if(time2_led>=1000)  time2_led=time2_led-1000;
	//	time2_led = time2_led%1000;//2ms一个周期

		switch(led_state)
		{
				case 0:Led_Flash0();break;
				case 1:Led_Flash1();break;
				case 2:Led_Flash2();break;
				case 3:Led_Flash3();break;
		}
		
		
	}		
}
Esempio n. 5
0
void System_Time_Init(void)
{
	MPU6050_READ();//读取
	Get_Accel_Angle(MPU6050_ACC_LAST.X,MPU6050_ACC_LAST.Y,MPU6050_ACC_LAST.Z,&Q_ANGLE.ROLL,&Q_ANGLE.PITCH);//加速度算出的角度为初始角度
	TIM2_Config();
}
Esempio n. 6
0
static int mpu6050_set_bypass_mode(struct mpu6050_data *data)
{
	int error;
	unsigned char val = 0;

	error = MPU6050_READ(data, MPU6050_CHIP_I2C_ADDR,
				MPU6050_REG_I2C_MST_STATUS,
				1, &val, "Pass Through");
	if (error) {
		dev_err(data->dev,
			"MPU6050: fail to read MST_STATUS register\n");
		return error;
	}
	val |= MPU6050_PASS_THROUGH;
	error = MPU6050_WRITE(data, MPU6050_CHIP_I2C_ADDR,
				MPU6050_REG_I2C_MST_STATUS,
				val, "Pass Through");
	if (error) {
		dev_err(data->dev,
			"MPU6050: fail to set pass through\n");
		return error;
	}

	/* Bypass Enable Configuration */
	error = MPU6050_READ(data, MPU6050_CHIP_I2C_ADDR,
				MPU6050_REG_INT_PIN_CFG,
				1, &val, "Bypass enabled");
	if (error) {
		dev_err(data->dev,
			"MPU6050: fail to read INT_PIN_CFG register\n");
		return error;
	}

	val |= MPU6050_I2C_BYPASS_EN;
	error = MPU6050_WRITE(data, MPU6050_CHIP_I2C_ADDR,
				MPU6050_REG_INT_PIN_CFG,
				val, "Bypass enabled");
	if (error) {
		dev_err(data->dev,
			"MPU6050: fail to set i2c bypass mode\n");
		return error;
	}
	error = MPU6050_READ(data, MPU6050_CHIP_I2C_ADDR,
				MPU6050_REG_USER_CTRL,
				1, &val, "I2C MST mode");
	if (error) {
		dev_err(data->dev,
			"MPU6050: fail to read USER_CTRL register\n");
		return error;
	}
	val &= ~MPU6050_I2C_MST_EN;
	error = MPU6050_WRITE(data, MPU6050_CHIP_I2C_ADDR,
				MPU6050_REG_USER_CTRL,
				val, "I2C MST mode");
	if (error) {
		dev_err(data->dev,
			"MPU6050: fail to set i2c master enable bit\n");
		return error;
	}

	return 0;
}