Untitled

 avatar
unknown
c_cpp
3 years ago
4.0 kB
5
Indexable
/*
    Fonksiyon isimlerini değiştirdikten sonra kod içerisinde isimleri değiştirmemişiz
    bunların değiştirilmesi gerekiyor.
*/

void MPU6050_ReadAccelData(MPU6050_TypeDef *mpu6050)
{

  uint8_t x_accel_high = i2c_read8RegisterByte(MPU6050_I2C_ADDR, MPU6050_ACCEL_XOUT_H);
  uint8_t x_accel_low = i2c_read8RegisterByte(MPU6050_I2C_ADDR, MPU6050_ACCEL_XOUT_L);

  uint8_t y_accel_high = i2c_read8RegisterByte(MPU6050_I2C_ADDR, MPU6050_ACCEL_YOUT_H);
  uint8_t y_accel_low = i2c_read8RegisterByte(MPU6050_I2C_ADDR, MPU6050_ACCEL_YOUT_L);

  uint8_t z_accel_high = i2c_read8RegisterByte(MPU6050_I2C_ADDR, MPU6050_ACCEL_ZOUT_H);
  uint8_t z_accel_low = i2c_read8RegisterByte(MPU6050_I2C_ADDR, MPU6050_ACCEL_ZOUT_L);

  mpu6050->accel_register_val[0] = (int16_t)(x_accel_high << 8 | x_accel_low);
  mpu6050->accel_register_val[1] = (int16_t)(y_accel_high << 8 | y_accel_low);
  mpu6050->accel_register_val[2] = (int16_t)(z_accel_high << 8 | z_accel_low);

  mpu6050->accel_data[0] = (float)(mpu6050->accel_register_val[0] / MPU6050_ACCEL_2G_SENS);
  mpu6050->accel_data[1] = (float)(mpu6050->accel_register_val[1] / MPU6050_ACCEL_2G_SENS);
  mpu6050->accel_data[2] = (float)(mpu6050->accel_register_val[2] / MPU6050_ACCEL_2G_SENS);
  
  mpu6050->accel_data[0] *= EARTH_GRAVITY;
  mpu6050->accel_data[1] *= EARTH_GRAVITY;
  mpu6050->accel_data[2] *= EARTH_GRAVITY;

  float accel_square = sqrt(pow(mpu6050->accel_data[0], 2) + pow(mpu6050->accel_data[1], 2) + pow(mpu6050->accel_data[2], 2));

  mpu6050->accel_data[0] = asin(mpu6050->accel_data[0] / accel_square) * SENSORS_RADS_TO_DPS;
  mpu6050->accel_data[1] = asin(mpu6050->accel_data[1] / accel_square) * SENSORS_RADS_TO_DPS;
  mpu6050->accel_data[2] = 0;
    
  /*    
    Kaibrasyon verilerin okunduktan sonra yanlış veriden çıkarttık 
    ve yanlış yerde çağırdık. Doğrusu bu şekilde olmalı çünkü bizim
    kalibrasyon değerlerinde topladığımız değer açı değerleriydi 
    register değerleri değil. Burada çağırmamızın sebebi ise açı değerleri
    27,28,29. satırlarda elde ediliyor o sebeple burada çağırdık. Kısacası
    kodu bu şekilde güncellemen gerekiyor. 
  */
  mpu6050->accel_data[0] -= mpu6050->accel_cal_val[0];
  mpu6050->accel_data[1] -= mpu6050->accel_cal_val[1];
}

void MPU6050_ReadGyroData(MPU6050_TypeDef *mpu6050)
{
  mpu6050->previous_time = mpu6050->current_time;
  mpu6050->current_time = millis();
  mpu6050->elapsed_time = (float)(mpu6050->current_time - mpu6050->previous_time);
  mpu6050->elapsed_time /= 1000;

  uint8_t x_gyro_high = i2c_read8RegisterByte(MPU6050_I2C_ADDR, MPU6050_GYRO_XOUT_H);
  uint8_t x_gyro_low = i2c_read8RegisterByte(MPU6050_I2C_ADDR, MPU6050_GYRO_XOUT_L);

  uint8_t y_gyro_high = i2c_read8RegisterByte(MPU6050_I2C_ADDR, MPU6050_GYRO_YOUT_H);
  uint8_t y_gyro_low = i2c_read8RegisterByte(MPU6050_I2C_ADDR, MPU6050_GYRO_YOUT_L);

  uint8_t z_gyro_high = i2c_read8RegisterByte(MPU6050_I2C_ADDR, MPU6050_GYRO_ZOUT_H);
  uint8_t z_gyro_low = i2c_read8RegisterByte(MPU6050_I2C_ADDR, MPU6050_GYRO_ZOUT_L);

  mpu6050->gyro_register_val[0] = (int16_t)(x_gyro_high << 8 | x_gyro_low);
  mpu6050->gyro_register_val[1] = (int16_t)(y_gyro_high << 8 | y_gyro_low);
  mpu6050->gyro_register_val[2] = (int16_t)(z_gyro_high << 8 | z_gyro_low);

  float period = 1 / mpu6050->elapsed_time;

  mpu6050->gyro_data[0] = (float)(((mpu6050->gyro_register_val[0] / MPU6050_GYRO_250_SENS) / period));
  mpu6050->gyro_data[1] = (float)(((mpu6050->gyro_register_val[1] / MPU6050_GYRO_250_SENS) / period));
  mpu6050->gyro_data[2] = (float)(((mpu6050->gyro_register_val[2] / MPU6050_GYRO_250_SENS) / period));
    
  /*    
    Accelerometer için yazılan her şey burada da geçerli. 
  */
  mpu6050->gyro_data[0] -= mpu6050->gyro_cal_val[0];
  mpu6050->gyro_data[1] -= mpu6050->gyro_cal_val[1];
  mpu6050->gyro_data[2] -= mpu6050->gyro_cal_val[2];
}
Editor is loading...