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 );
}