文章底部 可獲?。豪涕_源鏈接
初始設(shè)定與啟動(dòng)
首先,我們啟動(dòng)小車并觀察其運(yùn)行情況。小車通過測(cè)量左右輪的路程差來進(jìn)行方向調(diào)節(jié)。一旦找到尋跡的黑色線,即開始尋跡操作。我們使用了5個(gè)尋跡感應(yīng)管來實(shí)現(xiàn)精確的尋跡功能。
尋跡過程
在第一圈中,我們可以看到小車迅速定位并開始尋跡。每一圈結(jié)束后,小車進(jìn)行角度調(diào)整,通過調(diào)整左右輪的路程差來實(shí)現(xiàn)方向調(diào)節(jié)。尋跡過程中,小車沿著預(yù)設(shè)的角度前行,一旦再次檢測(cè)到黑色線,即刻重新開始尋跡操作。
控制策略概述
總體而言,我們的控制策略相對(duì)簡(jiǎn)單明了:在空白區(qū)域通過左右輪的路程差進(jìn)行實(shí)時(shí)方向調(diào)節(jié),并在尋跡模塊檢測(cè)到線時(shí)立即切換到尋跡模式。在達(dá)到ABCD點(diǎn)后,我們先進(jìn)行方向調(diào)整,將車輛轉(zhuǎn)向設(shè)定方向,然后執(zhí)行路程差控制。
其中路程差進(jìn)行方向調(diào)節(jié)實(shí)現(xiàn)代碼如下:
void task0(void)
{
IR_Check(); if(FLAG_ONir==1&&timecount>=300) //有傳感器了,聲光提示,停下
{
StartFlag=0;
setspeedr=0;setspeedl=0; // 停車
R_Pid_Ctrl(0,SPEED_RIGHT);
L_Pid_Ctrl(0,SPEED_LEFT); beeponflag=1;
}
else
{
setrightroad=5000;
setleftroad=5000;
if(Flag_PID>=1)
{ if(rightroad>leftroad+10)
{Flag_PID=0; Car_turnright(80,40);}
else if(leftroad>rightroad+10)
{Flag_PID=0; Car_turnright(40,80);}
else
{Flag_PID=0; Car_turnright(80,80);}
R_Pid_Ctrl(setspeedr,SPEED_RIGHT);
L_Pid_Ctrl(setspeedl,SPEED_LEFT); } }
}
車輛轉(zhuǎn)角實(shí)現(xiàn)代碼如下:(以下代碼為左輪速不動(dòng),右輪轉(zhuǎn)動(dòng)調(diào)角度)
void ToangleR(unsigned int targetangl, unsigned int picha)
{
do
{
if(Flag_PID>=1)
{ Flag_PID=0; R_Pid_Ctrl(15,SPEED_RIGHT);
}
if(Flag_Encode == 1) //標(biāo)志位檢測(cè)執(zhí)行 10ms 實(shí)時(shí)速度顯示
{
Encode_Speed();Flag_Encode=0; }
}while(targetangl+picha<RealAngl||RealAngl+picha<targetangl) ;
}
此外,左右輪速度的控制也至關(guān)重要。我們采用閉環(huán)電機(jī)速度控制,確保在尋跡過程中左右輪速度能夠精確控制,以提高運(yùn)動(dòng)穩(wěn)定性和直線行駛效果。
PID速度閉環(huán)實(shí)現(xiàn)代碼如下:(以下代碼為左輪速度閉環(huán)控制代碼。)
void L_Pid_Ctrl(unsigned int Target,unsigned int Real) //PID速度控制函數(shù)
{
int Error=0; //本次差值,上次差值 float j=0.0,i;
if(Target==0)
{ LastError=0;
dError=0;
SumError=0;
outpwml=0;
ATIM_SetCompare2B(outpwml); return;
}
Error =(Target-Real); //本次偏差 if(SumError*L_Ki>1600) //計(jì)算積分項(xiàng)
{
SumError=1600;
SumError=SumError/L_Ki;
} // 輸出到最大值后,不再累計(jì)偏差,抗積分飽各
else SumError +=Error;
dError=Error-LastError; //微分項(xiàng),偏差的變化
LastError=Error; //記錄本次偏差,用于下次計(jì)算
i=L_Kp;
j=Errori;
i=L_Ki;
* j=j+SumError*i;
i=L_Kd;
j=j+dError*i;
if(j>1600)outpwml=1600+1;
else if(j<1)outpwml=1;
else outpwml=j;
ATIM_SetCompare2B(outpwml);
}
調(diào)試過程中的挑戰(zhàn)
在實(shí)際調(diào)試過程中,我們遇到了幾個(gè)挑戰(zhàn)。首先是PID參數(shù)調(diào)節(jié),這直接影響到小車的穩(wěn)定性和精確性。其次是尋跡過程中的速度調(diào)整和轉(zhuǎn)向角度的精確控制,這些都需要仔細(xì)調(diào)整以保證最佳性能。
綜上所述,項(xiàng)目中涉及到多個(gè)參數(shù),它們的合理調(diào)整直接影響小車的最終運(yùn)行效果。我設(shè)定的是跑6圈,但實(shí)際上小車可以持續(xù)運(yùn)行更多圈數(shù),每一輪的積累反而會(huì)減小誤差,從而提高穩(wěn)定性和準(zhǔn)確性。
例程開源鏈接
鏈接:https://pan.baidu.com/s/1PpacwWdcqvmT4xJEspaojw?pwd=6edb
提取碼:6edb
掃碼加入QQ群,3群| 610403240