?? autocar4_4.1.c
字號:
if (accespeed != 0) //加速度不為零時,梯形加速
{
if (Lines >= 3)
TrapeziaV.SpeedState = ACCESTATE; //梯形速度曲線設置
else
TrapeziaV.SpeedState = REGUSTATE; //如果走的線數太少時,不走梯形曲線
}
else
{
TrapeziaV.SpeedState = REGUSTATE; //勻速
}
TrapeziaV.AcceSpeed = accespeed;
while (CrossedLines < Lines)
{
if (RSensorON) //判斷在線
{
delay_100us(1);
if (RSensorON) //二次判斷在線,確認信號
{
while (1) //在白線,等待出線。
{
if (!RSensorON)
{
delay_100us(1);
if (!RSensorON)
{
CrossedLines++;
if (Lines >= 3) //如果走的線數太少時,不走梯形曲線, 保持勻速過程
{
/************************************數線減速************************/
if (CrossedLines == (Lines - decespeedline)) //從終點線的前decespeedline根線開始減速
{
TrapeziaV.SpeedState = DECESTATE;
TrapeziaV.AcceSpeed = -accespeed; //減速度設定,與加速階段對稱
}
}
break;
}
}
}
}
}
}////////
TCCR2 = 0x00;
//set_distance(100, 1); //保證將數線傳感器移出白線
//set_distance(100, 0);
//delay_ms(200);
//左轉
set_distance(0, 0); //左輪不動
set_speed(800, 1); //右輪旋轉,實現左轉
while (flag)
{
if (RSensorON)
{
delay_100us(1);
if (RSensorON)
{
while (1)
{
if (!RSensorON) //兩次判斷左邊數線從傳感器出線。
{
delay_100us(1);
if (!RSensorON)
{
while (PINA != 0xF9); //當前排傳感器沒有達到特定的狀態時,持續轉動
flag = 0;
break;
}
}
}
}
}
}
set_speed(0, 1);
set_speed(0, 0);
return 1;
}
///////////////////////////////////////////////////////
//用右邊傳感器數線,直走,到達終點,停車
unsigned char GoSraight_R(unsigned char Lines, signed int motorinitspeed, signed int accespeed, unsigned char decespeedline)
{
unsigned char flag = 1, CrossedLines = 0; //小車已經通過的橫向白線數目
TCCR2 = 0x07; //尋線
TrapeziaV.MotorSpeed = motorinitspeed;
if (accespeed != 0) //加速度不為零時,梯形加速
{
if (Lines >= 3)
TrapeziaV.SpeedState = ACCESTATE; //梯形速度曲線設置
else
TrapeziaV.SpeedState = REGUSTATE; //如果走的線數太少時,不走梯形曲線
}
else
{
TrapeziaV.SpeedState = REGUSTATE; //勻速
}
TrapeziaV.AcceSpeed = accespeed;
while (CrossedLines < Lines)
{
if (RSensorON) //判斷在線
{
delay_100us(1);
if (RSensorON) //二次判斷在線,確認信號
{
while (1) //在白線,等待出線。
{
if (!RSensorON)
{
delay_100us(1);
if (!RSensorON)
{
CrossedLines++;
if (Lines >= 3) //如果走的線數太少時,不走梯形曲線, 保持勻速過程
{
/************************************數線減速************************/
if (CrossedLines == (Lines - decespeedline)) //從終點線的前decespeedline根線開始減速
{
TrapeziaV.SpeedState = DECESTATE;
TrapeziaV.AcceSpeed = -accespeed; //減速度設定,與加速階段對稱
}
}
break;
}
}
}
}
}
}////////
TCCR2 = 0x00;
set_speed(0, 1);
set_speed(0, 0);
return 1;
}
void dongzuo(void)
{
push2go();
delay_ms(3000);
push2back();
delay_ms(3000);
riseback();
}
void qidong(void)
{
set_speed(500,1);
set_speed(800,0);
delay_ms(1500);
set_speed(0,0);
delay_ms(800);
}
/*********************************************************************************/
//call this routine to initialise all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
spi_init( );
uart0_init();
timer2_init();
//init_7279();
SEEK_PIDInit(0x00); //PID 參數初始化
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x40; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
void main(void)
{
unsigned char i = 1;
init_devices();
//insert your functional code here...
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
flag=0;
while(!flag);
while(flag)
{
load_para();
if(i == 1)
{
send(0x01);
i = 0;
}
if(sel==1)
{
//這條路徑,從紅區出發,在第2個拐彎以后會出現少數一條線的現象。未解決。
//從藍區出發,未發現此現象。可見程序上應沒問題。多設路徑,看成功率。
/*
Count2TurnR(13, 500, 320, 2); //
Count2TurnR(6, 500, 320, 2 );
Count2TurnL(6, 500, 320, 2);
Count2TurnL(4, 500, 320, 2);
Count2TurnR(2, 500, 0, 0);
Count2TurnL(1, 500, 0, 0);
Count2TurnL(4, 500, 320, 2);
Count2TurnL(2, 500, 0, 0); */ //直接編譯下載,運行,看效果。
Count2TurnR(14, 500, 320, 2);
Count2TurnR(6, 500, 320, 2 );
while (1)
{Count2TurnL(11, 500, 320, 2);
Count2TurnL(4, 500, 320, 2);
Count2TurnL(11, 500, 320, 2);
Count2TurnL(4, 500, 320, 2);}
}
//////////////////////////////////////////////////////////////////////////////////////
/*此為Go函數的測試。
GoSraight_R(13, 500, 320, 2);
delay_s(2);
GoSraight_L(3, 500, 0, 0);
delay_s(2);
GoSraight_R(2, 500, 0, 0);
delay_s(2);
GoSraight_L(13, 500, 320, 2);*/
///////////////////////////////////////////////////////////////////////////////////
if(sel==2) //側投中橋
{
qidong();
Count2TurnR(12, 500, 320, 2);
Count2TurnR(6, 500, 320, 2 );
Count2TurnL(2, 800, 0, 0 );
Count2TurnR(2, 800,0, 0 );
GoSraight_L(1, 800, 0, 0);
delay_ms(500);
risego();
set_speed(0, 1);
set_speed(0, 0);
delay_ms(2300);
GO;
while((PINB&0x01)!=0);
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
dongzuo();
}
if(sel==3) //投對方一分區
{
qidong();
Count2TurnR(14, 500, 320, 2);
Count2TurnR(11, 500, 320, 2);
Count2TurnL(6, 500, 320, 2 );
GO;
delay_ms(100);
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
risego();
delay_ms(2300);
dongzuo();
}
if(sel==4) //右橋投塊
{
qidong();
Count2TurnR(14, 500, 320, 2);
Count2TurnR(11, 500, 320, 2 );
Count2TurnR(10, 500, 320, 2 );
GoSraight_L(2, 800, 0, 0);
delay_ms(500);
risego();
delay_ms(2300);
GO;
set_speed(800,1);
set_speed(800,0);
while((PINB&0x01)!=0);
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
dongzuo();
delay_ms(3000);
set_speed(-600,1);
set_speed(-600,0);
delay_ms(3000);
set_speed(0,1);
set_speed(0,0);
Count2TurnL(1, 800, 0, 0 );
Count2TurnR(1, 800, 0, 0 );
Count2TurnR(3, 800, 0, 0 );
while(1)
{Count2TurnR(2, 800, 0, 0 );}
}
if(sel==5) //投左橋
{
qidong();
Count2TurnR(12, 500, 320, 2 );
GoSraight_R(7,500, 320, 2);
delay_ms(50);
risego();
delay_ms(2300);
GO;
while((PINB&0x01)!=0);
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
dongzuo();
}
if(sel==6)
{
qidong();
Count2TurnR(11, 500, 320, 2 );
Count2TurnR(3, 800, 0, 0 );
GO;
delay_ms(100);
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
risego();
delay_ms(2300);
dongzuo();
}
TCCR2 = 0x00;
set_stop(0);
set_stop(1);
while(1);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -