• 方案介紹
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

23.2.1-編寫MPU6050初始化 FreeRTOS 項目 FreeRTOS學習筆記

02/17 08:54
1430
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

聯(lián)系方式.txt

共1個文件

這個是全網(wǎng)最詳細的STM32項目教學視頻。
第一篇CSDN文章在這里在這里:
75


STM32智能小車V3-STM32入門教程-openmv與STM32循跡小車-stm32f103c8t6-電賽 嵌入式學習 PID控制算法 編碼器電機 跟隨

V3:HAL庫開發(fā)、手把手教學下面功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、openmv視覺控制、電磁循跡、FreeRTOS、K210視覺智能車(更新中)、K230視覺智能車(更新中)、MSPM0G3507視覺智能車(更新中)

在這里插入圖片描述

23.2.1-編寫MPU6050初始化

前面代碼我們都把6050代碼注釋掉了,是因為MPU605代碼有循環(huán)容易卡死。我們增加多次循環(huán)后就退出,這樣就不會卡死了。

復(fù)制23-1_LED_FreeRTOS的代碼,然后命名23-2_LED_FreeRTOS

我們把之前注釋掉的MPU6050初始化代碼修改成最多初始化3次,3次都不能初始化成功就退出并且串口一和藍牙打印。初始化函數(shù)返回值。

這個初始化在main.c里面

在這里插入圖片描述

//  while(MPU_Init()!=0);//初始化MPU6050模塊的MPU 注意初始化階段不要移動小車
  for(uint8_t i = 0; i < 3 ; i++)
	{
		uint8_t mpu_init_result = MPU_Init(); // 保存函數(shù)返回值
		if(mpu_init_result == 0)//初始化成功
		{
			printf("In main.c:MPU_Init() was initialized successfullyn");//串口1 輸出初始化成功 注意! 這個要寫再串口1初始化之后	
			sprintf((char*)Usart3String, "In main.c:MPU_Init() was initialized successfullyrn");//藍牙輸出 初始化成功
		  HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式發(fā)送通過串口三輸出字符 strlen:計算字符串大小	
			break;
		}
		if(i == 3-1 )//說明初始化失敗
		{
			printf("In main.c:MPU_Init() failed to initialize last return value: %dn", mpu_init_result);//串口1 輸出初始化失敗 注意! 這個要寫再串口1初始化之后 初始化失敗及最后一次返回值
			sprintf((char*)Usart3String, "In main.c:MPU_Init() failed to initialize last return value: %dn", mpu_init_result);//藍牙輸出 初始化失敗
		  HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式發(fā)送通過串口三輸出字符 strlen:計算字符串大小
		}
	}
//  while(mpu_dmp_init()!=0);//mpu6050,dmp初始化
  for(uint8_t i = 0; i < 3 ; i++)
	{
		uint8_t mpu_dmp_init_result = mpu_dmp_init();
		
		if(mpu_dmp_init_result == 0)//初始化成功
		{
			printf("In main.c:mpu_dmp_init() was initialized successfullyn");//串口1 輸出初始化成功 注意! 這個要寫再串口1初始化之后	
			sprintf((char*)Usart3String, "In main.c:mpu_dmp_init() was initialized successfullyrn");//藍牙輸出 初始化成功
		  HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式發(fā)送通過串口三輸出字符 strlen:計算字符串大小
			break;
		}
		if(i == 3-1 )//說明初始化失敗
		{
			printf("In main.c: mpu_dmp_init() failed to initialize, last return value: %dn", mpu_dmp_init_result);//串口1 輸出初始化失敗 注意! 這個要寫再串口1初始化之后
			sprintf((char*)Usart3String, "In main.c: mpu_dmp_init() failed to initialize, last return value: %dn", mpu_dmp_init_result);//藍牙輸出 初始化成功
		  HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),50);//阻塞式發(fā)送通過串口三輸出字符 strlen:計算字符串大小
		}
	}

然后我們修改一下OLED顯示任務(wù)的內(nèi)容,循環(huán)讀取20次數(shù)據(jù)如果都失敗就退出循環(huán)

注意這里設(shè)置讀取次數(shù)不能太少,測試發(fā)現(xiàn)小于5次會經(jīng)常讀取失敗

OLED顯示的任務(wù)需要讀取MPU605數(shù)據(jù)
在這里插入圖片描述

		for(uint8_t i = 0; i < 20 ; i++)
		{
			if(mpu_dmp_get_data(&pitch,&roll,&yaw) == 0)//獲得MPU6050數(shù)據(jù)成功
			{
				printf("mpu_dmp_get_data() Data for successn");//串口1 輸出數(shù)據(jù)獲取成功 注意! 這個要寫再串口1初始化之后		
			  break;
			}
						
			if(i == 20-1 )//i已經(jīng)等于(20-1)次 還沒有退出循環(huán)說明 說明輸出讀取失敗
			{
				printf("mpu_dmp_get_data()  Data acquisition failuren");//串口1 輸出數(shù)據(jù)獲取失敗 注意! 這個要寫再串口1初始化之后	
			}
		}

再修改一下模式5 里面獲得MPU6050數(shù)據(jù)的部分
在這里插入圖片描述

					//獲得6050數(shù)據(jù)
			//如果6050無法獲得正確數(shù)據(jù),可以連接串口1 查看相關(guān)輸出
			//這里的總體
			for(uint8_t i = 0; i < 20 ; i++)
			{
				if(mpu_dmp_get_data(&pitch,&roll,&yaw) == 0)//獲得MPU6050數(shù)據(jù)成功
				{
					printf("mpu_dmp_get_data() Data for successn");//串口1 輸出數(shù)據(jù)獲取成功 注意! 這個要寫再串口1初始化之后		
					break;
				}
							
				if(i == 20-1 )//i已經(jīng)等于(20-1)次 還沒有退出循環(huán)說明 說明輸出讀取失敗
				{
					printf("mpu_dmp_get_data()  Data acquisition failuren");//串口1 輸出數(shù)據(jù)獲取失敗 注意! 這個要寫再串口1初始化之后	
				}
			}

23.2.2-測試MPU6050和角度控制

具體演示測試見視頻

 

  • 聯(lián)系方式.txt
    下載

相關(guān)推薦

方案定制

去合作
方案開發(fā)定制化,2000+方案商即時響應(yīng)!