Example #1
0
static void mwii_calibrate_mpu6050(void){
	// calibrate gyro offset
	int16_t ax, ay, az, gx, gy, gz; 
	
	mpu6050_setTCXGyroOffset(&_brd.mpu, 0); //14
	mpu6050_setTCYGyroOffset(&_brd.mpu, 0); //20
	mpu6050_setTCZGyroOffset(&_brd.mpu, 0); //-49
	mpu6050_setXGyroOffset(&_brd.mpu, 0); //14
	mpu6050_setYGyroOffset(&_brd.mpu, 0); //20
	mpu6050_setZGyroOffset(&_brd.mpu, 0); //-49
	
	int32_t aax = 0, aay= 0, aaz = 0, ggx = 0, ggy = 0, ggz = 0; 
	static const int iterations = 100; 
	for(int c = 0; c < iterations; c++){
		mpu6050_readRawAcc(&_brd.mpu, &ax, &ay, &az); 
		mpu6050_readRawGyr(&_brd.mpu, &gx, &gy, &gz); 
		aax += ax; aay += ay; aaz += az; 
		ggx += gx; ggy += gy; ggz += gz; 
		delay_us(10); 
	}
	brd->acc_bias_x = aax / iterations; 
	brd->acc_bias_y = aay / iterations; 
	brd->acc_bias_z = (aaz / iterations) + 16384; 
	
	mpu6050_setXGyroOffset(&_brd.mpu, -(int16_t)(ggx / iterations * 2) | 1); //14
	mpu6050_setYGyroOffset(&_brd.mpu, -(int16_t)(ggy / iterations * 2) | 1); //20
	mpu6050_setZGyroOffset(&_brd.mpu, -(int16_t)(ggz / iterations * 2) | 1); //-49
	
	// Construct the accelerometer biases for push to the hardware accelerometer bias registers. These registers contain
	// factory trim values which must be added to the calculated accelerometer biases; on boot up these registers will hold
	// non-zero values. In addition, bit 0 of the lower byte must be preserved since it is used for temperature
	// compensation calculations. Accelerometer bias registers expect bias input as 2048 LSB per g, so that
	// the accelerometer biases calculated above must be divided by 8.
	
	// Subtract calculated averaged accelerometer bias scaled to 2048 LSB/g (16 g full scale)
	// preserve temperature compensation bit when writing back to accelerometer bias registers
	//bias_x = (int16_t)(bias_x - (aax / iterations / 16384.0 * 2048)) | 1; 
	//bias_y = (int16_t)(bias_y - (aay / iterations / 16384.0 * 2048)) | 1; 
	//bias_z = (int16_t)(bias_z - (aaz / iterations / 16384.0 * 2048)) | 1; 
	
	//mpu6050_setXAccOffset(&_brd.mpu, -(int16_t)(bias_x)); 
	//mpu6050_setYAccOffset(&_brd.mpu, -(int16_t)(bias_y)); 
	//mpu6050_setZAccOffset(&_brd.mpu, -(int16_t)(aaz)); 
	
	/*mpu6050_setXAccOffset(&_brd.mpu, 0x0100); 
	mpu6050_setYAccOffset(&_brd.mpu, 0x0100); 
	mpu6050_setZAccOffset(&_brd.mpu, 0x0100); */
	
	//mpu6050_setXGyroOffset(&_brd.mpu, -15 * 2); //14
	//mpu6050_setYGyroOffset(&_brd.mpu, -20 * 2); //20
	//mpu6050_setZGyroOffset(&_brd.mpu, 54 * 2); //-49
	//mpu6050_setZAccOffset(&_brd.mpu, -20); // 15818
	/*
	mpu6050_getRawData(&_brd.mpu, &ax, &ay, &az, &gx, &gy, &gz); 
	
	mpu6050_setXGyroOffset(&_brd.mpu, gx); 
	mpu6050_setYGyroOffset(&_brd.mpu, gy); 
	mpu6050_setZGyroOffset(&_brd.mpu, gz); */
}
Example #2
0
void mwii_read_sensors(struct fc_data *data){
	data->flags = 0xffff; // all
	mpu6050_readRawAcc(&_brd.mpu, 
		&data->raw_acc.x, 
		&data->raw_acc.y, 
		&data->raw_acc.z); 
	mpu6050_convertAcc(&_brd.mpu, 
		data->raw_acc.x, 
		data->raw_acc.y, 
		data->raw_acc.z, 
		&data->acc_g.x, 
		&data->acc_g.y, 
		&data->acc_g.z
	); 
	mpu6050_readRawGyr(&_brd.mpu, 
		&data->raw_gyr.x, 
		&data->raw_gyr.y, 
		&data->raw_gyr.z
	); 
	mpu6050_convertGyr(&_brd.mpu, 
		data->raw_gyr.x, 
		data->raw_gyr.y, 
		data->raw_gyr.z, 
		&data->gyr_deg.x,
		&data->gyr_deg.y,
		&data->gyr_deg.z
	); 
	/*
	hmc5883l_readRawMag(&_brd.hmc, 
		&data->raw_mag.x, 
		&data->raw_mag.y, 
		&data->raw_mag.z
	); 
	hmc5883l_convertMag(&_brd.hmc, 
		data->raw_mag.x, 
		data->raw_mag.y, 
		data->raw_mag.z, 
		&data->mag.x, 
		&data->mag.y, 
		&data->mag.z
	); 
	*/
	int16_t sonar = hcsr04_read_distance_in_cm(&brd->hcsr); 
	data->atmospheric_altitude = bmp085_read_altitude(&brd->bmp); 
	data->sonar_altitude = (sonar > 0)?((float)sonar / 100.0):-1; 
	data->temperature = bmp085_read_temperature(&brd->bmp); 
	data->pressure = bmp085_read_pressure(&brd->bmp); 
	
	//data->vbat = (adc0_read_cached(2) / 65535.0);
}
Example #3
0
//**********************
// READING SENSOR DATA
//**********************
/// reads last measured acceleration in G
void mwii_read_acceleration_g(float *ax, float *ay, float *az){
	int16_t x, y, z; 
	mpu6050_readRawAcc(&_brd.mpu, &x, &y, &z); 
	mpu6050_convertAcc(&_brd.mpu, x, y, z, ax, ay, az); 
}