STC8H開發(七): I2C驅動MPU6050三軸加速度+三軸角速度檢測模組

目錄

MPU-6050

MPU-6050是InvenSense生產的六軸運動跟蹤晶片, 晶片尺寸4×4×0.9mm, QFN封裝. 整合了三軸陀螺儀, 三軸加速度計, 片內溫度感測器和數字運動處理器(DMP), 可以使用I2C介面外接三軸電子羅盤的輸入,提供完整的九軸運動融合輸出.

MPU-6050包含6個16位ADC, 3個用於陀螺儀輸出, 3個用於加速度計輸出. 用戶可以設置的陀螺儀滿量程範圍為±250,±500,±1000,±2000°/秒(dps), 可設置的加速度計滿量程範圍為±2g, ±4g, ±8g和±16g. 通訊使用 400kHz的 I2C介面或 1MHz的 SPI介面(SPI僅MPU-6000可用).

模組與STC8H的接線

市面上的模組, 一般是8個pin腳, 如果只是獲取6軸取樣和溫度, 與STC8H只需要連接4根線

    P32   -> SCL
    P33   -> SDA
    GND   -> GND
    3.3V  -> VCC

未連接的其它4個pin分別是

  • XDA和XCL: I2C主設備介面, 用於外接I2C從設備,
  • AD0: I2C從設備地址LSB
  • INT: 中斷輸出

模組與STC8H的通訊

I2C頻率最高為400KHz, STC8H的設置如下, 其中I2C功能復用選擇的是P32/P33, 如果換到其它復用腳需要相應調整

void I2C_Init(void)
{
    // 主節點模式
    I2C_SetWorkMode(I2C_WorkMode_Master);
    /**
     * I2C 時鐘 = SYSCLK / 2 / (__prescaler__ * 2 + 4)
     * MPU6050 works with i2c clock up to 400KHz
     * 
     * 44.2368 / 2 / (26 * 2 + 4) = 0.39 MHz
    */
    I2C_SetClockPrescaler(0x1A);
    // 復用口選擇
    I2C_SetPort(I2C_AlterPort_P32_P33);
    // 啟動 I2C
    I2C_SetEnabled(HAL_State_ON);
}

與MPU6050的通訊可以直接使用SDK中的I2C讀寫方法, 需要注意的幾點

  1. 一次性讀出的雙位元組結果, 如果直接轉uint16_t, 其高位元組和低位元組位置是相反的, 需要調換後再轉換
  2. 可以一次性讀出6軸+溫度數據
uint16_t swap(uint16_t num)
{
    return (num >> 8) | (num << 8);
}

void MPU6050_Write(uint8_t addr, uint8_t dat)
{
    I2C_Write(MPU6050_ADDR, addr, &dat, 1);
}

uint8_t MPU6050_Read(uint8_t addr)
{
    uint8_t ret;
    I2C_Read(MPU6050_ADDR, addr, &ret, 1);
    return ret;
}

// 讀取16位數據
uint16_t MPU6050_ReadInt(uint8_t addr)
{
    uint16_t ret;
    I2C_Read(MPU6050_ADDR, addr, (uint8_t *)&ret, 2);
    return swap(ret); // swap high/low bits for correct order
}

// 一次性讀取7個16位數據
void MPU6050_ReadAll(uint16_t *buf)
{
    uint8_t i;
    I2C_Read(MPU6050_ADDR, MPU6050_REG_ACCEL_XOUT_H, (uint8_t *)buf, 14);
    for (i = 0; i < 7; i++)
    {
        *(buf + i) = swap(*(buf + i));
    }
}

主要的暫存器設置

幾個可能會用到的暫存器說明

電源管理暫存器 0x6B 和 0x6C

這兩個暫存器控制了MPU6050的工作模式: 睡眠模式(Sleep), 節電模式(Cycle)和正常工作模式

  • 睡眠模式: 0x6B 的第六位置1開啟, 睡眠模式下可以通訊, 但是所有的檢測轉換都是停止的, 結果讀取的值都是0
  • 節電模式: 是一種睡眠和正常交替的模式, MPU6050每隔一段時間做一次檢測轉換, 其餘時間都處在睡眠狀態
    • 進入節電模式, 需要將sleep位置0, cycle位置1, 禁止溫度取樣位置1, STBY_XG, STBY_YG, STBY_ZG置1
    • 節點模式下的取樣頻率可以設置為 1.25Hz, 5Hz, 20Hz, 40Hz
  • 正常模式: 正常模式按設置進行正常的檢測和轉換

在 0x6C 中, 還可以指定六個檢測軸中的哪些軸暫停檢測

取樣速率暫存器 0x19

這個暫存器用於設置陀螺儀輸出速率分頻係數, 取樣速率通過陀螺儀輸出速率除以此暫存器的值產生:

取樣速率 = 陀螺儀輸出速率 / (1 + SMPLRT_DIV)

其中, 禁用DLPF(低通過濾)時陀螺儀輸出速率為8KHz(DLPF_CFG = 0 or 7), 當啟用DLPF時為1KHz.

配置暫存器 0x1A

這個暫存器用於設置外部幀同步(FSYNC)引腳取樣和數字陀螺儀和加速度計的低通濾波器(DLPF). 連接到FSYNC引腳的外部訊號可以通過配置EXT_SYNC_SET來取樣, FSYNC引腳的訊號變化被鎖存, 以便捕捉訊號, FSYNC訊號將以暫存器0x19中定義的取樣速率進行取樣。取樣後鎖存器將複位到當前的FSYNC訊號狀態.

  • 位3,4,5: 設置FSYNC位的位置
  • 位0,1,2: 取值0 - 6, 設置DLPF, 數字越大延遲越大.

角速度檢測(陀螺儀)配置暫存器 0x1B

這個暫存器用於設置角速度三軸的自檢和滿刻度範圍

加速度檢測配置暫存器 0x1C

這個暫存器用於設置加速度三軸的自檢和滿刻度範圍

模組的中斷類型及設置

中斷功能通過中斷配置暫存器進行配置。 可配置的項目包括INT引腳配置,中斷鎖存和清除方法以及中斷觸發器。 可觸發中斷的項目有:

  1. 時鐘發生器鎖定到新的參考振蕩器(用於切換時鐘源)
  2. 可以讀取新數據(來自FIFO和數據暫存器)
  3. 加速度計事件中斷
  4. MPU-6050 沒有收到輔助感測器的確認I2C匯流排

中斷狀態可以從中斷狀態暫存器讀取。

檢測數據

MPU6050在檢測過程中, 根據取樣速率不斷輸出六軸加溫度的檢測值, 如果設置的滿刻度範圍較大, 則測量輸出的數字較小, 靈敏度較低, 要增加靈敏度可以調小滿刻度範圍. 相比較 ADXL345, MPU6050更適合運動中的物體檢測, 能檢測到更準確的運動中物體姿態變化, 同樣的, 如果沒有接入電子羅盤(磁強計), 只能得到俯仰角和橫滾角數據, 不能得到航向角數據.

演示程式碼

演示程式碼以100ms的時間間隔, 不斷讀取7個檢測數據並通過UART1串口輸出, 接線正確的話, 可以通過串口軟體觀察到模組運動帶來的檢測值變化