0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

第17章-用6050走直線和轉(zhuǎn)90度功能 平衡車入門---MPU6050陀螺儀的使用 超詳細(xì)陀螺儀MPU6050模塊輸出姿態(tài)角

dfhjgfg ? 來源:dfhjgfg ? 作者:dfhjgfg ? 2024-08-21 15:25 ? 次閱讀

功能介紹放開頭, 使用便捷無需愁

這是全網(wǎng)最詳細(xì)、性價(jià)比最高的STM32實(shí)戰(zhàn)項(xiàng)目入門教程,通過合理的硬件設(shè)計(jì)和詳細(xì)的視頻筆記介紹,硬件使用STM32F103主控資料多方便學(xué)習(xí),通過3萬字筆記、12多個(gè)小時(shí)視頻、20多章節(jié)代碼手把手教會(huì)你如何開發(fā)和調(diào)試。讓你更快掌握嵌入式系統(tǒng)開發(fā)。

**V3.3.0-STM32智能小車 **

**視頻: **[https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click]

V3:HAL庫開發(fā)、功能:PID速度控制、PID循跡、PID跟隨、遙控、避障、PID角度控制、視覺控制、電磁循跡、RTOS等功能。

第17章-用6050走直線和轉(zhuǎn)90度功能

17.1-6050姿態(tài)數(shù)據(jù)讀取

STM32讀取6050數(shù)據(jù)

先把我們的參考?xì)v程里面的6050文件復(fù)制過去
在這里插入圖片描述
添加文件
在這里插入圖片描述
在這里插入圖片描述
然后在魔術(shù)棒添加上面兩個(gè)的路徑,不再截圖了。
簡單閱讀代碼,知道 我們需要設(shè)置兩個(gè)引腳,這兩個(gè)引腳使用模擬IIC讀取6050數(shù)據(jù)
1.在****mpuiic.c延時(shí)使用自己寫的、引腳需要使用兩個(gè)先設(shè)置推挽輸出、高電平**
**在這里插入圖片描述

void mpuiic_Delayus(uint32_t usdelay)
{
  __IO uint32_t Delay = usdelay * (SystemCoreClock /8U/1000U/1000);//SystemCoreClock:系統(tǒng)頻率
  do
  {
    __NOP();//使用空指令延時(shí)、移植不同單片機(jī)注意__NOP(); 執(zhí)行時(shí)間
  }
  while (Delay --);
}
  //MPU IIC 延時(shí)函數(shù)
void MPU_IIC_Delay(void)
{
mpuiic_Delayus(2);
}
?
//初始化IIC
void MPU_IIC_Init(void)
{     
//  GPIO_InitTypeDef  GPIO_InitStructure;
//
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//先使能外設(shè)IO PORTB時(shí)鐘 
//
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; // 端口配置
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽輸出
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
//  GPIO_Init(GPIOB, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIO 
//
//  GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11); //PB10,PB11 輸出高

}

使用軟件初始化兩個(gè)引腳

6050_SDA--PB9

6050_SCL--PB8
在這里插入圖片描述
PB8-輸出模式-起始輸出高電平
在這里插入圖片描述
PB9 輸出模式 起始狀態(tài)高電平
在這里插入圖片描述
生成代碼

打開我們的代碼,是通過模擬IIC 讀取6050數(shù)據(jù)的,我們知道SDA是模擬IIC的數(shù)據(jù)線 所以通信過程中是再輸入和輸出模式中切換的,但是我們的STM32CubeMX是設(shè)置的輸出,是在哪里更改的模式那?

是通過寄存器設(shè)置的,在mpuiic.h可以看到

刪除掉#include "sys.h"

把這個(gè)修改了
在這里插入圖片描述
2.在****mpuiic.h更改相內(nèi)容

改成下面這樣的
在這里插入圖片描述

//IO方向設(shè)置 設(shè)置SDA-PB9為輸入或者輸出
#define MPU_SDA_IN()  {GPIOB- >CRH&=0XFFFFFF0F;GPIOB- >CRH|=8< 
#define MPU_SDA_OUT() {GPIOB- >CRH&=0XFFFFFF0F;GPIOB- >CRH|=3< 
  1. 這是通過****按位與后賦值 &=按位或后賦值 |=
  2. 設(shè)置****端口配置高寄存器指定位。

