久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 724|回復: 1
打印 上一主題 下一主題
收起左側

大一新生第一輛循跡小車,問問大佬們怎么優化調試小車啊,小車不能穩定循跡,崩潰....

[復制鏈接]
跳轉到指定樓層
樓主
ID:1136591 發表于 2024-11-16 15:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
主函數
#include <REGX52.H>
#include "MotorTurn.h"
#include "State.h"
#include "Timer.h"
#include "Infrared.h"

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

定時器
#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;
        }
}

小車狀態
#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)              //小車稍微左轉
        {
                CompareR=12;
                CompareL=0;
                Forward();
                if(D2==0&&D3==0)             //小車前進
                {  
                        CompareR=15;
                        CompareL=15;
                        Forward();
                }
        
        }
        
        if(D2==0&&D3==1)             //小車稍微右轉
        {
                CompareR=0;
                CompareL=12;
                Forward();
                if(D2==0&&D3==0)             //小車前進
                {  
                        CompareR=15;
                        CompareL=15;
                        Forward();
                }
        }
        
        if(D2==0&&D3==0)             //小車前進
        {  
                CompareR=15;
                CompareL=15;
                Forward();
         }
        
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:404160 發表于 2024-11-16 17:22 | 只看該作者
可能導致不穩定循跡的問題及優化調試建議
(一)硬件相關
紅外傳感器布局與安裝角度:
問題:如果紅外傳感器安裝得不夠水平或者與地面的距離不一致,可能會導致不同傳感器接收到的反射光強度有較大差異,從而影響對黑線的準確檢測。
調試建議:仔細檢查紅外傳感器的安裝情況,確保它們在同一水平面上且與地面的距離合適(一般幾毫米到一厘米左右,具體可根據實際情況調整)。可以使用一些輔助工具如水平儀等來保證安裝的準確性。
電機性能差異:
問題:左右電機的轉速、扭矩等性能可能不完全一致,即使定時器設置相同的時間來控制電機轉動,也可能導致小車行駛軌跡出現偏差。
調試建議:單獨測試左右電機,在相同的輸入條件下(如相同的電壓、相同的控制信號持續時間等),觀察它們的轉速和轉動情況是否一致。如果存在明顯差異,可以考慮更換電機或者在軟件上進行一些補償性的調整(比如根據實際測試結果,對左右電機的控制參數CompareR和CompareL進行微調)。
電源穩定性:
問題:如果電源電壓不穩定,可能會導致電機轉速波動,進而影響小車的循跡穩定性。
調試建議:使用萬用表等工具監測電源電壓,確保在小車運行過程中電壓保持在穩定的范圍內。如果電壓波動較大,可以考慮增加穩壓電路來改善電源的穩定性。
(二)軟件相關
紅外傳感器讀取的防抖處理:
問題:在代碼中直接根據紅外傳感器引腳的當前讀取值來判斷小車的位置狀態,但是在實際環境中,由于電磁干擾、傳感器本身的特性等原因,傳感器的讀取值可能會出現短暫的抖動(即瞬間的誤讀),這可能會導致小車做出錯誤的動作決策。
調試建議:可以在讀取紅外傳感器值后增加防抖處理邏輯。例如,連續多次讀取傳感器的值(比如讀取 5 - 10 次),然后根據多數值的情況來確定最終的傳感器狀態。示例代碼如下(以D2傳感器為例):
c
復制
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函數中,將原來對D2和D3的直接讀取改為調用上述防抖處理函數,比如:
c
復制
if (ReadD2Stable() == 1 && ReadD3Stable() == 1)  // 小車停止
{
    CompareR = 0;
    CompareL = 0;
    Stop();
}
循跡算法的優化:
問題:當前的循跡算法相對比較簡單,只是根據D2和D3兩個傳感器的狀態進行了幾種基本情況的判斷和處理。在實際的循跡場景中,可能會遇到更復雜的路況(如彎道較急、黑線不連續等),這種簡單的算法可能無法很好地應對。
調試建議:
考慮增加更多的傳感器或者利用現有的傳感器獲取更多的信息。例如,可以同時考慮D1和D4傳感器的狀態,綜合四個傳感器的信息來更準確地判斷小車的位置和前方路況,從而做出更合理的動作決策。
對于不同的傳感器狀態組合,可以設計更細致的動作策略。比如,當D2和D3之間的狀態切換頻繁時(可能表示小車即將進入彎道或者已經在彎道中),可以適當降低車速(通過調整CompareR和CompareL的值),以提高循跡的穩定性。
可以采用一些智能的循跡算法,如 PID 控制算法。PID 算法可以根據小車當前位置與期望位置(沿著黑線行駛)的偏差,實時調整電機的控制參數,從而實現更精準的循跡。不過,實現 PID 算法相對復雜一些,需要對 PID 原理有一定的了解并進行相應的代碼編寫和參數調試。
全局變量的保護與一致性:
問題:代碼中使用了一些全局變量如CompareR、CompareL和Counter,在多函數共享這些變量的情況下,如果沒有適當的保護機制,可能會出現意外的修改,導致程序邏輯混亂,影響小車的循跡效果。
調試建議:
盡量減少全局變量的使用,如果可能的話,可以將一些變量改為局部變量,并通過函數參數傳遞的方式在不同函數之間共享必要的數據。
如果必須使用全局變量,可以考慮使用互斥鎖等機制來保護它們。在 51 單片機中,雖然沒有像操作系統那樣完善的互斥鎖機制,但可以通過一些簡單的標志位和邏輯判斷來實現類似的功能。例如,在修改某個全局變量之前,先檢查一個特定的標志位是否允許修改,如果允許則進行修改,并在修改完成后設置標志位為不允許修改狀態,直到下一次合適的時機再允許修改。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久成人 | 狠狠干天天干 | 亚洲一区二区三区四区五区午夜 | 国内自拍偷拍视频 | 影音先锋中文字幕在线观看 | 欧美一区二区三区久久精品视 | 日本一道本视频 | 精品久久国产 | 国产激情91久久精品导航 | 精品成人一区二区 | 国产一区二区精品在线观看 | 中文字幕在线三区 | 国产成人免费视频网站视频社区 | 亚洲成人精品在线 | 免费一区 | 综合久久久久 | 亚洲精品中文字幕在线观看 | 成人性视频在线 | 国产成人啪免费观看软件 | 国产精品久久久久久久久大全 | 亚洲免费视频一区 | 黄色片亚洲 | 国产精品久久久久久久白浊 | 99精品久久 | 精品一区二区久久久久久久网站 | 91欧美| 一区欧美 | 中文天堂在线观看 | 久久国产精品91 | 福利视频网 | 综合久久av | 波多野结衣一区二区 | 日本三级在线 | 国产 日韩 欧美 在线 | 久久91av| 成人影院一区二区三区 | 人人擦人人 | 亚洲精品乱码久久久久久9色 | 久久综合一区 | 99精品国自产在线 | 久久久久久久久久久成人 |