Autor Tema: PWM en fase  (Leído 1206 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
PWM en fase
« en: 31 de Diciembre de 2013, 14:49:32 »
Hola, estoy tratando de hacer un pwm que este en fase con una onda cuadrada que viene de un cruce por cero, el pwm si incrementa o disminuye el ancho mediante una lectura del adc pero el problema que tengo es que no esta en fase espero que me puedan ayudar.
 dejo mi codigo y una grafica

#include <16F886.H>   //LIbreria del PIC Implementado.
#device ADC = 8
#fuses INTRC_IO, MCLR, NOWDT, PUT, NOIESO, NOFCMEN //Deshabilita el Doggy, Oscilador Externo.
#use delay( clock = 8M )   //Crystal de 20MHz.
#use standard_io( B )
#use standard_io( C )   //Direccion del Puerto B.

#define LCD_E     PIN_C0
#define LCD_CK    PIN_C1  
#define LCD_DAT   PIN_C2

#include <flex_lcd_3pins.c>

int f = 0;
int16 leer, Cont0 = 0;

#INT_EXT
void ext( void )
   {  
      if( f == 0 )         //Deteccion de Flanco de Subida.
         {
            f = 1;         //Cambio de Bandera de FLag.
            ext_int_edge( 0, H_TO_L );   //Cambio a Flag de Bajada.
            
            enable_interrupts( INT_TIMER0 );

         }    
      if( f == 1 )         //Deteccion de Flanco de Bajada.
         {
            f = 0;              //Cambio de Bandera de FLag.
            ext_int_edge( 0, L_TO_H );   //Cambio a Flag de Subida.
            disable_interrupts( INT_TIMER0 );    
         }
   }

#INT_TIMER0
void timer0 ( void )
   {
      Cont0++;
      if( Cont0 <= leer )
         {
            output_low( PIN_B1 );
            output_high( PIN_B2 );
         }
      if( Cont0 > leer )
         {
           output_low( PIN_B2 );
         }
      if( Cont0 > leer && Cont0 <= leer + 10 )
         {
            output_high( PIN_B1 );
         }
      if( Cont0 > leer + 10 )
         {
            output_low( PIN_B1 );
         }
      if( Cont0 > 512 )
         {
            Cont0 = 0;
         }
      set_timer0( 191 );
   }

void main( void )
   {  
      setup_oscillator( OSC_8MHZ );
      lcd_init();
      //lcd_setcursor_vb(1,1);
      
      ext_int_edge( 0, L_TO_H );   //Inicia en Flag de Subida.
      enable_interrupts( INT_EXT );   //Habilita la Interrupcion Externa.
      
      setup_adc_ports( SAN0 );   //Seleccion del Canal 0 Analogico.
      setup_adc( ADC_CLOCK_INTERNAL );   //Reloj Interno RC.
      set_adc_channel( 0 );    //Habilita el Canal 0;
      
      set_timer0( 191 );                   //Carga el Timer0 para 8.138useg.
      setup_timer_0( RTCC_INTERNAL | RTCC_DIV_1 );  //Prescaler de 1.
      disable_interrupts( INT_TIMER0 );      //Deshabilita la Interrupcion del Timer1.        
      enable_interrupts( GLOBAL );    //Habilita la Interrupcion Global.
      
      while( 1 )
         {    
            leer = read_adc();
            delay_us( 10 );
            printf( lcd_putc, "\fADC =  %4ld\n", leer );   //Muestra el Valor del Dato Leido por el ADC.
            printf( lcd_putc, "Cont1 =  %4ld", Cont0 );   //Muestra elVoltaje Correspondiente al Dato.
            delay_ms( 500 );
         }


Desconectado nbc

  • PIC10
  • *
  • Mensajes: 39
Re: PWM en fase
« Respuesta #1 en: 10 de Febrero de 2014, 20:36:34 »
hola , yo hice algo parecido para controlar una fuente variando el momento de disparo de un triac , controlada por una tension continua que me variaba el ancho del pwm segun la tension , si es par un uso similar avisame y te paso el codigo

Desconectado diguito_69

  • PIC16
  • ***
  • Mensajes: 136
Re: PWM en fase
« Respuesta #2 en: 10 de Febrero de 2014, 20:54:08 »
Creo que seria mejor utilizar el modo compare del modulo ccp para generar el pwm sincronizado.

Saludos.
"Carezco de un don especial. Sólo soy apacionadamente curioso". Albert Einstein.


 

anything