目錄
- STC8H開發(一): 在Keil5中配置和使用FwLib_STC8封裝庫(圖文詳解)
- STC8H開發(二): 在Linux VSCode中配置和使用FwLib_STC8封裝庫(圖文詳解)
- STC8H開發(三): 基于FwLib_STC8的模數轉換ADC介紹和演示用例說明
- STC8H開發(四): FwLib_STC8 封裝庫的介紹和使用注意事項
- STC8H開發(五): SPI驅動nRF24L01無線模塊
- STC8H開發(六): SPI驅動ADXL345三軸加速度檢測模塊
- 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讀寫方法, 需要注意的幾點
- 一次性讀出的雙位元組結果, 如果直接轉uint16_t, 其高位元組和低位元組位置是相反的, 需要調換后再轉換
- 可以一次性讀出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引腳配置,中斷鎖存和清除方法以及中斷觸發器, 可觸發中斷的專案有:
- 時鐘發生器鎖定到新的參考振蕩器(用于切換時鐘源)
- 可以讀取新資料(來自FIFO和資料暫存器)
- 加速度計事件中斷
- MPU-6050 沒有收到輔助傳感器的確認I2C總線
中斷狀態可以從中斷狀態暫存器讀取,
檢測資料
MPU6050在檢測程序中, 根據采樣速率不斷輸出六軸加溫度的檢測值, 如果設定的滿刻度范圍較大, 則測量輸出的數字較小, 靈敏度較低, 要增加靈敏度可以調小滿刻度范圍. 相比較 ADXL345, MPU6050更適合運動中的物體檢測, 能檢測到更準確的運動中物體姿態變化, 同樣的, 如果沒有接入電子羅盤(磁強計), 只能得到俯仰角和橫滾角資料, 不能得到航向角資料.
演示代碼
演示代碼以100ms的時間間隔, 不斷讀取7個檢測資料并通過UART1串口輸出, 接線正確的話, 可以通過串口軟體觀察到模塊運動帶來的檢測值變化
- GitHub FwLib_STC8/tree/master/demo/i2c/mpu6050
- Gitee FwLib_STC8/tree/master/demo/i2c/mpu6050
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/418988.html
標籤:嵌入式
下一篇:嵌入式硬體之ADC/DAC
