新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于STM32的避障小車

        基于STM32的避障小車

        作者:MarsZ 時間:2025-04-18 來源:EEPW 收藏


        本文引用地址:http://www.104case.com/article/202504/469573.htm

        1   概述

        基于的遙控避障循跡小車,超聲波模塊實現避障功能,總體來說還是比較簡單的,對初學者很友好。

        調整舵機方向:通過的GPIO引腳向舵機發送控制信號,逐步調整其轉動角度,以改變小車頭部的朝向。可以使用簡單的算法(如逐步掃描或根據超聲波傳感器數據直接調整)來確定舵機的最佳轉向角度。

        檢測新方向上的障礙物:在舵機調整方向后,再次使用超聲波傳感器測量新方向上的障礙物距離。

        選擇行駛路徑:根據新方向上的障礙物距離,決定小車是繼續在該方向上行駛、返回原方向、還是嘗試其他方向。

        控制驅動電機:根據避障決策,控制小車的驅動電機以實現前進、后退或原地轉向等操作。

        電機驅動模塊

        1744985368266949.png

        將GPIOA口的二號和三號引腳設置為復用推挽輸出,使其不僅具有高驅動能力還能使用引腳復用的功能,作為PWM輸出口。然后設置4、5、6、7分別為電機的方向控制引腳。

        1744985426941920.png

        開啟定時器二的時鐘(不開啟的話也是默認開啟的),配置實基單元為不分頻、向上計數、計數周期為100、預分頻為36分頻(計數周期100 是為了計算占空比的時候好計算,36分頻是為了配合計數周期讓輸出頻率達到20000Hz,從而解決電機受阻時發出噪聲)、重復計數器設置為0(只有高級定時器才有)。

        輸出比較配置:設置默認配置、比較模式為PWM1、極性選擇無、使能、CCR 值為0。

        使能定時器二。

        1744985493835644.png

        1744985525995483.png

        通過控制方向控制引腳高低電平變化來實現控制正轉還是反轉。

        當方向控制引腳被設置為高電平時,驅動電路內部的邏輯電路會相應地調整電流的流向,使得電機內部磁場的方向發生變化,從而驅動電機開始正轉。這一過程中,電能的轉換與傳輸效率至關重要,它決定了電機能否迅速、平穩地響應控制指令。

        相反地,當方向控制引腳被設置為低電平時,驅動電路會接收到另一個電平信號,并據此調整電流路徑,改變電機內部磁場的方向,使電機開始反轉。這一切換過程迅速且精確,是實現電機雙向控制的關鍵。

        image.png

        直線行駛:當需要小車直線行駛時,同時給兩側電機發送相同的控制信號,使它們以相同的速度和方向旋轉。這樣,小車兩側的車輪就會以相同的速度和方向前進,從而保持直線行駛。

        轉向行駛:

        左轉:為了實現左轉,可以增加左側電機的速度或減小右側電機的速度(或使右側電機反轉,但通常不推薦這種方式,因為它可能導致小車打滑或不穩定)。這樣,左側車輪會比右側車輪轉得更快,從而使小車向左偏轉。

        右轉:與左轉相反,為了右轉,可以增加右側電機的速度或減小左側電機的速度(或使左側電機反轉)。

        這樣,右側車輪會比左側車輪轉得更快,從而使小車向右偏轉。

        超聲波測距:

        1744985618447881.png

        1745155665394002.png

        的某個GPIO 引腳配置為推挽輸出模式,用于向HC-SR04發送觸發信號(Trig)。

        將另一個GPIO 引腳配置為浮空輸入模式,用于接收HC-SR04的回波信號(Echo)。

        2.發送超聲波

        通過向Trig 引腳發送一個至少10 微秒的高電平信號來觸發HC-SR04發送超聲波。

        發送完觸發信號后,將Trig引腳拉低,等待Echo引腳接收回波信號。

        3.接收回波并計算距離

        初始化一個定時器或計數器,用于測量Echo引腳從低電平變為高電平(超聲波發出)到再次變為低電平(超聲波返回并被接收)的時間差(T)。

        定時器或計數器應配置為足夠高的頻率,以便精確測量微秒級的時間差。

        使用公式距離=(T*聲速)/2來計算障礙物距離,其中聲速約為340m/s(或轉換為cm單位:距離(cm)=(T*100*聲速(cm/s)/2)。

        超聲波避障:

        1744986162238957.png

        void obstacle_avoidance(void){

        uint16_t Dis1 = 0;

        uint16_t Dis2 = 0;

        uint16_t Dis3 = 0;

        uint16_t Dis4 = 0;

        uint16_t Dis5 = 0;

        Speed1 = Motor_Speed();

        Car_ForWard(Speed1);

        Dis1 = Test_Distance();

        Serial_SnedNumber(Dis1,3);

        OLED_ShowNum(4,11,Dis1/100%10,1);

        OLED_ShowNum(4,12,Dis1/10%10,1);

        OLED_ShowNum(4,13,Dis1%10,1);

        if(Dis1 < 15){

        Car_Stop();

        Servo_SetPwm(20);

        Servo_SetPwm4(30);

        Delay_ms (1000);

        Dis2 = Test_Distance();

        Serial_SnedNumber(Dis2,3);

        if(Dis2 < 15){

        Car_Stop();

        Servo_SetPwm(160);

        Servo_SetPwm4(30);

        Delay_ms (1000);

        Dis3 = Test_Distance();

        Serial_SnedNumber(Dis3,3);

        if(Dis3 < 15){

        Car_Stop();

        Servo_SetPwm(90);

        Servo_SetPwm4(0);

        Car_Retret(Speed1);

        Servo_SetPwm(160);

        Servo_SetPwm4(90);

        Delay_ms (1000);

        Dis4 = Test_Distance();

        Serial_SnedNumber(Dis4,3);

        if(Dis4 > 15){

        Servo_SetPwm(90);

        Servo_SetPwm4(0);

        Car_Left(Speed1);

        Delay_ms (1000);

        }else{

        Servo_SetPwm(20);

        Servo_SetPwm4(30);

        Delay_ms (1000);

        Dis5 = Test_Distance();

        Serial_SnedNumber(Dis5,3);

        if(Dis5 > 15){

        Servo_SetPwm(90);

        Servo_SetPwm4(0);

        Car_Right(Speed1);

        Delay_ms (1000);

        }else{

        Servo_SetPwm(90);

        Servo_SetPwm4(0);

        Car_Right(Speed1);

        Delay_ms (4000);

        }

        }

        }else{

        Servo_SetPwm(90);

        Servo_SetPwm4(0);

        Delay_ms (1000);

        Car_Left(Speed1);

        Delay_ms (1000);

        Car_ForWard(Speed1);

        }

        }else{

        Servo_SetPwm(90);

        Servo_SetPwm4(0);

        Delay_ms (1000);

        Car_Right(Speed1);

        Delay_ms (1000);

        Car_ForWard(Speed1);

        }

        }else{

        Car_ForWard(Speed1);

        }

        }

        調整舵機方向:通過STM32的GPIO引腳向舵機發送控制信號,逐步調整其轉動角度,以改變小車頭部的朝向。可以使用簡單的算法(如逐步掃描或根據超聲波傳感器數據直接調整)來確定舵機的最佳轉向角度。

        檢測新方向上的障礙物:在舵機調整方向后,再次使用超聲波傳感器測量新方向上的障礙物距離。

        選擇行駛路徑:根據新方向上的障礙物距離,決定小車是繼續在該方向上行駛、返回原方向、還是嘗試其他方向。

        控制驅動電機:根據避障決策,控制小車的驅動電機以實現前進、后退或原地轉向等操作。

        (本文來源于《EEPW》20504)



        關鍵詞: 202504 STM32 避障小車

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 东莞市| 梨树县| 昌都县| 南丹县| 莱芜市| 特克斯县| 长宁区| 宣威市| 龙岩市| 昭通市| 尼勒克县| 射阳县| 夏邑县| 苍山县| 衡阳市| 新丰县| 吉首市| 济南市| 邵武市| 东海县| 南宫市| 霍城县| 彭山县| 潢川县| 巴林左旗| 隆化县| 淳化县| 沅江市| 阿鲁科尔沁旗| 紫金县| 厦门市| 子洲县| 余姚市| 清涧县| 江都市| 罗定市| 高尔夫| 太仓市| 抚州市| 蓬溪县| 高雄县|