先看一個(gè)例子
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
更改設(shè)置SDA與SCL電平的宏
在這里插入圖片描述

//IO操作函數(shù) 
#define MPU_IIC_SCL_Hige    HAL_GPIO_WritePin(SCL_6050_GPIO_Port,SCL_6050_Pin,GPIO_PIN_SET)//設(shè)置SCL高電平
#define MPU_IIC_SCL_Low      HAL_GPIO_WritePin(SCL_6050_GPIO_Port,SCL_6050_Pin,GPIO_PIN_RESET)//設(shè)置SCL低電平
#define MPU_IIC_SDA_Hige        HAL_GPIO_WritePin(SDA_6050_GPIO_Port,SDA_6050_Pin,GPIO_PIN_SET)   //設(shè)置SDA高電平
#define MPU_IIC_SDA_Low         HAL_GPIO_WritePin(SDA_6050_GPIO_Port,SDA_6050_Pin,GPIO_PIN_RESET) //設(shè)置SDA低電平
   
#define MPU_READ_SDA            HAL_GPIO_ReadPin(SDA_6050_GPIO_Port,SDA_6050_Pin)    //讀SDA電平

更改一下 mupiic.c文件

//把之前的MPU_IIC_SDA=1; 換成 MPU_IIC_SDA_Hige;
//MPU_IIC_SDA=0; 換成 MPU_IIC_SDA_Low;
//MPU_IIC_SCL=1;  換成 MPU_IIC_SCL_Hige;
//MPU_IIC_SCL=0;  換成 MPU_IIC_SCL_Low;
//

編譯一下、刪掉沒有用的文件

把u8 替換為uint8_t
在這里插入圖片描述
**t替換一下,u8 替換為uint8_t u32替換為uint32_t **

可以一個(gè)文件一個(gè)文件的替換掉,如果整個(gè)工程替換其他HAL庫文件內(nèi)容也可能改變了
在這里插入圖片描述
刪除多余的庫文件

注釋掉
在這里插入圖片描述
如果有其他的delay_ms 都替換為HAL_Delay

還有一個(gè)錯(cuò)誤

if((txd&0x80) >>7) MPU_IIC_SDA_Hige;
else MPU_IIC_SDA_Low;

在這里插入圖片描述
編譯一下 、沒有錯(cuò)誤和警告

然后在main.c中定義變量和添加同文件

float pitch,roll,yaw; // 俯仰角 橫滾角 航向角
?
#include "mpu6050.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"

在這里插入圖片描述
替換inv_mpu.h的

#include "stm32f1xx_it.h"

在這里插入圖片描述
初始化6050

HAL_Delay(500);//延時(shí)0.56050上電穩(wěn)定后初始化
  MPU_Init(); //初始化MPU6050
  while(MPU_Init()!=0);
  while(mpu_dmp_init()!=0);

在這里插入圖片描述
我們通過下面的代碼獲得數(shù)據(jù)

sprintf((char *)Usart3String,"pitch:%.2f roll:%.2f yaw:%.2frn",pitch,roll,yaw);//顯示6050數(shù)據(jù)
	HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const  char  *)Usart3String),0xFFFF);//通過串口三輸出字符 strlen:計(jì)算字符串大小	

   //mpu_dmp_get_data(&pitch,&roll,&yaw);//返回值:0,DMP成功解出歐拉角
    while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0){}  //這個(gè)可以解決經(jīng)常讀不出數(shù)據(jù)的問題

在這里插入圖片描述
然后我看一下 這個(gè)Usart3String 現(xiàn)在發(fā)送的大概多大的?
在這里插入圖片描述

uint8_t OledString[50];
uint8_t Usart3String[50];

編譯、燒錄、然后就可以連接手機(jī)藍(lán)牙,在藍(lán)牙軟件查看數(shù)據(jù)了
在這里插入圖片描述

17.2-利用6050直線和90度(有代碼)

為什么小車還是不能走直線

為什么兩個(gè)電機(jī)轉(zhuǎn)速一樣不能走非常正直線,如何控制小車轉(zhuǎn)彎90度。

當(dāng)然,我們可以開環(huán)控制,但是控制效果可能不好,受外界影響比較大。

