飞思卡尔智能车.docx
《飞思卡尔智能车.docx》由会员分享,可在线阅读,更多相关《飞思卡尔智能车.docx(16页珍藏版)》请在冰豆网上搜索。
飞思卡尔智能车
Main.c
#include/*commondefinesandmacros*/
#include/*derivativeinformation*/
#pragmaLINK_INFODERIVATIVE"mc9s12db128b"
#include"define.h"
#include"init.h"
//variableusedinvideoprocess
volatileunsignedcharimage_data[ROW_MAX][LINE_MAX];//dataarrayofpicture
unsignedcharblack_x[ROW_MAX];//0ne-dimensionalarray
unsignedcharrow;//x-positionofthearray
unsignedcharline;//y-positionofthearray
unsignedintrow_count;//rowcounter
unsignedcharline_sample;//usedtocounterinAD
unsignedcharrow_image;
unsignedcharline_temp;//temperaryvariableusedindatatransfer
unsignedcharsample_data[LINE_MAX];//usedtosaveone-dimensionarraygotin
interruption
//variablesbelowareusedinspeedmeasure
Unsignedcharpulse[5];//usedtosavedatainPAprocess
Unsignedcharcounter;//temporarycounterinSpeeddetect
Unsignedcharcur_speed;//currentspeed
shortstand;
shortdata;
unsignedcharcurve;//valveusedtodecidestraightorturn
shortBounds(shortdata);
shortFuzzyLogic(shortstand);
/*----------------------------------------------------------------------------*\
receive_sci
\*----------------------------------------------------------------------------*/
unsignedcharreceive_sci(void)//receivedatathroughsci
{unsignedcharsci_data;
while(SCI0SR1_RDRF!
=1);
sci_data=SCI0DRL;
returnsci_data;
}
/*----------------------------------------------------------------------------*\
transmit_sci
\*----------------------------------------------------------------------------*/
voidtransmit_sci(unsignedchartransmit_data)//senddatathroughsci
{
while(SCI0SR1_TC!
=1);
while(SCI0SR1_TDRE!
=1);
SCI0DRL=transmit_data;
}
/*****************************************************************************
***/
/*----------------------------------------------------------------------------*\
abs_sub
\*----------------------------------------------------------------------------*/
unsignedcharabs_sub(unsignedcharnum1,unsignedcharnum2)
{unsignedchardifference;
if(num1>=num2){
difference=num1-num2;
}else{
difference=num2-num1;
}
returndifference;
}
voidpwm_set(unsignedintdutycycle)
{
PWMDTY1=dutycycle&0x00FF;
PWMDTY0=dutycycle>>8;
}
voidget_black_wire(void)//usedtoextractblackwire
{unsignedchari;
for(row=0;rowfor(line=LINE_MIN;lineif(image_data[row][line]>image_data[row][line+3]+VALVE){
for(i=3;i<10;i++){
if(image_data[row][line+i]+VALVEblack_x[row]=line+i/2+2;
i=10;
}
}
line=LINE_MAX;
}else{
//black_x[row]=(black_x[row]/45)*78;
}
}
}
}
/*----------------------------------------------------------------------------*\
speed_control
\*----------------------------------------------------------------------------*/
voidspeed_control(void)
{
unsignedintsum,average;
sum=0;
for(row=0;rowsum=sum+black_x[row];
}
average=sum/FIRST_FIVE;
curve=0;
for(row=0;row{
curve=curve+abs_sub(black_x[row],average);
if(curve>CURVE_MAX){
curve_flag=0;
speed=low_speed;}
else{
curve_flag=1;
speed=hign_speed;
}
}
}
/*----------------------------------------------------------------------------*\
steer_control
\*----------------------------------------------------------------------------*/
voidsteer_control(void)
{unsignedintdutycycle;
unsignedcharvideo_center;
unsignedintcoefficient;
intE,U;//current
staticinte=0;
video_center=(LINE_MIN+LINE_MAX)/2;
stand=abs_sub(black_x[1]+black_x[9],2*black_x[5]);
E=video_center-black_x[8];
coefficient=30+1*FuzzyLogic(stand);
U=coefficient*E;
dutycycle=Bounds(center+U);
pwm_set(dutycycle);
}
//makesureitiswithinbounds
shortBounds(shortdata){
if(data>right_limit){
data=right_limit;
}
if(datadata=left_limit;
}
returndata;
}
Voidspeed_get(void)
{
Unsignedchartemp;
Counter++;
Temp=PACN1;
cur_speed=temp-pulse[counter-1];
pulse[counter-1]=temp;
if(counter==5)
{
counter=0;
}
}
Voidset_speed(unsignedchardesired_speed)
{
If(desired_speed{
PWMDTY2=low_speed;
}
Else
{
PWMDTY2=high_speed;
}
}
/*****************************************************************************
*\
Main
\*****************************************************************************
*/
voidmain(void){
//mainfunctiion
init_PORT();
//portinitialization
init_PLL();
//settingofthePLL
init_ECT();
init_PWM();
//PWMINITIALIZATION
init_SPEED();
init_SCI();
for(;;){
if(field_signal==0){//even->odd
while(field_signal==0);
row_count=0;
row_image=0;
EnableInterrupts;
while(row_countget_black_wire();
speed_control();
steer_control();
}
DisableInterrupts;
}
else{//odd->even
while(field_signal==1);
row_count=0;
row_image=0;
EnableInterrupts;
while(row_count