1. 程式人生 > >nrf52832用I2C驅動陀螺儀MPU6050

nrf52832用I2C驅動陀螺儀MPU6050

       MPU-6050的角速度全格感測範圍為±250、±500、±1000與±2000°/sec (dps),可準確追蹤快速與慢速動作,並且,使用者可程式控制的加速器全格感測範圍為±2g、±4g±8g與±16g。產品傳輸可透過最高至400kHz的IIC。MPU-6050可在不同電壓下工作,VDD供電電壓介為2.5V±5%、3.0V±5%或3.3V±5%,邏輯介面VDDIO供電為1.8V± 5%(MPU6000僅用VDD)。MPU-6050的包裝尺寸4x4x0.9mm(QFN),在業界是革命性的尺寸。其他的特徵包含內建的溫度感測器、包含在運作環境中僅有±1%變動的振盪器。

        在很多領域均有應用,比如智手機 平板裝置,手持型遊戲產品,遊戲機,3D遙控器,可攜式導航裝置等等

簡單地說,6050就是一個i2c器件,就像一個微控制器,要使用它,你得了解暫存器,初始化,讀取,寫入等等。

下面展示部分初始化,讀取,寫入程式碼

bool mpu6050_init(uint8_t device_address)
{   
  bool transfer_succeeded = true;
	
	uint8_t inData[7]={0x00,									//0x19
								0x00,												//0x1A
								0x03,												//0x6B
								0x10,												//0x1B
								0x00,												//0x6A
								0x32,												//0x37
								0x01};											//0x38
	uint8_t acc = 0x00;							
								
  m_device_address = (uint8_t)(device_address << 1);

  // Do a reset on signal paths
  uint8_t reset_value = 0x04U | 0x02U | 0x01U; // Resets gyro, accelerometer and temperature sensor signal paths
  transfer_succeeded &= mpu6050_register_write(ADDRESS_SIGNAL_PATH_RESET, reset_value);
  
	
	//設定GYRO
	mpu6050_register_write(0x19 , inData[0]); //設定取樣率    -- SMPLRT_DIV = 0  Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV)
	mpu6050_register_write(0x1A , inData[1]); //CONFIG        -- EXT_SYNC_SET 0 (禁用晶振輸入腳) ; default DLPF_CFG = 0 => (低通濾波)ACC bandwidth = 260Hz  GYRO bandwidth = 256Hz)
	mpu6050_register_write(0x6B , inData[2]); //PWR_MGMT_1    -- SLEEP 0; CYCLE 0; TEMP_DIS 0; CLKSEL 3 (PLL with Z Gyro reference)
	mpu6050_register_write(0x1B , inData[3]); //gyro配置 量程  0-1000度每秒
	mpu6050_register_write(0x6A , inData[4]);	// 0x6A的 I2C_MST_EN  設定成0  預設為0 6050  使能主IIC 	
	// 0x37的 推輓輸出,高電平中斷,一直輸出高電平直到中斷清除,任何讀取操作都清除中斷 使能 pass through 功能 直接在6050 讀取5883資料
	mpu6050_register_write(0x37,  inData[5]);	
	mpu6050_register_write(0x38,  inData[6]); //使能data ready 引腳	
								
	//設定 ACC
  mpu6050_register_write(0x1C,acc);         //ACC設定  量程 +-2G s 		

								
  // Read and verify product ID
  transfer_succeeded &= mpu6050_verify_product_id();

  return transfer_succeeded;
}
bool mpu6050_register_write(uint8_t register_address, uint8_t value)
{
    uint8_t w2_data[2];

    w2_data[0] = register_address;
    w2_data[1] = value;
    return twi_master_transfer(m_device_address, w2_data, 2, TWI_ISSUE_STOP);
}

bool mpu6050_register_read(uint8_t register_address, uint8_t * destination, uint8_t number_of_bytes)
{
    bool transfer_succeeded;
    transfer_succeeded  = twi_master_transfer(m_device_address, &register_address, 1, TWI_DONT_ISSUE_STOP);
    transfer_succeeded &= twi_master_transfer(m_device_address|TWI_READ_BIT, destination, number_of_bytes, TWI_ISSUE_STOP);
    return transfer_succeeded;
}