如果我們使用閉環(huán)控制,就要使用一個(gè)傳感器來獲得現(xiàn)在小車角度。
在這里插入圖片描述
[https://www.bilibili.com/video/BV1UV4y1p7Hd/?spm_id_from=333.337.search-card.all.click]

走直線(控制朝一個(gè)方向運(yùn)動(dòng))

在pid.c中定義一個(gè)姿態(tài)控制使用的PID
在這里插入圖片描述

tPid pidMPU6050YawMovement;  //利用6050偏航角 進(jìn)行姿態(tài)控制的PID

在這里插入圖片描述

pidMPU6050YawMovement.actual_val=0.0;
	pidMPU6050YawMovement.target_val=0.00;//設(shè)定姿態(tài)目標(biāo)值
	pidMPU6050YawMovement.err=0.0;
	pidMPU6050YawMovement.err_last=0.0;
	pidMPU6050YawMovement.err_sum=0.0;
	pidMPU6050YawMovement.Kp=2;//定距離跟隨的Kp大小通過估算PID輸入輸出數(shù)據(jù),確定大概大小,然后在調(diào)試
	pidMPU6050YawMovement.Ki=0;
	pidMPU6050YawMovement.Kd=0;

仿照之前紅外循跡代碼編寫姿態(tài)控制函數(shù)
在這里插入圖片描述

float  g_fMPU6050YawMovePidOut = 0.00f; //姿態(tài)PID運(yùn)算輸出
float  g_fMPU6050YawMovePidOut1 = 0.00f; //第一個(gè)電機(jī)控制輸出
float  g_fMPU6050YawMovePidOut2 = 0.00f; //第一個(gè)電機(jī)控制輸出

走直線程序如下(因?yàn)樯想姵跏蓟瘯r(shí)候航向角是0、而且pidMPU6050YawMovementPID結(jié)構(gòu)體的目標(biāo)值target_val 也是0)
在這里插入圖片描述


//*************MPU6050航向角 PID轉(zhuǎn)向控制*****************//

sprintf((char *)Usart3String,"pitch:%.2f roll:%.2f yaw:%.2frn",pitch,roll,yaw);//顯示6050數(shù)據(jù) 俯仰角 橫滾角 航向角
HAL_UART_Transmit(&huart3,( uint8_t *)Usart3String,strlen(( const char *)Usart3String),0xFFFF);//通過串口三輸出字符 strlen:計(jì)算字符串大小

//mpu_dmp_get_data(&pitch,&roll,&yaw);//返回值:0,DMP成功解出歐拉角
while(mpu_dmp_get_data(&pitch,&roll,&yaw)!=0){} //這個(gè)可以解決經(jīng)常讀不出數(shù)據(jù)的問題


g_fMPU6050YawMovePidOut = PID_realize(&pidMPU6050YawMovement,yaw);//PID計(jì)算輸出目標(biāo)速度 這個(gè)速度,會(huì)和基礎(chǔ)速度加減

g_fMPU6050YawMovePidOut1 = 1.5 + g_fMPU6050YawMovePidOut;//基礎(chǔ)速度加減PID輸出速度
g_fMPU6050YawMovePidOut2 = 1.5 - g_fMPU6050YawMovePidOut;
if(g_fMPU6050YawMovePidOut1 >3.5) g_fMPU6050YawMovePidOut1 =3.5;//進(jìn)行限幅
if(g_fMPU6050YawMovePidOut1 <0) g_fMPU6050YawMovePidOut1 =0;
if(g_fMPU6050YawMovePidOut2 >3.5) g_fMPU6050YawMovePidOut2 =3.5;
if(g_fMPU6050YawMovePidOut2 <0) g_fMPU6050YawMovePidOut2 =0;
motorPidSetSpeed(g_fMPU6050YawMovePidOut1,g_fMPU6050YawMovePidOut2);

然后調(diào)節(jié)PID參數(shù)

**順序 先確定P 正負(fù) 然后P大小 **

然后D正負(fù) 然后D大小

最后調(diào)節(jié)的參數(shù)如下
在這里插入圖片描述

pidMPU6050YawMovement.Kp=0.02;//6050航向角PID運(yùn)動(dòng)控制 
	pidMPU6050YawMovement.Ki=0;
	pidMPU6050YawMovement.Kd=0.1;

