Autor Tema: ayuda con pwms y medición de tiempo  (Leído 1502 veces)

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

Desconectado ale0502

  • PIC10
  • *
  • Mensajes: 1
ayuda con pwms y medición de tiempo
« en: 26 de Noviembre de 2016, 14:50:48 »
Hola a todos, estoy programando una placa que tiene una salida de pwm x hardware en funcion de la frecuencia de un encoder q entra x interrupción externa, al mismo tiempo tengo q generar dos pwm x software en funcion de la lectura de un adc.
En principio funciona pero tengo errores en el pwm casero debido a la rutina de medición de pulsos.
El microcontrolador es un 16f819, pego el código abajo.

Código: [Seleccionar]
#include <16f819.h>
#device adc=10
#fuses NOWDT,HS,PUT,NOPROTECT
#use delay(clock=16000000)

#define OFF output_high
#define ON output_low

#define HA PIN_B4
#define HB PIN_B5

int16 adc=0;
int16 t1=0;
int16 valor_us=0;
int8 desbordamientos=0;
int16 DC=0;
int8 tmr0=0;
int1 f_giro=1;
int1 f_ext=0;
int16 Ton=0;

#INT_TIMER0
void TMR0_Interrupt()
{
   if(f_giro==1)
   {
      ON (HA); 
   }
   if(f_giro==0)
   {
      ON (HB);
   }
}

#INT_TIMER1
void TMR1_Interrupt()
{
   ++desbordamientos;
}

#INT_EXT
void RB0_Interrupt()
{
   f_ext=1;
}

void main()
{
   OFF(HA);
   OFF(HB);
   
   setup_timer_0(T0_DIV_4);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
   setup_timer_2(T2_DIV_BY_4, 102, 1);
   ext_int_edge(L_TO_H);
   setup_ccp1(CCP_PWM);
   
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(0);
   set_adc_channel(0);
   delay_us(10);
   
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
         
   while(true)
   {
      adc=read_adc();
      tmr0=get_timer0();
     
      if (f_ext==1)
      {
         set_timer1(15536);
         set_pwm1_duty(((get_timer1()-15536)*2 + desbordamientos*100000)*(-1)*(0.00189) + 1023);
         desbordamientos=0;
         
         f_ext=0;
      }
   
      if (adc<512)
      {
         f_giro=1;
         Ton=adc/2;
      }
      else
      {
         f_giro=0;
         Ton=(adc/2)-256;
      }
     
      if (tmr0>Ton)
      {
         OFF(HA);
         OFF(HB);
      }
   }
}


Espero alguno pueda ayudarme a depurar un poco mi código y lograr tiempos y frecuencias constantes.

Gracias
 


 

anything