2013年11月7日 星期四

[STM32] MPU6050 陀螺儀/加速器換算方式

圖一(圖片來至google)

最近在研究Quadcopter,需要使用加速度計和陀螺儀來做為平衡的依據,而選用的晶片是MPU6050(如圖一),首先先簡易了解一下晶片的一些特性

1. 三軸陀螺儀(Gyroscope)
  •  數位輸出X,Y,Z的角速度(°C)
  •  Range : ±250, ±500, ±1000, and ±2000°/sec 
2.三軸加速度計(Accelerometer)
  •  數位輸出X,Y,Z的重力(g)
  •  Range : ±2g, ±4g, ±8g, and ±16g 
3.其他特性
  • 使用I2C與MCU溝通
  • 可以外加地磁計(Magnetometer),組成九軸偵測
4. Block Diagram
  • X/Y/Z  Accel、X/Y/Z-Gyro 經過ADC轉換,儲存Sensor Registers,最後再透過I2C介面提供data給MCU。
看完基本特性之後,開始研究程式碼,雖然官方有提供8051跟arduino的Source Code 不過我採用是由Harinadha Reddy Chintalapalli所提供的MP6050lib for STM32

#include "mpu6050.h"
int main()
{
     s16 Buffer[6]={0x00};
     MPU6050_Initialize();

    while ( 1 ) {
        // index:0~2 acceleration
        // 3~5 Angular rate
        MPU6050_GetRawAccelGyro(Buffer);  
    }
}


從Debug Mode,確定已經可以取到加速度和腳速度的值(圖二)。
圖二

但問題又來了,這些值,到底代表甚麼含義呢??還有要如何測試呢??
首先從MPU6050 Doucment得到以下幾個資訊(圖三)

圖三
  • 使用二的補數來表示正負號 
    • 正號 : 0x0000~0x7FFF ( 0 ~ 32767)
    • 負號 : 0x8000~0xFFFF ( 32768 ~ 65535 )
  • Gyroscope (AFS_SEL =  0)
    • 測量角速度
    • 131 LSB/°:表示一度使用131表示
      • 正號 : 0x0001~0x7FEE (  1 ~ 32750 )
      • 負號 : 0xFFFF~0x80C7 ( -1~-32750 )
    •  測試方式
      • 理論上,在靜止時,角速度的值應該都要為0,但從圖二可得知,實際上並不為0,會有一個誤差值,不過我測試的結果,大概誤差在正負1~2度左右,還在可接受範圍內。
      • 針對X/Y/Z軸,做順時針與逆時針旋轉,可得知值變化狀態

  • Accelerometer (AFS_SEL =  0)
    • 測量加速度
    • 16384 LSB/mg :表示1g使用16384表示
      • 正號: 0x0001~0x7FFF ( 0~ 32767 )
      • 負號: 0xFFFF~0x8000 (-1~-32768 )
    • 測試方式
      • 如果因為某些因素讓你無法得知,你的晶片方向,那你可以使加速度計來得知,因為只要是水平的放,那三軸中必有一軸須承受地心引力(1g),以圖三index[2](Z軸)的值為16700,而約等於16384,差不多為1G,而在90度的翻轉向X或Y軸(圖四),在觀察16384的值會落在哪個index上,就可以得知X,Y,Z三軸的位置。
        圖四

8 則留言:

  1. 您好:
    想請問一下關於mpu6050的問題
    在加速度計上有 ±2g, ±4g, ±8g, and ±16g 四種範圍可以選擇
    原本以為這四種靈敏度 如果不動放在桌上都會呈現 1g
    但經過我更改靈敏度範圍 則分別是 1g, 2g, 4g, and 8g
    想請問這個狀況是正確的嗎?
    根據我查到的資料更改方式是 arduino 比如輸出x軸加速度是ax
    依datasheet 除以lab (ax/16384.0) 這樣的方式去更改靈敏度
    請大師 解惑感謝

    回覆刪除
    回覆
    1. 你好,很抱歉,信被歸類到垃圾信了,今天才發現Orz....

      理論上,只要靜止不動,Z軸的值應該都是落在 1g(16834左右的值),而x,y軸的值則約為0

      不知是否有回答道你的問題?

      刪除
  2. 您好:
    請問MPU6050內部的資料儲存空間是多少?
    看到DataSheet說是有1024byte 的FIFO buffer...
    請問這算是資料儲存空間嗎?

    謝謝!

    回覆刪除
  3. 您好!再次請教一個問題:

    該如何計算Z軸的角度?
    是用這個公式嗎?
    angle_n += (gyroZ - gyroZ_O) * dt;

    我使用PIC的晶片進行測試
    但是角度都不正確...
    請問該如何處理?

    謝謝!

    回覆刪除
  4. 請問
    三軸陀螺儀(Gyroscope)
    數位輸出X,Y,Z的角速度(°C)
    °C是什麼樣的單位 跟角度的°有關嗎

    回覆刪除
  5. 請問
    我的mpu6050為什麼在arduino 上開啟序列埠 但是卻無法讀到數值 一直卡在尋找裝置的這個地方?因為有焊接過 所以一開始想說可能焊壞了 之後再去買新的一塊還是一樣的情形 還是有可能是arduino板子上連結mpu6050的腳位壞掉了呢?
    謝謝

    回覆刪除
    回覆
    1. I2C找不到嗎?你試試換個有上拉電阻的腳位看看,我用WEMOS R1也發生過,或目前pin加二個電阻到5v

      刪除
  6. 請教您一下:
    測量角速度
    131 LSB/°:表示一度使用131表示
    正號 : 0x0001~0x7FEE ( 1 ~ 32750 )
    負號 : 0xFFFF~0x80C7 ( -1~-32750 )
    如果沒有在這區間的數值,是否都是=0?

    回覆刪除