找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 777|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

大一新生第一輛循跡小車,問問大佬們怎么優(yōu)化調(diào)試小車啊,小車不能穩(wěn)定循跡,崩潰....

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1136591 發(fā)表于 2024-11-16 15:44 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
主函數(shù)
#include <REGX52.H>
#include "MotorTurn.h"
#include "State.h"
#include "Timer.h"
#include "Infrared.h"

void main()
{
        Timer0_Init();
        EA=1;
        while(1)
        {
                Track();
        }
}

定時(shí)器
#include <REGX52.H>

sbit ENA=P2^3;
sbit ENB=P2^5;

extern unsigned char CompareR;
extern unsigned char CompareL;
extern unsigned char Counter;

void Timer0_Init(void)         //100us
{
        TMOD &= 0xF0;                        
        TMOD |= 0x01;                        
        TL0 = 0xA4;                                
        TH0 = 0xFF;                        
        TF0 = 0;                                
        TR0 = 1;        
        ET0=1;
        EA=1;
        PT0=0;

}

void Timer0_Routinue() interrupt 1
{
        TL0 = 0xA4;        
        TH0 = 0xFF;
        
        Counter++;
        Counter%=100;
        if(Counter<CompareR)
        {
                ENB=1;
        }else{
                ENB=0;
        }
        if(Counter<CompareL)
        {
                ENA=1;
        }else{
                ENA=0;
        }
}

小車狀態(tài)
#include <REGX52.H>
#include "MotorTurn.h"
#include "Timer.h"


void Forward()
{
        RightForward();
        LeftForward();
}

void Back()
{
        RightBack();
        LeftBack();
}

void TurnRight()
{
        RightStop();
        LeftForward();
}

void TurnLeft()
{
        LeftStop();
        RightForward();
}

void Stop()
{
        RightStop();
        LeftStop();
}

紅外循跡
#include <REGX52.H>
#include "MotorTurn.h"
#include "State.h"
#include "Timer.h"
#include "Delay.h"

sbit D4=P1^4;   
sbit D3=P1^5;   
sbit D2=P1^6;   
sbit D1=P1^7;  

unsigned char CompareR;
unsigned char CompareL;
unsigned char Counter;
        