然后我們把小車放在地上就可以完成一直朝著初始方向前進(jìn),如果往側(cè)面推也會(huì)馬上矯正。

轉(zhuǎn)彎90度功能(控制轉(zhuǎn)彎角度)

然后我們?cè)黾右幌?,如何旋轉(zhuǎn)90度程序

在串口接收回調(diào)函數(shù)表姿態(tài)PID的目標(biāo)值
在這里插入圖片描述

extern tPid pidMPU6050YawMovement;  //利用6050偏航角 進(jìn)行姿態(tài)控制的PID

在這里插入圖片描述

if(g_ucUsart3ReceiveData == 'H')//轉(zhuǎn)向90度
		{				
			if(pidMPU6050YawMovement.target_val <= 180)pidMPU6050YawMovement.target_val += 90;//目標(biāo)值
		}
		if(g_ucUsart3ReceiveData == 'I')//轉(zhuǎn)回90度
		{				
			if(pidMPU6050YawMovement.target_val >= -180)pidMPU6050YawMovement.target_val -= 90;//目標(biāo)值
        }

然后我們的藍(lán)牙APP增加兩個(gè)發(fā)送按鈕的設(shè)置
在這里插入圖片描述
現(xiàn)象 是上電小車向初始方向直行,如果推小車車頭方向,小車能夠立馬矯正。

然后連接藍(lán)牙發(fā)送轉(zhuǎn)90度 小車會(huì)轉(zhuǎn)90度,按下 轉(zhuǎn)回90度小車回轉(zhuǎn)回。

