我造輪子,你造車,創客一起造起來!塔克創新資訊【塔克社區 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 |
工作溫度 |
|
通信接口 |
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,觀察數據變化。由於傳感器未校准,存在數據偏差為正常現象,校准后即可修正,運行效果如下圖所示。