陀螺仪加速度计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,¶m[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,¶m[1]); //失能低通濾波器,帶寬: 加速度 44Hz; 陀螺儀 42Hzmpu6050_i2c_readMem(MPU6050_CONFIG,&temp,1);if(temp != param[1])return 1;mpu6050_i2c_writeMem(MPU6050_GYRO_CONFIG,¶m[2]); //陀螺儀量程:± 2000 °/smpu6050_i2c_readMem(MPU6050_GYRO_CONFIG,&temp,1);if(temp != param[2])return 1;mpu6050_i2c_writeMem(MPU6050_ACCEL_CONFIG,¶m[3]); //加速度量程:± 8gmpu6050_i2c_readMem(MPU6050_ACCEL_CONFIG,&temp,1);if(temp != param[3])return 1;mpu6050_i2c_writeMem(MPU6050_INT_PIN_CFG,¶m[4]); //中斷引腳設置mpu6050_i2c_readMem(MPU6050_INT_PIN_CFG,&temp,1);if(temp != param[4])return 1;mpu6050_i2c_writeMem(MPU6050_INT_ENABLE,¶m[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代碼示例如下:
以下是解出的參數和校準代碼。
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程序与校准方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 表语从句笔记
- 下一篇: [Practical.Vim(2012.