這樣我們就把6050轉(zhuǎn)向程序?qū)懲炅?,下面開始 把上面代碼如何結(jié)合一下,然后講解如何增加視覺功能。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 陀螺儀
    +關(guān)注

    關(guān)注

    44

    文章

    774

    瀏覽量

    98387
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4694

    瀏覽量

    68074
  • 平衡車
    +關(guān)注

    關(guān)注

    7

    文章

    79

    瀏覽量

    26850
  • MPU6050
    +關(guān)注

    關(guān)注

    38

    文章

    307

    瀏覽量

    70944
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    我為什么要用陀螺儀MPU6050的理由,你有嗎?

    ` 本帖最后由 說的好像真的 于 2015-5-7 09:42 編輯 MPU6050為什么那么多人呢?怎么好用我就不說了。作為全球首例整合性6軸運(yùn)動(dòng)處理組件,免除組合陀螺儀和加速器之軸間差
    發(fā)表于 05-06 11:54

    STM32F407ZE驅(qū)動(dòng)陀螺儀MPU6050有何應(yīng)用

    STM32F407ZE驅(qū)動(dòng)陀螺儀MPU6050有何應(yīng)用?STM32F407ZE驅(qū)動(dòng)陀螺儀MPU6050有哪些功能呢?
    發(fā)表于 11-15 06:23

    陀螺儀MPU6050的相關(guān)資料推薦

    維護(hù)方位和角速度的設(shè)備。它是一個(gè)旋轉(zhuǎn)的輪子或圓盤,其中旋轉(zhuǎn)軸可以不受影響的設(shè)定在任何方向。當(dāng)旋轉(zhuǎn)發(fā)生時(shí),根據(jù)角動(dòng)量守恒定律,該軸的方向不受支架傾斜或旋轉(zhuǎn)的影響。2.MPU6050三位角度加速度陀螺儀??
    發(fā)表于 02-10 06:35

    STM32 MPU6050平衡的相關(guān)資料推薦

    目錄GY-521MPU6050 介紹陀螺儀加速度計(jì)陀螺儀和加速度計(jì)的關(guān)系,姿態(tài)解算融合的原理硬件從機(jī)地址部分參考STM32—驅(qū)動(dòng)六軸MPU6050
    發(fā)表于 02-10 07:45

    MPU6050陀螺儀原理圖代碼

    MPU6050陀螺儀使用( 原理圖代碼 )
    發(fā)表于 10-29 15:24 ?96次下載

    三軸陀螺儀MPU6050的測(cè)試程序免費(fèi)下載

      InvenSense 公司的三軸陀螺儀MPU6050 測(cè)試程序。IIC 接口, 51 單片機(jī)驅(qū)動(dòng), LCD1602 同步顯示。
    發(fā)表于 07-19 17:48 ?36次下載
    三軸<b class='flag-5'>陀螺儀</b><b class='flag-5'>MPU6050</b>的測(cè)試程序免費(fèi)下載

    使用MSP430單片機(jī)應(yīng)用MPU6050陀螺儀的程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用MSP430單片機(jī)應(yīng)用MPU6050陀螺儀的程序免費(fèi)下載。
    發(fā)表于 07-24 16:03 ?70次下載

    MPU6050陀螺儀傳感器的電路原理圖免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是MPU6050陀螺儀傳感器的電路原理圖免費(fèi)下載。
    發(fā)表于 07-26 17:35 ?103次下載
    <b class='flag-5'>MPU6050</b><b class='flag-5'>陀螺儀</b>傳感器的電路原理圖免費(fèi)下載

    MPU6050陀螺儀詳細(xì)C語言程序合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是MPU6050陀螺儀詳細(xì)C語言程序合集免費(fèi)下載包括了:陀螺儀MPU6050
    發(fā)表于 07-30 17:22 ?66次下載
    <b class='flag-5'>MPU6050</b><b class='flag-5'>陀螺儀</b>的<b class='flag-5'>詳細(xì)</b>C語言程序合集免費(fèi)下載

    MPU6050陀螺儀傳感器的資料合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是MPU6050陀螺儀傳感器的資料合集免費(fèi)下載。
    發(fā)表于 05-18 08:00 ?138次下載
    <b class='flag-5'>MPU6050</b><b class='flag-5'>陀螺儀</b>傳感器的資料合集免費(fèi)下載

    MPU6050六軸陀螺儀傳感器實(shí)驗(yàn)的資料合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是MPU6050六軸陀螺儀傳感器實(shí)驗(yàn)的資料合集免費(fèi)下載。
    發(fā)表于 06-02 08:00 ?28次下載
    <b class='flag-5'>MPU6050</b>六軸<b class='flag-5'>陀螺儀</b>傳感器實(shí)驗(yàn)的資料合集免費(fèi)下載

    平衡小車制作】(四)陀螺儀MPU6050詳解)

    維護(hù)方位和角速度的設(shè)備。它是一個(gè)旋轉(zhuǎn)的輪子或圓盤,其中旋轉(zhuǎn)軸可以不受影響的設(shè)定在任何方向。當(dāng)旋轉(zhuǎn)發(fā)生時(shí),根據(jù)角動(dòng)量守恒定律,該軸的方向不受支架傾斜或旋轉(zhuǎn)的影響。2.MPU6050三位角度加速度陀螺儀??
    發(fā)表于 12-06 13:06 ?30次下載
    【<b class='flag-5'>平衡</b>小車制作】(四)<b class='flag-5'>陀螺儀</b><b class='flag-5'>MPU6050</b>(<b class='flag-5'>超</b>詳解)

    學(xué)習(xí)記錄--陀螺儀模塊MPU6050:IIC通信,us延時(shí)函數(shù))

    :(11條消息) STM32—驅(qū)動(dòng)六軸MPU6050輸出歐拉角_肥宅快樂博客-CSDN博客_mpu6050歐拉角)1,bsp_mpuiic(用來與陀螺儀進(jìn)行IIC通信,IIC的底層驅(qū)動(dòng)
    發(fā)表于 12-06 13:51 ?1次下載
    學(xué)習(xí)記錄--<b class='flag-5'>陀螺儀</b><b class='flag-5'>模塊</b>(<b class='flag-5'>MPU6050</b>:IIC通信,us延時(shí)函數(shù))

    STM32F407ZE開發(fā)板MPU6050陀螺儀的應(yīng)用

    STM32F407ZE開發(fā)板MPU6050陀螺儀的應(yīng)用
    發(fā)表于 12-06 14:36 ?11次下載
    STM32F407ZE開發(fā)板<b class='flag-5'>MPU6050</b><b class='flag-5'>陀螺儀</b>的應(yīng)用

    MPU6050的Arduino陀螺儀游戲

    電子發(fā)燒友網(wǎng)站提供《帶MPU6050的Arduino陀螺儀游戲.zip》資料免費(fèi)下載
    發(fā)表于 11-11 11:20 ?1次下載
    帶<b class='flag-5'>MPU6050</b>的Arduino<b class='flag-5'>陀螺儀</b>游戲