1. 程式人生 > >如何利用小熊派獲取MPU6050六軸原始資料

如何利用小熊派獲取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 。

 

點選關注,第一時間瞭解華為雲新鮮技