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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

第七章-V1.5 STM32超聲波測距STM32F103C8t6超聲波避障小車 超聲波避障模塊 STM32超聲波測距

STM32智能小車V1.5 ? 來源:dfhjgfg ? 作者:dfhjgfg ? 2024-08-15 16:25 ? 次閱讀

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

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

V1.5.0-STM32智能小車

V1.5.0:庫函數(shù)開發(fā)。功能:循跡、避障、跟隨、遙控、電池電壓顯示等。

視頻合集鏈接推薦觀看

[https://www.bilibili.com/video/BV1SY411L7rJ/?spm_id_from=333.337.search-card.all.click]

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

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

視頻合集鏈接推薦觀看

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

超聲波測距

通過超聲波的硬件介紹我們知道
MCU給Trig腳一個大于10us的高電平脈沖;然后讀取Echo腳的高電平信號時間,通過公式:距離 = T *
聲速/2 就可以算出來距離。
軟件方面:10us高電平脈沖通過GPIO輸出實現(xiàn),高電平信號時間我們通過定時器的輸入捕獲來計算
的。
初始化脈沖引腳PA0
led.c中的SR04初始化函數(shù)

void SR04_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_0);
}

led.h有關宏定義和聲明

#define SR04 PAout(0) // PA0
void SR04_GPIO_Init(void);
?

初始化PA1輸入捕獲

查看數(shù)據(jù)手冊
在這里插入圖片描述
初始化定時器2 通道2 輸入捕獲相關功能

//定時器2通道2輸入捕獲配置
TIM_ICInitTypeDef TIM2_ICInitStructure;
void TIM2_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //PA1 清除之前設置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA1 輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_1); //PA1 下拉
//初始化定時器5 TIM5
TIM_TimeBaseStructure.TIM_Period = arr; //設定計數(shù)器自動重裝值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //預分頻器
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS =
Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數(shù)模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中
指定的參數(shù)初始化TIMx的時間基數(shù)單位
//初始化TIM5輸入捕獲參數(shù)
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2; // 選擇輸入端 IC2映射到TI2
上
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕獲
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI2上
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置輸入分頻,不分頻
TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置輸入濾波器 不濾波
TIM_ICInit(TIM2, &TIM2_ICInitStructure);
//中斷分組初始化
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占優(yōu)先級2級
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //從優(yōu)先級0級
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設NVIC
寄存器
TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC2,ENABLE);//允許更新中斷 ,允許CC2IE捕獲
中斷
TIM_Cmd(TIM2,ENABLE ); //使能定時器2
}
u8 TIM5CH1_CAPTURE_STA=0; //輸入捕獲狀態(tài)
u16 TIM5CH1_CAPTURE_VAL; //輸入捕獲值
//定時器2中斷服務程序
void TIM2_IRQHandler(void)
{
if((TIM5CH1_CAPTURE_STA&0X80)==0)//還未成功捕獲
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
if(TIM5CH1_CAPTURE_STA&0X40)//已經(jīng)捕獲到高電平了
{
if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高電平太長了
{
TIM5CH1_CAPTURE_STA|=0X80;//標記成功捕獲了一次
TIM5CH1_CAPTURE_VAL=0XFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)//捕獲2發(fā)生捕獲事件
{
if(TIM5CH1_CAPTURE_STA&0X40) //捕獲到一個下降沿
{
TIM5CH1_CAPTURE_STA|=0X80; //標記成功捕獲到一次上升沿
TIM5CH1_CAPTURE_VAL=TIM_GetCapture2(TIM2);
TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC2P=0 設置為
上升沿捕獲
}else //還未開始,第一次捕獲上升沿
{
TIM5CH1_CAPTURE_STA=0; //清空
TIM5CH1_CAPTURE_VAL=0;
TIM_SetCounter(TIM2,0);
TIM5CH1_CAPTURE_STA|=0X40; //標記捕獲到了上升沿
TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling); //CC2P=1
設置為下降沿捕獲
}
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2|TIM_IT_Update); //清除中斷標志位
}
?

在time 中聲明初始化函數(shù)

void TIM2_Cap_Init(u16 arr,u16 psc);

計算輸出距離

在main.c聲明變量

extern u8 TIM5CH1_CAPTURE_STA; //輸入捕獲狀態(tài)
extern u16 TIM5CH1_CAPTURE_VAL; //輸入捕獲值

定義變量

int Distance =0;
int time=0;

調(diào)用初始化函數(shù)

SR04_GPIO_Init();
TIM2_Cap_Init(0XFFFF,72-1); //以1Mhz的頻率計數(shù)

完成測距的函數(shù)

