void main(void) 
{
    DisableInterrupts;
    PLL_Init_64M();
    UART_Init();
    Init_Port(); 
    Init_AD();
    Init_PWM();
  //  LCD_init(); 
  //  LCD_clear(); 
  //  RST = 1; 
    PAT_Init();
   
    
 //   PWMDTY23 =6300 ;
//    DDRA_DDRA7 = 1;
    EnableInterrupts;
    for(;;)
    {      
       Mode();
    //   uart_putchar('a');
    /*    OutData[0] = (int16)(roadflag[2]); 
        OutData[1] = (int16)(roadflag[3]); 
        OutData[2] = (int16)(Steer);
        OutData[3] = (int16)(roadflag[1]);
        OutPut_Data(); */ 
   //    Ramp_Detection();
      GetExpectSpeed();
      Steer_PID();
      stop_car();
      //Motor(1800);
    } 
}
Beispiel #2
0
void main(void){ 
  Init(); 
  SCI0BD = 156;	 				// 9600 baud
  SCI0CR2 = 0x0C; 				// enable transmitter and receiver
  Init_AD();	 	  			// initialize ATD
  ATD0CTL5 = 0x20;					//one channel, 8 conversions, continuous conversions
					
//  PWMDTY3 = 30;						//starting speed - slow
//  RTI_count=0;
//  RTI_flag=0;								
//  printf ("\n\r");

  while(1) {
 
  conv = ATDDR0H; 
//	   Use printf for debugging 
//  printf("AtD 0: %d PID: %f PWM: %d \n", ATDDR0H, PID, PWMDTY5); //256 steps, 0 to 5V, 19.53mV/step
//	printf("AtD 0: %d, PWM: %d \n", ATDDR0H, PWMDTY5);  
 
  /* ----- PID ----- */
  
  //calculate PID terms	   	   	  
  error = conv - 75;   	   	   	 

  for(i = 9; i >= 1; i--) {				  //recording previous errors
  		D[i] = D[i-1];
  }
  D[0] = error;
  for(i = 0; i >= 9; i++) {				  //calculate average error
  		avg_error += D[i];
  }
  avg_error = avg_error / 10;
    P_term = Kp * (error);	 			  //calculate PID terms
    I_term = (Kp / Ti) * (avg_error); 
	D_term = Kp * Td *(error - avg_error);	  
    PID = (P_term + D_term + I_term);
  
  /* Code For Steering */ 
  
  turn = conv + PID;
  
 // if(((turn)*(-0.186)+(52.24)) > maxServo)
 // 					PWMDTY5 = maxServo;
 //		else if(((turn)*(-0.186)+(52.24)) < minServo)
 //			 		PWMDTY5 = minServo;
 //		else
 //					PWMDTY5 = ((turn) * (-0.186) + (52.24));
					
  
  if((turn) <= 75)	   //right turn
  		   if(((turn)*(-0.197)+(51.77)) > maxServo)
		   			 PWMDTY5 = maxServo;
		   else if(((turn)*(-0.197)+(51.77)) < minServo)
		   			 PWMDTY5 = minServo;
		   else 
		   		PWMDTY5 = ((turn) * (-0.197)+(51.77));
  if((turn) > 75)		//left turn
  		   if(((turn)*(-0.1846)+(50.846)) > maxServo)
		   			 PWMDTY5 = maxServo;  
		   else if(((turn)*(-0.1846)+(50.846)) < minServo)
		   			 PWMDTY5 = minServo;
		   else 
		   		PWMDTY5 = ((turn) * (-0.1846) + (50.846));
  
  
  /* Code For Motor Control */
  
  	 if(flag)
	 	{
		 	 if(PulseCount == 0)
			 			   PWMDTY3 = 20;
			 else if(PulseCount < SET_COUNT)
			 			   PWMDTY3 = PWMDTY3 + 1;
			 else if(PulseCount > SET_COUNT)
			 	  		   PWMDTY3 = PWMDTY3 - 1;
			 flag = 0;
			 PulseCount = 0;
		}	 
  
  
  }	 			// while(1)
}