A. 飛思卡爾智能車競賽電磁組、攝像頭組、光電組,各用什麼感測器,我第一次參加比賽不知道做哪一組
電磁組多用電感和電容諧振;
光電組多用激光二極體;
攝像頭組多用數字式攝像頭。
B. 第五界飛思卡爾智能車大賽程序
我是光電組的,下面是程序,小車可以跑起來,但速度有待提升
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
//static unsigned char direction_turn[12]={888,1098,1208,1328,1481,1612,1730,1856,1988,2100,2222,2368};
//Chapter 12
//Periodic Interrupt Timer (S12PIT24B4CV1) Page349
//The PIT mole has no external pins.
//PIT 模式沒有外部引腳
//========================================================================================
unsigned char light=0; //激光管檢測標志
unsigned short turn_value=0; //轉向的PWM數值
unsigned short direction_turn[7]={333,430,560,647,705,780,888}; //轉向給定值初始化
short speed_set[7]={250,300,350,400,350,300,250}; //速度給定值
short speed_flag=0; //速度檔位標志位
short speed[3]={0,0,0}; //速度檢測函數
short pulse_count=0; //編碼器脈沖計數值
short speed_expect=0; //理想速度
short kp=2; //比例環節
short ki=0; //積分環節
short kd=1; //微分環節
short ek1=0; //誤差1
short ek2=0; //誤差2
short ek3=0; //誤差3
short speed_add=0; //速度增量
//=======================================================================================
void PLL_Init() //時鍾初始化
{
REFDV=0x81; /* PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)*/
SYNR=2; /* 鎖相環時鍾=2*16*(2+1)/(1+1)=48MHZ */
while(!(CRGFLG&0x08)); /* 匯流排時鍾=48/2=24MHZ */
CLKSEL=0x80;
}
void PWM_Init() //PWM初始化
{
PWME=0x00; //關閉PWM使能
PWMPRCLK=0x66; //A,B時鍾均為匯流排的64分頻,375KHZ
//PWMSCLA=0x01; //clockSA=clockA/(2*PWMSCLA) = 1500KHZ
//PWMSCLB=0X01; //clockSB=clockB/(2*PWMSCLB) =1500KHZ
PWMCLK=0x00;
PWMPOL=0xFF; //PWM輸出起始電平為高電平
PWMCAE=0x00; //輸出左對齊
PWMCTL=0xf0; //通道01,23,45,67級聯
PWMPER01=5999; //舵機頻率為62.5Hz
PWMDTY01=647; //占空比a=(PWMDTY01+1)/(PWMPER01+1)
PWMPER23=1000; //PWM通道3周期為375HZ
PWMDTY23=0; //占空比a=(PWMDTY01+1)/(PWMPER01+1)占空比50% ~~ 150
PWMPER45=1000; //PWM通道5周期為0.10ms 10KZH 300=0.00010/(1/3000000)
PWMDTY45=300; //占空比a=(PWMDTY01+1)/(PWMPER01+1)
PWMPER67=375; //頻率為1000Hz
PWMDTY67=200; //
PWME=0xff; //使能pwm
}
void Pit0_Init() //PIT初始化
{
PITCFLMT_PITE=0; //關PIT使能
PITCE_PCE0=1; //通道0使能
PITMUX_PMUX0=0; //通道0接微時鍾0
PITMTLD0=99; //微時鍾0值設置為7f
PITLD0=3839; //time-out period = (PITMTLD + 1) * (PITLD + 1) / fBUS.
//時間計算 100*3840/24000000=0.016s
PITINTE_PINTE0=1; //通道0中斷時能
PITCFLMT_PITE=1; //PIT使能
}
void ECT_Init()
{
TIOS=0x00; /* OC0路為輸出比較,OC1路為輸入捕捉 */
TSCR2=0x06; /* 定時器溢出中斷禁止,計數器自由運行禁止復位,64分頻 */
TSCR1=0x80; /* 定時器使能 */
TIE=0x01; /* 輸出比較相應中斷使能 */
TCTL4=0x01;
}
void dly_1ms()
{
int i,j;
for(i=0;i<200;i++)
{
for(j=0;j<1000;j++){;}
}
}
void sam_position() //車位檢測函數
{
int i=0,j=0;
unsigned char m=0,n=0;
n=PORTA;
for(i;i<10;i++)
{
m=PORTA;
if(n==m)
j++;
}
if(j>6)
light=n;
}
void check_start() //檢測起始線
{
if((light&&4)||(light&&16))
start_flag++;
}
void check_start()
{
}
void turning() //舵機轉向函數
{
switch(light)
{
case 1:if(turn_value==direction_turn[1]) //出界判斷演算法
{
turn_value=direction_turn[0];
speed_expect=speed_set[0];
}
else if(turn_value==direction_turn[0])
{
turn_value=direction_turn[0];
speed_expect=speed_set[0];
}
break;
case 2:if(turn_value==direction_turn[0])
{
turn_value=direction_turn[1];
speed_expect=speed_set[1];
}
else if(turn_value==direction_turn[1])
{
turn_value=direction_turn[1];
speed_expect=speed_set[1];
}
else if(turn_value==direction_turn[2])
{
turn_value=direction_turn[1];
speed_expect=speed_set[1];
}
break;
case 4:if(turn_value==direction_turn[1])
{
turn_value=direction_turn[2];
speed_expect=speed_set[2];
}
else if(turn_value==direction_turn[2])
{
turn_value=direction_turn[2];
speed_expect=speed_set[2];
}
else if(turn_value==direction_turn[3])
{
turn_value=direction_turn[2];
speed_expect=speed_set[2];
}
break;
case 8:if(turn_value==direction_turn[2])
{
turn_value=direction_turn[3];
speed_expect=speed_set[3];
}
else if(turn_value==direction_turn[3])
{
turn_value=direction_turn[3];
speed_expect=speed_set[3];
}
else if(turn_value==direction_turn[4])
{
turn_value=direction_turn[3];
speed_expect=speed_set[3];
}
break;
case 16:if(turn_value==direction_turn[3])
{
turn_value=direction_turn[4];
speed_expect=speed_set[4];
}
else if(turn_value==direction_turn[4])
{
turn_value=direction_turn[4];
speed_expect=speed_set[4];
}
else if(turn_value==direction_turn[5])
{
turn_value=direction_turn[4];
speed_expect=speed_set[4];
}
break;
case 32:if(turn_value==direction_turn[4])
{
turn_value=direction_turn[5];
speed_expect=speed_set[5];
}
else if(turn_value==direction_turn[5])
{
turn_value=direction_turn[5];
speed_expect=speed_set[5];
}
else if(turn_value==direction_turn[6])
{
turn_value=direction_turn[5];
speed_expect=speed_set[5];
}
break;
case 64:if(turn_value==direction_turn[5]) //出界判斷演算法
{
turn_value=direction_turn[6];
speed_expect=speed_set[6];
}
else if(turn_value==direction_turn[6])
{
turn_value=direction_turn[6];
speed_expect=speed_set[6];
}
break;
default:break;
}
PWMDTY01=turn_value;
}
void check_speed() //速度檢測函數
{
ek3=ek2; //計算速度差值
ek2=ek1;
ek1=speed_expect-pulse_count;
speed[2]=speed[1]; //當前速度放在[0],之前放在[1],[2]
speed[1]=speed[0];
speed[0]=pulse_count;
pulse_count=0;
}
void speed_down() //制動函數
{
PWMDTY23=300; //電機反向供電
PWMDTY45=0;
}
void speed_pid() //PID演算法
{
speed_add=kp*(ek1-ek2)+ki*ek1+kd*(ek1-2*ek2+ek3); //PID增量式
}
void driver() //驅動電機控制函數
{
//if(((turn_value>705)||(turn_value<560))&&(speed[0]>200)) //當前速度若遠超給定速度
// {
//speed_down();
// }
//else
// {
PWMDTY23=0;
speed_pid();
PWMDTY45=PWMDTY45+speed_add;
// }
if(PWMDTY45>600)
PWMDTY45=600;
}
void main()
{
DisableInterrupts; /* 關中斷 */
PLL_Init();
PWM_Init();
Pit0_Init();
ECT_Init();
turn_value=direction_turn[3];
DDRA=0x00;
DDRB=0xFF;
PORTB=0X00;
EnableInterrupts;
for(;;)
{
//sam_position();
//turning();
}
}
#pragma CODE_SEG NON_BANKED
void interrupt 8 Timer0_ISR(void)
{
pulse_count++;
TFLG1_C0F=1; /* TC0端有中斷產生 */
}
void interrupt 66 PIT0_ISR(void)
{
sam_position(); //車位檢測函數
turning(); //舵機轉向函數
check_speed(); //速度檢測函數
driver(); // 驅動電機控制函數
PITTF_PTF0=1; /* PIT0端有中斷產生,清除標志位 */
}
C. 飛思卡爾智能車需要的知識
一般分硬體與軟體!
硬體方面,也就是電路設計,關於比賽用到的電路不是特別復雜,需要具備一定的電路基礎,模擬電路,數字電路和一些EDA設計的能力,主要還是多看前人的東西,之後再在這些基礎上改進創新。無論你主攻哪方面,以下基本電路知識是要知道的。所以現在開始《電路分析》《數字電路》《模擬電路》肯定要學好,這些都是基礎,同時《感測器》之類的書也要看看。如果專攻硬體,這些是不夠的,要多看一些電路設計方面的書,特別是一個小日本人編的電路設計,什麼DXP之類的軟體當然要會的一種,設計電路要使用。
軟體方面,首先要確定希望做什麼方面的小車,根據感測器不同,所需要運用的演算法也有所差異的。無論如何,建議提前學《單片機》的知識,掌握匯編語言,學好《C語言程序設計》,再者就是控制演算法了,關於自控原理和計算機控制也要有一定的了解,重點是「PID控制演算法」!!!!
小車製作需要精力和時間,起步是比較困惑的,要多看資料,資料飛思卡爾官網上有一些,同時也希望能夠大膽設計自己的新東西,為智能車的製作增添樂趣。