玩轉X-CTR100 l STM32F4 l MPU6050加速度陀螺儀傳感器


我造輪子,你造車,創客一起造起來!塔克創新資訊【塔克社區 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/

    

本文介紹X-CTR100控制器 板載加速度陀螺儀MPU6050的使用。

X-CTR100集成三軸加速度三軸陀螺儀MEMS芯片MPU6050,使X-CTR100具有IMU(Inertial measurement unit)功能,通過姿態解算可獲得X-CTR100姿態角,用於自平衡車、四旋翼飛行器、3D鼠標等作品設計。

原理

MPU6050是InvenSense公司推出的整合性6軸運動處理組件,相較於獨立方案免除了組合陀螺儀與加速器時之軸間差的問題,內部整合3軸陀螺儀和3軸加速度傳感器,並且具有數字運動處理引擎(DMP:Digital Motion Processor),方便實現姿態解算,降低主處理器運算負荷。MPU6050系統框圖如下圖所示。

MPU6050主要參數特性見下表,詳細特性請參考芯片資料。

參數

說明

供電電壓

3.3V-5V

功耗

500uA~3.9mA@3.3V

工作溫度

-40~+85℃

通信接口

I2C協議(最高頻率400K)

測量

加速度3軸 陀螺儀3軸

ADC分辨率

16位

陀螺儀量程

±250 º/s 、±500 º/s 、±1000 º/s、±2000 º/s

陀螺儀最高分辨率

131 LSB/(º/s)

加速度量程

±2g、±4g、±8g、±16g

加速度最高分辨率

16384 LSB/g

溫度量程

-40~+85℃

溫度分辨率

340 LSB/℃

MPU6050集成數字低通濾波器DLPF,通過低通濾波器可濾除高頻噪聲,獲取更平滑的數據曲線。低通濾波器設置位DLPF_CFG[2:0],濾波器設置及對應的特性如下表所示。

X-CTR100坐標定義,MPU6050芯片坐標定義如下圖左圖所示,MPU6050芯片在X-CTR100上的安裝方向如下右圖所示,使用時請注意坐標系定義。

 

例程 l 數據讀取

初始化MPU6050,采集3軸加速度、3軸陀螺儀、溫度傳感器數據並輸出顯示。

硬件說明

硬件資源:

  • 串口UART1
  • 板載資源MPU6050

硬件連接:

    

X-CTR100集成三軸加速度、三軸陀螺儀一體芯片MPU6050,可實現IMU功能,通過IIC2接口控制,MPU6050中斷輸出連接到PB8引腳。使用IIC2接口擴展其它功能模塊時,請注意地址是否沖突。

軟件生態

X-SOFT軟件生態,X-API文件如下。

ax_mpu6050.c——X-CTR100 板載 MPU6050加速度陀螺儀源文件

ax_ mpu6050.h——X-CTR100 板載 MPU6050加速度陀螺儀頭文件

操作函數如下:

void AX_MPU6050_Init(void); //MPU6050傳感器初始化

 

//設置參數函數

void AX_MPU6050_SetAccRange(uint8_t range); //MPU6050設置加速度量程

void AX_MPU6050_SetGyroRange(uint8_t range); //MPU6050設置陀螺儀量程

void AX_MPU6050_SetGyroSmplRate(uint16_t smplrate); //MPU6050設置陀螺儀采樣率

void AX_MPU6050_SetDLPF(uint8_t bandwidth); //MPU6050設置低通濾波器帶寬

 

//獲取數據函數

float AX_MPU6050_GetTempValue(void);    //MPU6050獲取傳感器溫度值

int16_t AX_MPU6050_GetAccData_X(void); //MPU6050獲取X軸加速度寄存器輸出值

int16_t AX_MPU6050_GetAccData_Y(void); //MPU6050獲取Y軸加速度寄存器輸出值

int16_t AX_MPU6050_GetAccData_Z(void); //MPU6050獲取Z軸加速度寄存器輸出值

void AX_MPU6050_GetAccData(int16_t *pbuf); //MPU6050獲取三軸加速度寄存器輸出值

int16_t AX_MPU6050_GetGyroData_X(void); //MPU6050獲取X軸陀螺儀寄存器輸出值

int16_t AX_MPU6050_GetGyroData_Y(void); //MPU6050獲取Y軸陀螺儀寄存器輸出值

int16_t AX_MPU6050_GetGyroData_Z(void); //MPU6050獲取Z軸陀螺儀寄存器輸出值