void Track()
{
        if(D2==1&&D3==1)              //小車停止
        {
                CompareR=0;
                CompareL=0;
                Stop();
        }
        
        if(D2==1&&D3==0)              //小車稍微左轉(zhuǎn)
        {
                CompareR=12;
                CompareL=0;
                Forward();
                if(D2==0&&D3==0)             //小車前進(jìn)
                {  
                        CompareR=15;
                        CompareL=15;
                        Forward();
                }
        
        }
        
        if(D2==0&&D3==1)             //小車稍微右轉(zhuǎn)
        {
                CompareR=0;
                CompareL=12;
                Forward();
                if(D2==0&&D3==0)             //小車前進(jìn)
                {  
                        CompareR=15;
                        CompareL=15;
                        Forward();
                }
        }
        
        if(D2==0&&D3==0)             //小車前進(jìn)
        {  
                CompareR=15;
                CompareL=15;
                Forward();
         }
        
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:404160 發(fā)表于 2024-11-16 17:22 | 只看該作者
可能導(dǎo)致不穩(wěn)定循跡的問題及優(yōu)化調(diào)試建議
(一)硬件相關(guān)
紅外傳感器布局與安裝角度:
問題:如果紅外傳感器安裝得不夠水平或者與地面的距離不一致,可能會(huì)導(dǎo)致不同傳感器接收到的反射光強(qiáng)度有較大差異,從而影響對黑線的準(zhǔn)確檢測。
調(diào)試建議:仔細(xì)檢查紅外傳感器的安裝情況,確保它們在同一水平面上且與地面的距離合適(一般幾毫米到一厘米左右,具體可根據(jù)實(shí)際情況調(diào)整)?梢允褂靡恍┹o助工具如水平儀等來保證安裝的準(zhǔn)確性。
電機(jī)性能差異:
問題:左右電機(jī)的轉(zhuǎn)速、扭矩等性能可能不完全一致,即使定時(shí)器設(shè)置相同的時(shí)間來控制電機(jī)轉(zhuǎn)動(dòng),也可能導(dǎo)致小車行駛軌跡出現(xiàn)偏差。
調(diào)試建議:單獨(dú)測試左右電機(jī),在相同的輸入條件下(如相同的電壓、相同的控制信號(hào)持續(xù)時(shí)間等),觀察它們的轉(zhuǎn)速和轉(zhuǎn)動(dòng)情況是否一致。如果存在明顯差異,可以考慮更換電機(jī)或者在軟件上進(jìn)行一些補(bǔ)償性的調(diào)整(比如根據(jù)實(shí)際測試結(jié)果,對左右電機(jī)的控制參數(shù)CompareR和CompareL進(jìn)行微調(diào))。
電源穩(wěn)定性:
問題:如果電源電壓不穩(wěn)定,可能會(huì)導(dǎo)致電機(jī)轉(zhuǎn)速波動(dòng),進(jìn)而影響小車的循跡穩(wěn)定性。
調(diào)試建議:使用萬用表等工具監(jiān)測電源電壓,確保在小車運(yùn)行過程中電壓保持在穩(wěn)定的范圍內(nèi)。如果電壓波動(dòng)較大,可以考慮增加穩(wěn)壓電路來改善電源的穩(wěn)定性。
(二)軟件相關(guān)
紅外傳感器讀取的防抖處理:
問題:在代碼中直接根據(jù)紅外傳感器引腳的當(dāng)前讀取值來判斷小車的位置狀態(tài),但是在實(shí)際環(huán)境中,由于電磁干擾、傳感器本身的特性等原因,傳感器的讀取值可能會(huì)出現(xiàn)短暫的抖動(dòng)(即瞬間的誤讀),這可能會(huì)導(dǎo)致小車做出錯(cuò)誤的動(dòng)作決策。
調(diào)試建議:可以在讀取紅外傳感器值后增加防抖處理邏輯。例如,連續(xù)多次讀取傳感器的值(比如讀取 5 - 10 次),然后根據(jù)多數(shù)值的情況來確定最終的傳感器狀態(tài)。示例代碼如下(以D2傳感器為例):
c
復(fù)制
unsigned char ReadD2Stable()
{
    unsigned char readValues[10];
    unsigned char i;
    unsigned char countOn = 0;

    for (i = 0; i < 10; i++)
    {
        readValues[i] = D2;
    }

    for (i = 0; i < 10; i++)
    {
        if (readValues[i] == 1)
        {
            countOn++;
        }
    }

    if (countOn >= 5)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
然后在Track函數(shù)中,將原來對D2和D3的直接讀取改為調(diào)用上述防抖處理函數(shù),比如:
c
復(fù)制
if (ReadD2Stable() == 1 && ReadD3Stable() == 1)  // 小車停止
{
    CompareR = 0;
    CompareL = 0;
    Stop();
}
循跡算法的優(yōu)化:
問題:當(dāng)前的循跡算法相對比較簡單,只是根據(jù)D2和D3兩個(gè)傳感器的狀態(tài)進(jìn)行了幾種基本情況的判斷和處理。在實(shí)際的循跡場景中,可能會(huì)遇到更復(fù)雜的路況(如彎道較急、黑線不連續(xù)等),這種簡單的算法可能無法很好地應(yīng)對。
調(diào)試建議:
考慮增加更多的傳感器或者利用現(xiàn)有的傳感器獲取更多的信息。例如,可以同時(shí)考慮D1和D4傳感器的狀態(tài),綜合四個(gè)傳感器的信息來更準(zhǔn)確地判斷小車的位置和前方路況,從而做出更合理的動(dòng)作決策。
對于不同的傳感器狀態(tài)組合,可以設(shè)計(jì)更細(xì)致的動(dòng)作策略。比如,當(dāng)D2和D3之間的狀態(tài)切換頻繁時(shí)(可能表示小車即將進(jìn)入彎道或者已經(jīng)在彎道中),可以適當(dāng)降低車速(通過調(diào)整CompareR和CompareL的值),以提高循跡的穩(wěn)定性。
可以采用一些智能的循跡算法,如 PID 控制算法。PID 算法可以根據(jù)小車當(dāng)前位置與期望位置(沿著黑線行駛)的偏差,實(shí)時(shí)調(diào)整電機(jī)的控制參數(shù),從而實(shí)現(xiàn)更精準(zhǔn)的循跡。不過,實(shí)現(xiàn) PID 算法相對復(fù)雜一些,需要對 PID 原理有一定的了解并進(jìn)行相應(yīng)的代碼編寫和參數(shù)調(diào)試。
全局變量的保護(hù)與一致性:
問題:代碼中使用了一些全局變量如CompareR、CompareL和Counter,在多函數(shù)共享這些變量的情況下,如果沒有適當(dāng)?shù)谋Wo(hù)機(jī)制,可能會(huì)出現(xiàn)意外的修改,導(dǎo)致程序邏輯混亂,影響小車的循跡效果。
調(diào)試建議:
盡量減少全局變量的使用,如果可能的話,可以將一些變量改為局部變量,并通過函數(shù)參數(shù)傳遞的方式在不同函數(shù)之間共享必要的數(shù)據(jù)。
如果必須使用全局變量,可以考慮使用互斥鎖等機(jī)制來保護(hù)它們。在 51 單片機(jī)中,雖然沒有像操作系統(tǒng)那樣完善的互斥鎖機(jī)制,但可以通過一些簡單的標(biāo)志位和邏輯判斷來實(shí)現(xiàn)類似的功能。例如,在修改某個(gè)全局變量之前,先檢查一個(gè)特定的標(biāo)志位是否允許修改,如果允許則進(jìn)行修改,并在修改完成后設(shè)置標(biāo)志位為不允許修改狀態(tài),直到下一次合適的時(shí)機(jī)再允許修改。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表