Ejemplo n.º 1
0
void main()
{
initpwm();
adc_init();
	while(1)
	{
	int i=adc_read(0);
	i=i/4;
	OCR0=i;
	_delay_ms(10);
	
	}

}
Ejemplo n.º 2
0
void main()
{
  //CALL THE INITIALIZING FUNCTION
  initport();
  initpwm();
 while(1)
 {
   indicator();
   CalcError();
   if((error == 0) && (s4+s5==2))
   {
      T1CON.TMR1ON    = 0;
      motor_LF();					        	    //FWD AT FULL SPEED
      motor_RF();
		  PWM1_CHANGE_DUTY(255);
			PWM2_CHANGE_DUTY(255);
      delay_ms(10);
   }
   if((s1+s2+s3+s4+s5+s6+s7+s8) == 0)		//ROBOT HAS OVERSHOOT
	 {
         T1CON.TMR1ON = 0;
				if(lastreading == 'r')				  //CHECKS IF THE LAST SENSOR ACTIVATED WAS RIGHT
				{
          T1CON.TMR1ON = 0;
					motor_RB();						        //TURN RIGHT AT FULL SPEED
					motor_LF();
          PWM1_CHANGE_DUTY(255);
          PWM2_CHANGE_DUTY(255);
          delay_ms(10);
          //error=0;
       	}
        else if(lastreading == 'l')			  //CHECKS IF THE LAST SENSOR ACTIVATED WAS LEFT
      {
          T1CON.TMR1ON = 0;
					motor_LB();					        	//TURN LEFT AT FULL SPEED
          motor_RF();
					PWM1_CHANGE_DUTY(255);
					PWM2_CHANGE_DUTY(255);
          delay_ms(10);
          //error=0;
				}

    }
    if ( counter>200)
    {
          T1CON.TMR1ON    = 0;
          PORTC.F7 = 0;
          PORTC.F6 = 0;
          PORTC.F5 = 0;
          PORTC.F4 = 0;
          while(1);
     }
    if( (s1+s2+s3+s4+s5+s6+s7) == 7 || (s2+s3+s4+s5+s6+s7+s8) == 7 || (s1+s2+s3+s4+s5+s6+s7+s8) == 8)
     // TO STOP THE MOTOR AT THE END OF LINE
      {
        T1CON.TMR1ON    = 1;  // enable timer1
       // delay_ms(3) ;
       // if((s1+s2+s3+s4+s5+s6+s7+s8) == 0)
       /* {
          PORTC.F7 = 0;
          PORTC.F6 = 0;
          PORTC.F5 = 0;
          PORTC.F4 = 0;  */

      }
   else  									              //ROBOT ON THE LINE
			{
			  T1CON.TMR1ON    = 0;
				PROPORTIONAL = error * kp;
        INTEGRAL += error ;
        INTEGRAL *= ki;
        DERIVATIVE = (error - perror);
        correction = ( (PROPORTIONAL) + (INTEGRAL) + (DERIVATIVE*kd));
        rightpulse =  basespeed + (correction/2);
        leftpulse = basespeed - (correction/2);
        motor_RF();
        motor_LF();

       if(leftpulse > 255)                  //LEFT CORRECTION EXCEED
		   leftpulse = 255;
       if(rightpulse > 255)                 //RIGHT CORRECTION EXCEED
	     rightpulse = 255;
       if(leftpulse < 0)                    //LEFT CORRECTION EXCEED
		   leftpulse = 0;
       if(rightpulse < 0)                   //RIGHT CORRECTION EXCEED
		   rightpulse = 0;
       PWM1_CHANGE_DUTY(rightpulse);
       PWM2_CHANGE_DUTY(leftpulse);
     }
   delay_ms(10);
  }
}