新聞中心

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

        基于STM32的避障小車

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


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

        1   概述

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

        調(diào)整舵機方向:通過的GPIO引腳向舵機發(fā)送控制信號,逐步調(diào)整其轉(zhuǎn)動角度,以改變小車頭部的朝向??梢允褂煤唵蔚乃惴ǎㄈ缰鸩綊呙杌蚋鶕?jù)超聲波傳感器數(shù)據(jù)直接調(diào)整)來確定舵機的最佳轉(zhuǎn)向角度。

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

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

        控制驅(qū)動電機:根據(jù)避障決策,控制小車的驅(qū)動電機以實現(xiàn)前進、后退或原地轉(zhuǎn)向等操作。

        電機驅(qū)動模塊

        1744985368266949.png

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

        1744985426941920.png

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

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

        使能定時器二。

        1744985493835644.png

        1744985525995483.png

        通過控制方向控制引腳高低電平變化來實現(xiàn)控制正轉(zhuǎn)還是反轉(zhuǎn)。

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

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

        image.png

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

        轉(zhuǎn)向行駛:

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

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

        這樣,右側(cè)車輪會比左側(cè)車輪轉(zhuǎn)得更快,從而使小車向右偏轉(zhuǎn)。

        超聲波測距:

        1744985618447881.png

        1745155665394002.png

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

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

        2.發(fā)送超聲波

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

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

        3.接收回波并計算距離

        初始化一個定時器或計數(shù)器,用于測量Echo引腳從低電平變?yōu)楦唠娖剑ǔ暡òl(fā)出)到再次變?yōu)榈碗娖剑ǔ暡ǚ祷夭⒈唤邮眨┑臅r間差(T)。

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

        使用公式距離=(T*聲速)/2來計算障礙物距離,其中聲速約為340m/s(或轉(zhuǎn)換為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);

        }

        }

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

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

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

        控制驅(qū)動電機:根據(jù)避障決策,控制小車的驅(qū)動電機以實現(xiàn)前進、后退或原地轉(zhuǎn)向等操作。

        (本文來源于《EEPW》20504)



        關鍵詞: 202504 STM32 避障小車

        評論


        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 蒙自县| 恭城| 大埔区| 巩义市| 扶风县| 民乐县| 米林县| 扬州市| 西充县| 尉犁县| 乌拉特中旗| 东乡族自治县| 兰溪市| 正阳县| 平和县| 吉隆县| 个旧市| 潮安县| 邵东县| 宁安市| 龙胜| 梅州市| 清水河县| 哈巴河县| 平远县| 广宗县| 涪陵区| 伊宁市| 濮阳市| 兰考县| 永善县| 缙云县| 雅安市| 密云县| 利辛县| 抚州市| 阳西县| 呈贡县| 余庆县| 香格里拉县| 平谷区|