如何利用小熊派獲取MPU6050六軸原始資料
摘要:使用小熊派開發板,通過硬體IIC與MPU6050六軸感測器模組通訊,完成相應暫存器配置,成功獲取陀螺儀、加速度計資料。
本問主要講述使用小熊派開發板+MPU6050六軸感測器,獲取加速度計以及陀螺儀資訊。
一、實驗準備
1.實驗環境
- 一塊stm32開發板(推薦使用小熊派),以及資料線
- 已經安裝STM32CubeMX
- 已經安裝KeilMDK,並匯入stm32開發板對應的晶片包(小熊派使用的是STM32L431RCT6)
- 一個MPU6050模組(IIC介面)以及杜邦線
2.目標效果
- 通過CubeMX建立工程並配置引數
- IIC方式通訊,配置MPU6050暫存器
- 小熊派通過IIC,獲取陀螺儀、加速度計資料
- 串列埠1重定向輸出編碼器轉動的角度、角速度
二、通過CubeMX生產MDK工程
A.晶片選擇
- 開啟CubeMX,進入晶片選擇:
- 選擇自己的stm32晶片(即STM32L431RCT6):
B.時鐘源RCC設定
- 更改系統時鐘源
系統時鐘預設使用內部的高速時鐘(HSI),選擇使用HSE,時鐘更精確
- 設定外部時鐘對應的埠
- 配置時鐘樹
STM32L431RCT6系統時鐘最大可以為80MHz,我們配置到最大即可
C.引數配置(對應埠設定)
1)配置USART1
使用USART,模式為非同步,波特率為115200,無硬體流控制
2)硬體IIC配置
IIC(Inter-Integrated Circuit)其實是IICBus簡稱,所以中文應該叫積體電路匯流排,它是一種序列通訊匯流排,使用多主從架構
我們使用小熊派的I2C1,小熊派引出的引腳為PB7->I2C1_SDA,PB6->I2C1_SCL
其他選項我們保持預設即可
3)MPU6050模組
當然,我們還需要了解MPU6050模組的電路,更好的進行配置。當然我們也可以自主製作模組
如果AD0腳(9腳)接地,IIC地址為0X68(不包含最低位);如果AD0腳接V3.3,則IIC地址為0X69(不包含最低位).
可以看到,AD0引腳已經被拉低,所有預設IIC地址為0x68.
最後,生成程式碼就OK了
D.工程設定
一些基礎的設定,包括工程名、儲存位置、工程環境、工程中各個檔案的組成
E.生成程式碼
三、編寫相應程式碼
1. 串列埠1輸出重定向
我們知道printf是列印函式,原理是根據傳入的字串引數格式化列印輸出到stdout中。我們需要讓printf列印到串列埠之中,只需要在usart.c檔案中模仿printf寫一個輸出函式即可
- 在新增標頭檔案
/* USER CODE BEGIN 0 */#include <stdarg.h>#include <string.h>#include <stdio.h>/* USER CODE END 0 */
- 寫輸出函式
/* USER CODE BEGIN 1 */void UsartPrintf(UART_HandleTypeDef *huart, char *fmt,...){ unsigned char UsartPrintfBuf[296]; va_list ap; unsigned char *pStr = UsartPrintfBuf; va_start(ap, fmt); vsprintf((char *)UsartPrintfBuf, fmt, ap); //格式化 va_end(ap); while(*pStr != 0) { USART1->TDR = *pStr++; while((USART1->ISR & 0x40) == 0); }}//注意:在usart.h中新增void UsartPrintf(UART_HandleTypeDef *huart, char *fmt,...);//使用方法:UsartPrintf(&huart1;,"hello world\r\n");/* USER CODE END 1 */
注意:自己新增的程式碼,需要在begin和end之間
2.寫MPU6050驅動
我們建立兩個檔案,分別是mpu6050.h和mpu6050.c
a).首先我們在mpu6050.h中巨集定義相應的暫存器,方便後續使用。
在main函式中,我們首先設定計數器初值為10000,然後開啟編碼器,每1S獲取一次計數器的更新值,判斷編碼器資訊
因為暫存器實在太多,就沒有一一列出,可以在附件中檢視哦~
b).配置各個暫存器
主要的函式為:IIC讀寫、初始化MPU6050、設定陀螺儀和加速度計滿量程、設定取樣率、讀取資料
程式碼附件中有,不一一講解。
初始化函式
uint8_t MPUInit(void){ uint8_t res; extern I2C_HandleTypeDef hi2c1; HAL_I2C_Init(&hi2c1;); //初始化IIC /*上電後最好有一定延時,保證資料準確*/ HAL_Delay(500); MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x80); //復位MPU6050,寫入1000 0000 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x00);//sleep寫入0,保持喚醒狀態 MPU_Set_Gyro_Fsr(3); //陀螺儀滿量程±2000 MPU_Set_Accel_Fsr(0); //加速度計滿量程±2g MPU_Set_Rate(50); //設定取樣率=50Hz MPU_Write_Byte(MPU_INT_EN_REG,0x00);//關閉所有中斷 MPU_Write_Byte(MPU_USER_CTRL_REG,0x00); //關閉從iic MPU_Write_Byte(MPU_FIFO_EN_REG,0x00); //關閉FIFO MPU_Write_Byte(MPU_INTBP_CFG_REG,0x80); //INT引腳低電平有效 res = MPU_Read_Byte(MPU_DEVICE_ID_REG); //讀取地址 UsartPrintf(&huart1;,"\r\nMPU6050:0x%2x\r\n",res); UsartPrintf(&huart1;,"\r\nMPU6050:0x%2x\r\n",MPU_ADDR); if(res == MPU_ADDR) //判斷地址是否正確 { MPU_Write_Byte(MPU_PWR_MGMT1_REG,0x01); //001,pll,x軸為參考系統時鐘源 MPU_Write_Byte(MPU_PWR_MGMT2_REG,0x00); //都不使用待機模式 MPU_Set_Rate(50); }else return 1; return 0;}
需要注意到,mpu6050上電後需要有一定延時,保證資料的穩定。重啟mpu6050會有睡眠模式,寫入關閉睡眠。最後檢測並判斷IIC地址是否正確
3.main函式
/* USER CODE BEGIN PV */short x;short y;short z;/* USER CODE END PV */ /* USER CODE BEGIN 2 */ MPUInit(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ while(MPU_Get_Gyroscope(&x,&y,&z) !=0); HAL_Delay(1000); printf("\r\n陀螺儀:x=-,y=-,z=-\r\n",x,y,z); while(MPU_Get_Accelerometer(&x,&y,&z) != 0); HAL_Delay(1000); printf("\r\n加速度計:x=-,y=-,z=-\r\n",x,y,z); /* USER CODE BEGIN 3 */ }
四、編譯+下載
點選編譯後,0 error,0 warning
小熊派連線在電腦上,程式碼下載到開發板
五、連線硬體
1.將小熊派串列埠1和電腦相連,即撥到 AT-MUC,按下復位鍵
2.連線MPU6050
我們只需要使用mpu6050的SDA\SCL\GND\VCC。
即:
- SDA-->PB7
- SCL-->PB6
- GND-->GND
- VCC-->5V
3.效果
開啟串列埠除錯助手,我們手動轉動開發板(包括模組),看見陀螺儀和加速度資料不斷變化,當靜止時資料保持穩定 。
至此,我們已經可以通過小熊派以IIC獲取六軸感測器原始資料資訊
本文分享自華為雲社群《小熊派實踐——獲取MPU6050六軸原始資料》,原文作者:ttking 。
點選關注,第一時間瞭解華為雲新鮮技