CubeMX配置STM32驅(qū)動(dòng)MPU6050(包含DMP)并且在0.96寸OLED上顯示
一、使用CubeMX進(jìn)行相關(guān)配置 |
1、配置OLED的IIC接口
OLED的具體使用方法我就不細(xì)說了,我前面的文章里面有講OLED的,如果有需要可以去看看。
2、配置MPU6050的接口
我用MPU6050使用的是軟件IIC(其實(shí)是只找到軟件IIC的驅(qū)動(dòng)),所以我們只需要配置兩個(gè)GPIO口就可以實(shí)現(xiàn)對(duì)MPU6050的控制了。
這里我使用的是PB8、9,這里特別注意的是在User Label
那兒需要將兩個(gè)引腳分別設(shè)置為MPU6050_SCL和MPU6050_SDA,因?yàn)檫@里涉及到驅(qū)動(dòng)函數(shù)里面的宏定義,這樣設(shè)置之后方便以后驅(qū)動(dòng)函數(shù)的移植。
我使用的是C8T6,時(shí)鐘樹我就是配置的最常見的72MHZ。
二、使用keil 5 進(jìn)一步開發(fā) |
1、引入OLED和MPU6050的驅(qū)動(dòng)文件
OLED的文件在我前面的文章里面給出來了,我這兒就只給出MPU6050的文件了:
資源上傳了,因?yàn)槔锩媸侵苯影―MP的直接下載比較方便,原本我打算下面把所有的文件將代碼的方式給出來的,但是都要寫完了才發(fā)現(xiàn)篇幅太長了是發(fā)不出來的,而且越寫到后面字?jǐn)?shù)多了瀏覽器就很卡,所以你們還是直接下載吧。
然后將驅(qū)動(dòng)文件加到keil里面,記得添加路徑
具體的函數(shù)在OLED和MPU6050的驅(qū)動(dòng)文件里面都有說明。
2、引入頭文件、定義變量
/* USER CODE BEGIN Includes */
#include "stdio.h"
//mpu6050文件
#include "IIC.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
//
#include "oled.h"
/* USER CODE END Includes */
/* USER CODE BEGIN 0 */
float pitch,roll,yaw; //歐拉角
short aacx,aacy,aacz; //加速度傳感器原始數(shù)據(jù)
short gyrox,gyroy,gyroz; //陀螺儀原始數(shù)據(jù)
float temp; //溫度
/* USER CODE END 0 */
示例:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
OLED_Init();
OLED_Clear();
MPU_Init();
mpu_dmp_init();
if(MPU_Init()==0&&mpu_dmp_init()==0)
{
printf("mpu6050初始化成功\r\n");//我是串口和OLED都設(shè)置了顯示的,所以這兒多了
// 一個(gè)printf,下面那個(gè)printf也是
OLED_ShowString(0,0,"successfully",16);
}
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// OLED_ShowNum(24,2,a,3,16);
// HAL_Delay(100);
// a++;
HAL_Delay(500);
while(mpu_dmp_get_data(&pitch, &roll, &yaw)); //必須要用while等待,才能讀取成功
MPU_Get_Accelerometer(&aacx,&aacy, &aacz); //得到加速度傳感器數(shù)據(jù)
MPU_Get_Gyroscope(&gyrox, &gyroy, &gyroz); //得到陀螺儀數(shù)據(jù)
temp=MPU_Get_Temperature(); //得到溫度信息
printf("X:%.1f Y:%.1f Z:%.1f %.2f℃ \r\n",roll,pitch,yaw,temp/100);//串口1輸出采集信息
OLED_ShowString(0,2,"roll:",16);
OLED_ShowDecimal(40,2,roll,16);
OLED_ShowString(0,4,"pitch:",16);
OLED_ShowDecimal(48,4,pitch,16);
OLED_ShowString(0,6,"yaw:",16);
OLED_ShowDecimal(32,6,yaw,16);
/* USER CODE END WHILE */
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
效果圖如下:
對(duì)了,上面的顯示小數(shù)那個(gè)函數(shù)在我前面的OLED的介紹里面沒有,是后面自己加上去的,需要自己重新加一下,不過這個(gè)函數(shù)還有點(diǎn)問題,就是小數(shù)點(diǎn)后面的顯示位數(shù)那兒,我設(shè)置為兩位但有時(shí)候是現(xiàn)實(shí)三位;設(shè)置為一位又有時(shí)會(huì)顯示兩位。我還沒有找到原因,如果有知道的可以聯(lián)系我?guī)臀抑v講這個(gè)。謝謝啦文章來源:http://www.zghlxwxcb.cn/news/detail-650700.html
//顯示小數(shù),小數(shù)點(diǎn)前三位,小數(shù)點(diǎn)后兩位
void OLED_ShowDecimal(uint8_t x,uint8_t y,float num,uint8_t size)
{
float a=0;
if(num>=0)
{
a=10*(num-(int)num);
OLED_ShowNum(x,y,(int)num,3,size);
OLED_ShowChar(x+24,y,'.',size);
OLED_ShowNum(x+32,y,(int)a,1,size);
}
else
{
num=0-num;
OLED_ShowChar(x,y,'-',size);
a=10*(num-(int)num);
OLED_ShowNum(x+8,y,(int)num,3,size);
OLED_ShowChar(x+32,y,'.',size);
OLED_ShowNum(x+40,y,(int)a,1,size);
}
}
如果有什么錯(cuò)誤歡迎各位指正哦。文章來源地址http://www.zghlxwxcb.cn/news/detail-650700.html
到了這里,關(guān)于【CubeMX配置STM32驅(qū)動(dòng)MPU6050】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!