《智能循跡小車設計.docx》由會員分享,可在線閱讀,更多相關《智能循跡小車設計.docx(9頁珍藏版)》請在裝配圖網上搜索。
1、智能循跡/避障小車研究
工作報告
一、 智能循跡小車程序結構框圖
二、 Proteus仿真圖
三、 軟件程序設計
一、 智能循跡小車程序結構框圖
經過幾天在網上的查找,對智能循跡/避障小車有了大致的了解,
一般有三個模塊:
1、最基本的小車驅動模塊,使用兩個二相四線步進電機對小車的兩個后輪分別進行驅動,前輪最好用萬向輪,能使小車更好地轉彎;
2、小車循跡模塊,在小車底部有三個并排安裝的紅外對管,對黑色與白色的反射信號不同,經單片機處理后對小車進行相應處理;
3、避障模塊,我寫的程序中對于避障模塊是用中斷來處理的(即安裝在小車車頭的紅外對
2、管檢測到有障礙物后,就會向單片機的P3_2口輸出一個高電平或是低電平,這時中斷程序將對小車進行預先設定好的避障處理),但是在程序結構框圖中,我不太會表示中斷處理方式,所以就用查詢的方式畫了。
啟動小車
開始
避障?
N
Y
避障模
3、塊
循跡模塊
停止?
N
Y
停止
二、Proteus仿真圖
我用Proteus大概地仿真了小車的運行狀態(tài)。圖中的兩個二相四線步進電機就代表小
4、車的左右輪(假定步進電機順時針轉動方向為小車前進方向),網上有很多種驅動芯片,在仿真時我只使用L298N芯片來驅動步進電機。用三個單刀雙制開關模擬用于小車循跡的三個紅外對管的輸出信號,經一個與門與三極管開關連接到P3_3口,中斷程序對P1_0, P1_1, P1_2三個口進行檢測,并做出相應處理。同時因為避障模塊的優(yōu)先級高于循跡模塊,所以將外部中斷0用于避障,外部中斷1用于循跡。P1_3口則用于檢測小車是否到達終點。
1、小車驅動模塊:
使用一片298芯片驅動一個二相四線步進電機,電機的電壓為12V。
2、小車循跡模塊:
左邊為三個單刀雙制開關模擬小車循跡使用的紅外對管的輸
5、出信號,經一個與門和三極管開關送至P3_3口,有P1_4口定時響應中斷程序。又經或門送至P1_3口(圖因找不到或門,所以用7411和7404代替),檢測小車是否到達終點.
3、避障模塊: (用一個開關代替車頭紅外對管的輸出信號)
4、仿真結果:
根據兩個步進電機的轉動情況,小車可以按照預先設計好的程序進行循跡(轉彎,直走),避障處理,最后停止前進。
三、軟件程序設計
#include
#define uchar unsigned char
sbit P1_2=P1^2; //P1口的低三位作為小車循跡的三個紅外對管與單片機的信號接口
sbit
6、 P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_3=P1^3; //三個循跡的紅外對管輸出口經或門后的結果與P1_3接,用于實時檢測
sbit P1_7=P1^7; //控制兩個二相四線步進電機的啟動與停止
sbit P1_6=P1^6;
sbit P1_4=P1^4; //為循跡中斷所用的定時/計數器0輸出口
uchar i,j,ms;
uchar dianji[]={0x11,0x22,0x44,0x88}; //電機的轉動使小車前進
uchar back[]={0x88,0x44,0x22,0x11}; //電機的轉動使小車后退
7、
void delay(int z) //延時程序
{
int x,y;
for(x=0;x
8、 兩個車輪的轉動。小車左轉時,左邊的電機停止轉動,右邊的電機
P1_6=0; 仍然轉動,即實現小車的左轉動作;反之則是小車的右轉動作
P1_7=1;
for(i=0;i<4;i++)
{
P2=dianji[i];
delay(50);
}
}
void turnright() //小車右轉程序
{
P1_6=1;
P1_7=0;
for(i=0;i<4;i++)
{
P2=dianji[i];
delay(50);
}
}
void qianj
9、in() //小車前進程序,此程序是為小車遇到障礙時進行躲避處理時小車前
{ 進程序,一個循環(huán)小車的車輪轉動三周
P1_6=1;
P1_7=1;
for(j=0;j<3;j++)
{
for(i=0;i<4;i++)
{
P2=dianji[i];
delay(50);
}
}
}
void goback() //小車后退程序,此程序也是小車避障環(huán)節(jié)中的為小車后退的程序,
{ 一個循環(huán),小車的車輪向后轉動三周
P1_6=1;
10、
P1_7=1;
for(j=0;j<3;j++)
{
for(i=0;i<4;i++)
{
P2=back[i];
delay(50);
}
}
}
void main(void) //主程序
{
TMOD=0x01; //為循跡中斷時,設置了一個定時/計數器0,使得循跡中斷會定時被響應
TH0=(65536-50000)/256; //設置定時/計數器的初值
TL0=(65536-50000)%256;
TR0=1; //開啟定時/計數器0
IE=0x
11、87; //打開T0,INT0,INT1的中斷
IT0=1; //兩個外部中斷的中斷觸發(fā)方式
IT1=1;
P1_4=0; //設定初值
ms=0;
while(P1_3) //場地為白紙黑線,紅外對管發(fā)射接收后,若為黑色則向單片機輸出低電
{ 平,若為白色則輸出高電平。三個紅外對管接一個或門后到P1_3口,只
goahead(); 要有一個對管檢測到白線,小車就一直向前走。場地的終點為一條與循
}
12、 跡線路相垂直的黑線,若三個對管都檢測到黑線,即輸出都為低電平,
P1_6=0; 此時跳出循環(huán),關閉兩個步進電機,小車停止運行。
P1_7=0;
}
void time0() interrupt 0 //避障中斷處理程序。在小車車頭安裝一個或是兩個紅外對
{ 管,用于檢測循跡軌道上的障礙物。若有障礙物出現則紅外
P1_6=0; 對管向單片機的P3_2口輸出低電平,做出相應處理。
P1_7=0; //先關閉兩個步進電機,使其正
13、轉與反轉之間有一個緩沖時間
goback(); //后退,左轉,前進,右轉,前進,右轉,直走
turnleft();
qianjin();
turnright();
qianjin();
turnright();
goahead();
}
void tt_0() interrupt 2 //循跡中斷程序。由于安裝在小車下面的三個紅外對管會長時間地保持一個電平不變,若直接將此信號經與門連接到P3_3口時,中斷程序只執(zhí)行一次便不再繼續(xù)響應,所以我加了一個三極管開關。這樣隔一段時間三極管導通,將信號傳送到P3_3口。由定時器設定每
14、100ms導通三極管一次,將三個用于循跡的對管的輸出經或門后送到P3_3口。
{
if(P1_0==0&&P1_2==1) //若左邊紅外管輸出為低電平,右邊的為高電平,則左轉
turnleft();
if(P1_0==1&&P1_2==0) //若左邊紅外管輸出為高電平,右邊的為低電平,則右轉
turnright();
if(P1_0==0&&P1_1==0&&P1_2==0) //若三個都為低電平,則關閉步進電機,小車停止
{
P1_6=0;
P1_7=0;
}
}
void time_0() interrupt 1 //定時100ms,P1_4口反相
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ms++;
if(ms>=2)
{
P1_4=!P1_4;
ms=0;
}
}