Main.c #include <hidef.h> /* common defines and macros */ #include <mc9s12db128.h> /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12db128b" #include "define.h" #include "init.h" // variable used in video process volatile unsigned char image_data[ROW_MAX][LINE_MAX] ; // data array of picture unsigned char black_x[ROW_MAX] ; // 0ne-dimensional array unsigned char row ; // x-position of the array unsigned char line ; // y-position of the array unsigned int row_count ; // row counter unsigned char line_sample ; // used to counter in AD unsigned char row_image ; unsigned char line_temp ; // temperary variable used in data transfer unsigned char sample_data[LINE_MAX] ; // used to save one-dimension array got in interruption // variables below are used in speed measure Unsigned char pulse[5] ; // used to save data in PA process Unsigned char counter; // temporary counter in Speed detect Unsigned char cur_speed; // current speed short stand; short data; unsigned char curve ; // valve used to decide straight or turn short Bounds(short data); short FuzzyLogic(short stand); /*----------------------------------------------------------------------------*\ receive_sci \*----------------------------------------------------------------------------*/ unsigned char receive_sci(void) // receive data through sci { unsigned char sci_data; while(SCI0SR1_RDRF!=1); sci_data=SCI0DRL; return sci_data; } /*----------------------------------------------------------------------------*\ transmit_sci \*----------------------------------------------------------------------------*/ void transmit_sci(unsigned char transmit_data) // send data through sci { while(SCI0SR1_TC!=1); while(SCI0SR1_TDRE!=1); SCI0DRL=transmit_data; } /***************************************************************************** ***/ /*----------------------------------------------------------------------------*\ abs_sub \*----------------------------------------------------------------------------*/ unsigned char abs_sub(unsigned char num1, unsigned char num2) { unsigned char difference; if(num1>=num2){ difference=num1-num2; }else{ difference=num2-num1; } return difference; } void pwm_set(unsigned int dutycycle) { PWMDTY1=dutycycle&0x00FF; PWMDTY0=dutycycle>>8; } void get_black_wire(void) // used to extract black wire { unsigned char i; for(row=0;row<ROW_MAX;row++){ for(line=LINE_MIN;line<LINE_MAX-3;line++){ if(image_data[row][line]>image_data[row][line+3]+VALVE){ for(i=3;i<10;i++){ if(image_data[row][line+i]+VALVE<image_data[row][line+i+3]){ black_x[row]=line+i/2+2; i=10; } } line=LINE_MAX; } else{ //black_x[row]=(black_x[row]/45)*78; } } } } /*----------------------------------------------------------------------------*\ speed_control \*----------------------------------------------------------------------------*/ void speed_control(void) { unsigned int sum,average; sum=0; for(row=0;row<FIRST_FIVE;row++){ sum=sum+black_x[row]; } average=sum/FIRST_FIVE; curve=0; for(row=0;row<FIRST_FIVE;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 \*----------------------------------------------------------------------------*/ void steer_control(void) { unsigned int dutycycle; unsigned char video_center; unsigned int coefficient; int E,U; //current static int e=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); } // make sure it is within bounds short Bounds(short data){ if(data>right_limit){ data = right_limit; } if(data<left_limit){ data = left_limit; } return data; } Void speed_get(void) { Unsigned char temp; Counter++; Temp=PACN1; cur_speed=temp-pulse[counter-1]; pulse[counter-1]=temp; if(counter==5) { counter=0; } } Void set_speed(unsigned char desired_speed) { If(desired_speed<cur_speed) { PWMDTY2=low_speed; } Else { PWMDTY2=high_speed; } } /***************************************************************************** *\ Main \***************************************************************************** */ void main(void) { // main functiion init_PORT() ; // port initialization init_PLL() ; // setting of the PLL init_ECT(); init_PWM() ; // PWM INITIALIZATION init_SPEED() ; init_SCI() ; for(;;) { if(field_signal==0){ // even->odd while(field_signal==0); row_count=0; row_image=0; EnableInterrupts; while(row_count<ROW_END){ get_black_wire(); speed_control(); steer_control(); } DisableInterrupts; |