delay_ms(500);//加入延時
HC_SR04 =0;
delay_us(10);
HC_SR04 = 1;
if(TIM5CH1_CAPTURE_STA&0X80)//成功捕獲到了一次上升沿
{
time=TIM5CH1_CAPTURE_STA&0X3F;
time*=65536;//溢出時間總和
time+=TIM5CH1_CAPTURE_VAL;//得到總的高電平時間
printf("rnHIGH:%d usrn",time);//打印總的高點平時間
Distance = time*0.033/2;
printf("cm:%drn",Distance);
TIM5CH1_CAPTURE_STA=0;//開啟下一次捕獲
}

封裝一下方便調(diào)用

int TCRT5000_Dist(void)
{
HC_SR04 = 1;
delay_us(13);
HC_SR04=0;
if(TIM5CH1_CAPTURE_STA&0X80)//成功捕獲到了一次上升沿
{
time=TIM5CH1_CAPTURE_STA&0X3F;
time*=65536;//溢出時間總和
time+=TIM5CH1_CAPTURE_VAL;//得到總的高電平時間
printf("rnHIGH:%d usrn",time);//打印總的高點平時間
Distance = time*0.033/2;
printf("cm:%drn",Distance);
TIM5CH1_CAPTURE_STA=0;//開啟下一次捕獲
}
return Distance;
}

使用串口助手查看結果
在這里插入圖片描述

練一練--編寫定距離跟隨功能

功能:根據(jù)根據(jù)超聲波測量距離跟隨前方物體

while(1){
HC_SR04 = 1;
delay_us(13);
HC_SR04=0;
if(TIM5CH1_CAPTURE_STA&0X80)//成功捕獲到了一次上
升沿
{
time=TIM5CH1_CAPTURE_STA&0X3F;
time*=65536;//溢出時間總和
time+=TIM5CH1_CAPTURE_VAL;//得到總的高電平時間
printf("rnHIGH:%d usrn",time);//打印總的高
點平時間
Distance = time*0.033/2;
printf("cm:%drn",Distance);
TIM5CH1_CAPTURE_STA=0;//開啟下一次捕獲
}
if(Distance >20)
{
Forward();
delay_ms(50);
}
if(Distance< 15)
{
Backward();
delay_ms(50);
}
AIN1 =0;
AIN2 = 0;
BIN1 = 0;
BIN2 =0;
}

練一練--結合舵機完成避障功能

功能:通過舵機旋轉(zhuǎn)不同角度,超聲波測量左右是否存在障礙物,控制小車運動。
測試舵機的轉(zhuǎn)角,不同占空比小車舵機的角度

TIM_SetCompare1(TIM3,80);
TIM_SetCompare1(TIM3,50);
TIM_SetCompare1(TIM3,110);

在這里插入圖片描述
整體邏輯

if(Mode == 3)
{
//超聲波避障
TIM_SetCompare1(TIM3,80); //舵機向前 使超聲波朝前方
delay_ms(200);
if(TCRT5000_Dist() >25)// 前方無障礙物
{
Forward();
delay_ms(500);
}
if(TCRT5000_Dist()< 25) //向前有障礙物
{
TIM_SetCompare1(TIM3,50); //舵機向右邊轉(zhuǎn)大約30度
delay_ms(200);
if(TCRT5000_Dist() >25)//右側(cè)無障礙物判斷
{
Rightward();
delay_ms(700);
}
else { //右邊有障礙物
TIM_SetCompare1(TIM3,100); //舵機向左邊轉(zhuǎn)大30delay_ms(200);
if(TCRT5000_Dist() >25)//左側(cè)無障礙物
{
Leftward();
delay_ms(700);
}
else{
Backward();//后退
delay_ms(700);
Rightward(); //右轉(zhuǎn)
delay_ms(700);
}
}
}
} }

綜合一下-縫合上面練一練的功能

功能:

  • 小車具有紅外對管循跡、藍牙遙控、定距離跟隨、避障運動模式
  • 可以通過小車按鍵和APP進行切換小車的運動模式。
  • APP與OLED顯示小車所處模式和超聲波測量值、電池電壓。
    實現(xiàn)切換功能必須
    ** main中的循環(huán)**
