Autor Tema: controlando servo con interrupcion timer1 con adc  (Leído 1999 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado adair

  • PIC10
  • *
  • Mensajes: 2
controlando servo con interrupcion timer1 con adc
« en: 24 de Marzo de 2009, 02:08:15 »
Bueno pues quiero controlar un servo con un adc, vi lo que tiene redpic de 8 servos pero controla 0º, 90º y 180º, yo digo que modulando el ancho de pulso se puede controlar los grados de este bueno eso espero, lo que hice fue con la interrupción del timer1 y poner el settimer dependiendo del valor del adc, pero en la simulación de proteus no sale nada, bueno aquí el código que tengo para que le hechen un vistaso

#include <18f4550.h>
#device ADC=10;
#fuses HS, NOPROTECT, NOWDT, NOLVP
#use delay(clock=4000000)

#define servo1 PIN_B0

int16 adc_value,time1, flag=0,value,flag2=0;

#int_TIMER1
void periodo(void)
{
      if(flag2==0)
      {
      set_adc_channel( 0 );
      value=read_adc();//Leer el adc
      //delay_us(10);
      adc_value= (int) (value*(180/1023));//Valores en grados del servomotor
      time1=(900+(adc_value*6.66)); //Para futaba min=0.9ms max=2,1ms
      set_timer1(time1);//Pone el angulo del servo
      flag=1;
      }
      if(flag2==1)
      {
         output_high(servo1);
         set_timer1(65536-(int)(adc_value*6.66));//Tiempo en alto para el pwm
         flag=2;
      }
      if(flag2=2)
      {
         output_low(servo1);
         set_timer1(65536-(20000-(time1)-(int)(adc_value*6.66)));//Tiempo restante para los 20ms
         flag=0;
      }   
}

void main (void)
{
   setup_timer_0(RTCC_OFF);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED);
   enable_interrupts(int_timer1);
   enable_interrupts(global);
  setup_adc_ports(AN0_analog); // Inicializa el canal0 del adc
   setup_adc(adc_clock_internal);//Frecuencia para tomar muestras
   set_timer1(45536);//Tiempo para esperar los primeros 20ms
   while(true);
   {
      if(flag==0)
       {
          flag2=0;
       }
      if(flag==1)
       {
          flag2=1;
       }
      if(flag==2)
       {
         flag2=2;
       }
   
   }
}