nrf52832用I2C驅動陀螺儀MPU6050
阿新 • • 發佈:2019-02-02
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, ®ister_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; }