while(1)
{
sprintf((char *)string,"Distance:%d ",TCRT5000_Dist());// 顯示距離信息
這里的 %d 需要幾個空格
OLED_ShowString(6,3,string,16);
sprintf((char *)string,"Mode:%d",Mode);//顯示小車模式
OLED_ShowString(6,6,string,16);
if(Mode == 1)
{
//定距離跟隨
TIM_SetCompare1(TIM3,80); //超聲波舵機向前
if(TCRT5000_Dist() >25)// 距離太遠
{
Forward();
delay_ms(200);
}
if(TCRT5000_Dist() < 20)//距離太近
{
Backward();
delay_ms(200);
}
AIN1 =0;//車輛暫定 如果不加 小車就會一直往前或者一直往后
AIN2 =0;
BIN1 =0;
BIN2 =0;
}
if(Mode == 2)
{
//藍牙控制小車
TIM_SetCompare1(TIM3,80); //超聲波舵機向前
if(g_USART3_FLAG1 == 1) //前進
{
g_USART3_FLAG1=0;
Forward();
delay_ms(500);
}
if(g_USART3_FLAG1 == 2) //向右
{
g_USART3_FLAG1=0;
Rightward();
delay_ms(500);
}
if(g_USART3_FLAG1 ==3) //向左
{
g_USART3_FLAG1=0;
Leftward();
delay_ms(500);
}
if(g_USART3_FLAG1 ==4) //向后
{
g_USART3_FLAG1=0;
Backward();
delay_ms(500);
}
if(g_USART3_FLAG1 ==5) //停止
{
g_USART3_FLAG1=0;
AIN1=0;
AIN2=0;
BIN1=0;
BIN2=0;
delay_ms(500);
}
}
if(Mode == 3)
{
//超聲波避障
TIM_SetCompare1(TIM3,80); //舵機向前
delay_ms(200);
if(TCRT5000_Dist() >25)// 前方無障礙物
{
Forward();
delay_ms(500);
}
if(TCRT5000_Dist()< 25) //向前有障礙物
{
TIM_SetCompare1(TIM3,50); //舵機右轉(zhuǎn)
delay_ms(200);
if(TCRT5000_Dist() >25)//右側(cè)無障礙物判斷
{
Rightward();
delay_ms(700);
}
else {
TIM_SetCompare1(TIM3,100); //舵機向左
delay_ms(200);
if(TCRT5000_Dist() >25)//左側(cè)無障礙物
{
Leftward();
delay_ms(700);
}
else{
Backward();
delay_ms(700);//后退
Rightward();
delay_ms(700);
}
}
}
}
if(Mode == 4)
{
//紅外循跡
TIM_SetCompare1(TIM3,80); //超聲波舵機向前
if(HW_1 == 0&&HW_2 == 0&&HW_3 == 0&&HW_4 == 0)//應該
前進
{
Forward();
delay_ms(20);
}
if(HW_1 == 0&&HW_2 == 1&&HW_3 == 0&&HW_4 == 0)//應該右邊
{
Rightward();
delay_ms(150);
}
if(HW_1 == 1&&HW_2 == 0&&HW_3 == 0&&HW_4 == 0)//應該右邊
{
Rightward();
delay_ms(270);
}
if(HW_1 == 1&&HW_2 == 1&&HW_3 == 0&&HW_4 == 0)//應該右邊
{
Rightward();
delay_ms(370);
}
if(HW_1 == 0&&HW_2 == 0&&HW_3 == 1&&HW_4 == 0)//應該左邊
{
Leftward();
delay_ms(150);
}
if(HW_1 == 0&&HW_2 == 0&&HW_3 == 0&&HW_4 == 1)//應該左邊
{
Leftward();
delay_ms(270);
}
if(HW_1 == 0&&HW_2 == 0&&HW_3 == 1&&HW_4 == 1)//應該左邊
{
Leftward();
delay_ms(370);
}
}
if(Mode ==0)
{
delay_ms(1);
AIN1=0;
AIN2=0;
BIN1=0;
BIN2=0;
}
}

串口三中斷服務函數(shù)

//串口3 中斷處理函數(shù)
void USART3_IRQHandler (void)
{
u8 Res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
Res =USART_ReceiveData(USART3); //讀取接收到的數(shù)據(jù)
if(Res == 'A') g_USART3_FLAG1 = 1 ; //根據(jù)接受的數(shù)據(jù) 置為標志位
if(Res == 'B')g_USART3_FLAG1 = 2 ;
if(Res == 'C') g_USART3_FLAG1 = 3 ;
if(Res == 'D')g_USART3_FLAG1 = 4 ;
if(Res == 'E')g_USART3_FLAG1 = 5;
if(Res == 'F') Mode =1;
if(Res == 'G') Mode =2;
if(Res == 'H') Mode =3;
if(Res == 'I') Mode =4;
if(Res == 'J') Mode =0;
}
}

按鍵處理函數(shù)

void EXTI9_5_IRQHandler(void)//按鍵KEY_1 和KEY_2的中斷服務函數(shù)
{
delay_ms(10);//消抖
if(KEY_1 == 1) //判斷按鍵KEY_1 是否被按下
{
if(Mode == 4) Mode =1;
else
{
Mode = Mode + 1;
}
LED =! LED;
EXTI_ClearITPendingBit(EXTI_Line7); //清除LINE7上的中斷標志位
}
}
void EXTI15_10_IRQHandler(void)//按鍵KEY_SW1 和KEY_SW2的中斷服務函數(shù)
{
delay_ms(10);//消抖
if(KEY_2 == 0) //判斷按鍵KEY_2 是否被按下
{
Mode = 0 ;
LED =! LED;
EXTI_ClearITPendingBit(EXTI_Line12); //清除LINE12上的中斷標志位
}
}