void AX_MPU6050_GetGyroData(int16_t *pbuf); //MPU6050獲取三軸軸陀螺儀寄存器輸出值

設置項宏定義:

//加速度量程

#define AX_ACC_RANGE_2G 0 //2g    

#define AX_ACC_RANGE_4G 1 //4g

#define AX_ACC_RANGE_8G 2 //8g    

#define AX_ACC_RANGE_16G 3 //16g

 

//陀螺儀量程

#define AX_GYRO_RANGE_250 0 //250度/秒    

#define AX_GYRO_RANGE_500 1 //500度/秒

#define AX_GYRO_RANGE_1000 2 //1000度/秒    

#define AX_GYRO_RANGE_2000 3 //2000度/秒    

 

//帶寬

#define AX_DLPF_ACC184_GYRO188 1 //加速度帶寬184Hz 陀螺儀帶寬188Hz

#define AX_DLPF_ACC94_GYRO98 2 //加速度帶寬94Hz 陀螺儀帶寬98Hz

#define AX_DLPF_ACC44_GYRO42 3 //加速度帶寬44Hz 陀螺儀帶寬42Hz

#define AX_DLPF_ACC21_GYRO20 4 //加速度帶寬21Hz 陀螺儀帶寬20Hz

#define AX_DLPF_ACC10_GYRO10 5 //加速度帶寬10Hz 陀螺儀帶寬10Hz

#define AX_DLPF_ACC5_GYRO5 6 //加速度帶寬5Hz 陀螺儀帶寬5Hz

軟件說明

本例程AX_MPU6050_Init()完成MPU初始化,並設置陀螺儀量程250deg/s,加速計量程2g、陀螺采樣率200Hz、低通濾波帶寬陀螺98Hz、加速度94Hz。然后調用單軸讀取函數分別讀取每個軸數據,並顯示。最后while循環中集中讀取加速度、陀螺儀、溫度數據,並顯示。主程序代碼如下。

int main(void)

{

    float tmp;

    int16_t acel[3];

    int16_t gyro[3];

 

    //X-CTR100初始化

    AX_Init(115200);

    printf("***X-CTR100 MPU6050運動傳感器例程***\r\n\r\n");

 

    //模塊初始化及配置

    AX_MPU6050_Init(); //MPU6050初始化

    AX_MPU6050_SetAccRange(AX_ACC_RANGE_2G); //設置加速度量程

    AX_MPU6050_SetGyroRange(AX_GYRO_RANGE_250); //設置陀螺儀量程

    AX_MPU6050_SetGyroSmplRate(200); //設置陀螺儀采樣率

    AX_MPU6050_SetDLPF(AX_DLPF_ACC94_GYRO98); //設置低通濾波器帶寬

 

                                                //X-API測試:分別讀取加速度、陀螺儀每個軸數據

    printf("*分別讀取加速度、陀螺儀每軸數據\r\n");

    acel[0] = AX_MPU6050_GetAccData_X();

    acel[1] = AX_MPU6050_GetAccData_Y();

    acel[2] = AX_MPU6050_GetAccData_Z();

    gyro[0] = AX_MPU6050_GetGyroData_X();

    gyro[1] = AX_MPU6050_GetGyroData_Y();

    gyro[2] = AX_MPU6050_GetGyroData_Z();

 

    printf("*加速度:%8d %8d %8d", acel[0], acel[1], acel[2]);

    printf(" 陀螺儀:%8d %8d %8d \r\n", gyro[0], gyro[1], gyro[2]);

 

    //X-API測試:循環讀取加速度、陀螺儀、溫度數據

    printf("*讀取加速度、陀螺儀、溫度數據\r\n");

 

    while (1)

    {

        AX_MPU6050_GetAccData(acel); //讀取三軸加速度數據

        printf("*加速度:%8d %8d %8d", acel[0], acel[1], acel[2]);

 

        AX_MPU6050_GetGyroData(gyro); //讀取三軸陀螺儀數據

        printf(" 陀螺儀:%8d %8d %8d", gyro[0], gyro[1], gyro[2]);

 

        tmp = AX_MPU6050_GetTempValue(); //讀取溫度傳感器數據

        printf(" 溫度:%8.2f\r\n", tmp);

 

        AX_Delayms(1000);

        AX_LEDG_Toggle();

    }

}

實現效果

上電MPU初始化完成后,即可循環輸出3軸加速度、3軸陀螺儀、溫度傳感器數據。可緩慢晃動X-CTR100,觀察數據變化。由於傳感器未校准,存在數據偏差為正常現象,校准后即可修正,運行效果如下圖所示。

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM