日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

陀螺仪加速度计MPU6050程序与校准方法

發布時間:2024/3/12 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 陀螺仪加速度计MPU6050程序与校准方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、陀螺儀與加速度計簡介
  • 二、程序使用
    • 1.初始化
    • 2.讀取數據
  • 三、誤差校準
    • 1.陀螺儀校準
    • 2.加速度計校準
    • 3.校準后的輸出
  • 四、源碼獲取


前言

本文將介紹陀螺儀和加速度計的使用程序和校準方法,STM32的程序代碼可從文章末尾獲得。


一、陀螺儀與加速度計簡介

陀螺儀的理解可以從單位入手,測量值的單位是°/s。意思是某時刻的旋轉角度的變化速度是每秒多少度。加速度計則容易理解很多,單位為g,這里就不多闡述。下面是MPU6050三軸的方向圖。

二、程序使用

文章末尾可獲取STM32F103C8T6的程序,可稍微更改一下就能移植到別的平臺。硬件連線如下:

  • PB5 --> INT
  • PB6 --> SCL
  • PB7 --> SDA
  • PA9,PA10–>串口

1.初始化

MPU6050的初始化函數如下。這里提供了一般的初始化設置,也可自行根據寄存器手冊進行修改。

/************************************ * 函數功能:傳感器初始化 * 參數:無 * 返回值: 0 初始化成功 * 1 初始化失敗 *************************************/ uint8_t mpu6050_init(void) {uint8_t temp;uint8_t param[] = {0,0x03,0x18,0x10,0x10,0x01};mpu6050_i2c_readMem(MPU6050_WHO_AM_I,&temp,1);if(temp != 0x68){// printf("不能讀取寄存器,初始化失敗");return 1;}temp = 0x80;mpu6050_i2c_writeMem(MPU6050_PWR_MGMT_1,&temp); //重啟設備delay_ms(100);temp = 0;mpu6050_i2c_writeMem(MPU6050_PWR_MGMT_1,&temp); //退出休眠模式mpu6050_i2c_writeMem(MPU6050_SMPLRT_DIV,&param[0]); //Sample Rate = Gyroscope Output Rate / (1 + SMPLRT_DIV) = 1kHzmpu6050_i2c_readMem(MPU6050_SMPLRT_DIV,&temp,1); //其中Gyroscope Output Rate=1kHz 或 8kHz 取決于是否開啟數字低通濾波器if(temp != param[0])return 1;mpu6050_i2c_writeMem(MPU6050_CONFIG,&param[1]); //失能低通濾波器,帶寬: 加速度 44Hz; 陀螺儀 42Hzmpu6050_i2c_readMem(MPU6050_CONFIG,&temp,1);if(temp != param[1])return 1;mpu6050_i2c_writeMem(MPU6050_GYRO_CONFIG,&param[2]); //陀螺儀量程:± 2000 °/smpu6050_i2c_readMem(MPU6050_GYRO_CONFIG,&temp,1);if(temp != param[2])return 1;mpu6050_i2c_writeMem(MPU6050_ACCEL_CONFIG,&param[3]); //加速度量程:± 8gmpu6050_i2c_readMem(MPU6050_ACCEL_CONFIG,&temp,1);if(temp != param[3])return 1;mpu6050_i2c_writeMem(MPU6050_INT_PIN_CFG,&param[4]); //中斷引腳設置mpu6050_i2c_readMem(MPU6050_INT_PIN_CFG,&temp,1);if(temp != param[4])return 1;mpu6050_i2c_writeMem(MPU6050_INT_ENABLE,&param[5]); //中斷引腳使能mpu6050_i2c_readMem(MPU6050_INT_ENABLE,&temp,1);if(temp != param[5])return 1;//printf("初始化成功");return 0; }

2.讀取數據

以下為讀取陀螺儀數據的函數,讀取到的數據為ADC的原始數據,需要根據ADC的分辨率將單位轉換為°/s。加速度計的數據讀取也類似,不再贅述。

/************************************ * 函數功能:獲得陀螺儀原始數據 * 參數: *GYRO 接收數據的指針 * 返回值: 無 *************************************/ void mpu6050_getRawGyro(mpu6050_data *pGyro) {uint8_t rawData[6];int16_t rawGyroData[3];mpu6050_i2c_readMem(MPU6050_GYRO_XOUT_H,rawData,6);rawGyroData[0] = (int16_t)((uint16_t)rawData[0]<<8)|((uint16_t)rawData[1]);rawGyroData[1] = (int16_t)((uint16_t)rawData[2]<<8)|((uint16_t)rawData[3]);rawGyroData[2] = (int16_t)((uint16_t)rawData[4]<<8)|((uint16_t)rawData[5]);pGyro->x = ((float)rawGyroData[0]) * gyro_raw_to_deg_s;pGyro->y = ((float)rawGyroData[1]) * gyro_raw_to_deg_s;pGyro->z = ((float)rawGyroData[2]) * gyro_raw_to_deg_s;pGyro->x -= gyro_offest[0];pGyro->y -= gyro_offest[1];pGyro->z -= gyro_offest[2]; }

三、誤差校準

一般來說,MEMS(微機電系統)器件由于制造工藝精度問題,都會存在一定的誤差。下圖是靜止在水平面的條件下測試得到的數值。可見,水平靜止的情況下,陀螺儀輸出應該為0,加速度計Z軸輸出應為1g。所以出現了較大誤差。

1.陀螺儀校準

陀螺儀的校準相對簡單。在靜止的情況下,將多個采樣的平均值作為偏置值。測量后減去這個零偏即為真實值。若存在零偏,即使在靜止的情況下,得出的數據會認為正在旋轉,隨著時間累積會出現較大誤差。

const float gyro_offest[3] = {-0.96,0.902,-1.05};pRogy->x -= gyro_offest[0];pRogy->y -= gyro_offest[1];pRogy->z -= gyro_offest[2]; //校準

2.加速度計校準

加速度計校準可建立以下數學模型。

使用matlab的lsqcurvefit函數進行擬合,解出6個參數。具體matlab代碼示例如下:

clear;clc; axm=[0.007813 0.100098 0.066162 0.031982 1.070068 -0.939697]; aym=[-0.061279 -0.019043 -1.013916 0.979248 -0.018555 -0.023438]; azm=[0.929688 -1.088379 -0.096191 -0.079346 -0.172607 -0.054932]; am=[axm',aym',azm']; %axm, aym, azm分別是采集的三軸加速度計數據,最好是6個面進行采集 G=[1 1 1 1 1 1]'; f=@(a,am)(a(1)*am(:,1)+a(2)).^2+(a(3)*am(:,2)+a(4)).^2+(a(5)*am(:,3)+a(6)).^2; a0=[1 0 1 0 1 0]; a=lsqcurvefit(f,a0,am,G)

以下是解出的參數和校準代碼。

const float acc_param_k[3] = {0.9928,1.0030,0.9894}; const float acc_param_a[3] = {-0.0668,0.0172,0.0774};pAcc->x = acc_param_k[0] * pAcc->x + acc_param_a[0];pAcc->y = acc_param_k[1] * pAcc->y + acc_param_a[1];pAcc->z = acc_param_k[2] * pAcc->z + acc_param_a[2];

3.校準后的輸出

可見,校準后的輸出誤差明顯減少。

四、源碼獲取

關注下方公眾號,回復 “MPU6050” 獲取源碼;若有疑問,請在公眾號回復“交流群”,進群一起討論分享!

總結

以上是生活随笔為你收集整理的陀螺仪加速度计MPU6050程序与校准方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。