手機APP-藍牙調(diào)試助手設置
在這里插入圖片描述

審核編輯 黃宇

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

    關注

    2262

    文章

    10846

    瀏覽量

    353650
  • 超聲波測距
    +關注

    關注

    5

    文章

    246

    瀏覽量

    37796
  • 避障小車
    +關注

    關注

    1

    文章

    24

    瀏覽量

    18988
  • STM32F103C8T6
    +關注

    關注

    106

    文章

    160

    瀏覽量

    82871
  • 超聲波避障
    +關注

    關注

    0

    文章

    5

    瀏覽量

    2801
收藏 人收藏

    評論

    相關推薦

    求助于超聲波測距制作高手

    可不可以給我發(fā)一個HC-SR04超聲波測距模塊驅(qū)動三位段數(shù)碼管的電路圖和程序,或者是超聲波
    發(fā)表于 04-05 17:15

    msp430的超聲波測距和循跡小車程序,跪求!

    msp430的超聲波測距和循跡小車程序,跪求
    發(fā)表于 04-17 17:58

    stm32超聲波源碼

    stm32超聲波 舵機信號口:A0 超聲波信號口:TRIG===B8ECHO==B9
    發(fā)表于 07-04 02:08

    基于STM32超聲波測距設計的合集

    ARM內(nèi)核芯片STM32F103ZET6的32位嵌入式微處理器與帶有溫度補償?shù)腢S-100超聲波測距模塊實現(xiàn)聲波
    發(fā)表于 09-05 16:13

    多點超聲波測距報警系統(tǒng)

    基本功能包括: 為了使移動小車能自動轉(zhuǎn)彎,就必須在小車上加裝測距系統(tǒng),為了能及時獲取距障礙物的距離和方向信息;制作了三方向(前、左、右)
    發(fā)表于 02-26 10:44

    基于STM32超聲波測距設計

    基于STM32F103超聲波測距(定時器)使用的硬件設備:stm32f103c8t6,0.96寸OLED,超聲波模塊HC-SR04廢話不多
    發(fā)表于 07-22 08:53

    淺析STM32 Cube MX實現(xiàn)超聲波工程

    STM32 Cube MX實現(xiàn)超聲波工程使用STM32 F103C8T6芯片,設計
    發(fā)表于 07-26 07:18

    怎樣去設計一種基于STM32超聲波小車

    超聲波小車是由哪些模塊組成的?怎樣去設計一種基于STM32
    發(fā)表于 09-27 06:59

    如何去實現(xiàn)一種基于超聲波測距模塊智能小車

    HC-SR04超聲波測距模塊的工作原理是什么?如何去實現(xiàn)一種基于超聲波測距模塊
    發(fā)表于 11-26 07:09

    如何去實現(xiàn)一種基于STM32超聲波小車代碼呢

    如何去實現(xiàn)一種基于STM32超聲波小車代碼呢?超聲波
    發(fā)表于 11-26 06:52

    如何利用STM32F103RCT6實現(xiàn)超聲波小車的設計?

    如何利用STM32F103RCT6實現(xiàn)超聲波小車的設計?
    發(fā)表于 01-20 06:47

    超聲波測距自由紅外小車

    問一下各位友友們,超聲波測距和紅外尋跡怎么結合在一起設計一個智能小車,求指導
    發(fā)表于 04-07 16:14

    STM32超聲波測距

    STM32超聲波測距
    發(fā)表于 11-23 17:08 ?56次下載

    stm32捕獲占空比_基于STM32超聲波小車

    stm32捕獲占空比_基于STM32超聲波小車
    發(fā)表于 11-22 19:21 ?46次下載
    <b class='flag-5'>stm32</b>捕獲占空比_基于<b class='flag-5'>STM32</b><b class='flag-5'>超聲波</b><b class='flag-5'>避</b><b class='flag-5'>障</b><b class='flag-5'>小車</b>

    stm32捕獲占空比_基于STM32超聲波小車

    stm32捕獲占空比_基于STM32超聲波小車
    發(fā)表于 11-23 16:21 ?56次下載
    <b class='flag-5'>stm32</b>捕獲占空比_基于<b class='flag-5'>STM32</b><b class='flag-5'>超聲波</b><b class='flag-5'>避</b><b class='flag-5'>障</b><b class='flag-5'>小車</b>