Bueno ya logre algo que para uno es super sencillo que era variar el ciclo de trabajo con el pulsador. Despues de 1 mes jejejje. Unos comentarios mas arriba BrunoF me compartió un código para realizar el desafase de 2 señales a partir de una de referencia, es un código que me ayudo a entender muchas cosas ya que ese es el objetivo final pero lo tengo pensado hacer con el Dspic que mande a pedir, el cual se demora un poquito. Así que he tomado el código para poder realizar solo el desfase entre 2 señales 180 grados respecto a la otra con la misa frecuencia pero no me sale

. Como he dicho esto lo quiero hacer para controlar un Puente H con módulos IGBT. Anexo el código que no me quiere salir y La imagen a lo que quiero llegar. Nota debo de generar un tiempo muerto para que los IGBT de la misma rama no esten activado al mismo tiempo, segun la hoja de datos del IGBT el tiene un tiempo de apagado de 350ns entonces mas o menos el tiempo muerto lo haría de 370ns..
#include <p18f4550.h>
#include <delays.h>
/*-----Definicion de estados--------*/
#define ciclo_10 1 //Ciclo del 10%
#define ciclo_20 2 //Ciclo del 20%
#define ciclo_30 3 //Ciclo del 30%
#define ciclo_40 4 //Ciclo del 40%
#define ciclo_50 5 //Ciclo del 50%
/*-----Definicion de pines-----------*/
#define PWM1 LATBbits.LATB0
#define PWM2 LATBbits.LATB2
#define button1 PORTAbits.RA0
/*-------------------------------------*/
unsigned char contador1,contador2,PwmValue,PwmValue2,estado;
/*----Prototipos de funciones----------*/
void phase_shift(void);
/*-------Interrupción de Alta_Prioridad---------*/
void Interrupt_ISR_TMR0(void);
#pragma code High_vector_Interrupt = 0x08
void High_vector(void){
_asm goto Interrupt_ISR_TMR0 _endasm
}
#pragma code
#pragma interrupt Interrupt_ISR_TMR0
void Interrupt_ISR_TMR0 (void)
{
INTCONbits.TMR0IF=0; /*Borramos bandera*/
TMR0L=243;
if(++contador1>10) contador1=1;
if(++contador2>10) contador2=1;
if(PwmValue>=contador1) PWM1=1; else PWM1=0;
if(PwmValue2>=contador2) PWM2=1; else PWM2=0;
}
void main(){
estado=ciclo_10;
TRISB=0x00;
LATB=0x00;
TRISAbits.RA0=1; //Como entradas
//LATAbits.LATA0=0;
/*---------Configuracion Oscilador--------*/
OSCCONbits.SCS1=0; //Oscilador primario
OSCCONbits.SCS0=0;
ADCON1=0x0F; //Todos los pines como digitales
T0CONbits.TMR0ON=0; //Timero Off
T0CONbits.T08BIT=1; //Configuracion a 8bits
T0CONbits.T0CS=0; //Internal Instruccion
T0CONbits.T0SE=0;
T0CONbits.PSA=0; //Prescaler On
T0CONbits.T0PS2=0; //Prescaler 1:2
T0CONbits.T0PS1=0;
T0CONbits.T0PS0=0;
RCONbits.IPEN=1; //Habilitamos la prioridad
INTCONbits.TMR0IF=0; //Interrupcion por desbordamiento
INTCONbits.GIE_GIEH=1;
INTCONbits.GIEH=1; //Activamos alta_Prioridad
INTCONbits.TMR0IE=1;
INTCON2bits.TMR0IP=1; //TMR0 Alta prioridad.
T0CONbits.TMR0ON=1; //On Timer0
while(1){
switch(estado){
case ciclo_10 :
PwmValue=1;
PwmValue2=1;
while(button1);
Delay1KTCYx(10);
while(!button1);
Delay1KTCYx(10);
estado=ciclo_20;
break;
case ciclo_20 :
PwmValue=2;
PwmValue2=2;
while(button1);
Delay1KTCYx(10);
while(!button1);
Delay1KTCYx(10);
estado=ciclo_30;
break;
case ciclo_30 :
PwmValue=3;
PwmValue2=3;
while(button1);
Delay1KTCYx(10);
while(!button1);
Delay1KTCYx(10);
estado=ciclo_40;
break;
case ciclo_40 :
PwmValue=4;
PwmValue2=4;
while(button1);
Delay1KTCYx(10);
while(!button1);
Delay1KTCYx(10);
estado=ciclo_50;
case ciclo_50:
PwmValue=5;
PwmValue2=5;
while(button1);
Delay1KTCYx(10);
while(!button1);
Delay1KTCYx(10);
estado=ciclo_10;
break;
}
phase_shift();
}
}
void phase_shift(void){
unsigned char tmp;
tmp=(contador1+6)%11;
if(!tmp) tmp++;
contador2=tmp;
}