Voy a ver si encuentro un codigo que use, para explicarte como configuras esto del PWM
Saludos!
Voy a ver si encuentro un codigo que use, para explicarte como configuras esto del PWM
Saludos!
"Cuando llegue la inspiración, que me encuentre trabajando."
PICASSO, Pablo
Consulta el Indice de Montajes NeoTeo
Esta etapa concluyó, ahora estoy Por aquí...
No soy mas Moderador aunque figure como tal.
RDBrot (02/07/2012)
Acá encontré el código comentado paso por paso y como se configura, lo demás es todo tuyo es decir tu encárgate de modificarlo a tu gusto![]()
Saludos!#include <16f876.h>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=4000000)
void main(void){
long duty_PWM1, duty_PWM2;
// Para cristal de 4 mhz, frecuencia de 20 khz ,
// T2DIV set to 1
// Para calcular la frecuencia:
// (4/frecuencia cristal)*T2_DIV*(periodo+1)
// (4/4000000)*1*(49+1)=0.00005seg
setup_timer_2(T2_DIV_BY_1, 49, 1);
// seleccionamos PWM para los dos módulos CCP
setup_ccp1 (CCP_PWM);
setup_ccp2 (CCP_PWM);
// cargamos el duty cicle para cada PWM. La frecuencia es igual para ambas, 20KHz.
// Para calcular el tiempo en nivel alto, dado que usamos un LONG, sería:
// Valor*T2_DIV*(1/frecuencia del cristal). Si se usa un valor tipo INT en lugar
// de LONG se calcularía multiplicando la fórmula por 4: Valor*T2_DIV*(1/frecuencia del cristal)*4
duty_PWM1 = 100; // 0.000025seg/(1*(1/4000000))=100, que es el valor a cargar. Duty 50%
duty_PWM2 = 200; // 0.000050seg/(1*(1/4000000))=200. Si te fijas, con 20KHZ el T=50us,
// que es lo que se ha puesto para el duty, osea, todo.
// Por tanto la señal será continua a 5v. Duty cicle 100%
set_pwm1_duty(duty_PWM1);
set_pwm2_duty(duty_PWM2);
while(1){ //bucle infinito.
}
}
eso que lo haga en un circuito externo, no?Ojo, que cuando se trabaja sobre la red eléctrica el "PWM" debe estar sincronizado con la frecuencia de red, es decir debes detectar el cruce por cero de la señal alterna, sino, el triac no se va ha apagar, y nunca vas ha lograr que funcione como debe ser.
la programación del pic aparte y que en un circuito externo que detecte el cruce
en el video que pase en comentarios anteriores creo que tenia el circuito....
Saludos!
"Cuando llegue la inspiración, que me encuentre trabajando."
PICASSO, Pablo
Consulta el Indice de Montajes NeoTeo
Esta etapa concluyó, ahora estoy Por aquí...
No soy mas Moderador aunque figure como tal.
faiste (02/07/2012)
aaaaa perdon me olvide que era ACInsisto, no es lo mismo trabajar en DC que en AC.
mis disculpas, bueno pero la programación le sirve para ver como configura el timer
Saludos!
Por fin!!!! Después de mucho cacharreo el código por fin funciona...
Gracias a Después por sus comentarios y ayudar a resolver este problema...
Dejo el código por si alguien quiere verlo o lo necesita para una aplicación.![]()
![]()
Código:#include <12F675.h> #FUSES NOWDT //No Watch Dog Timer #FUSES INTRC_IO //Internal RC Osc, no CLKOUT #FUSES NOCPD //No EE protection #FUSES NOPROTECT //Code not protected from reading #FUSES MCLR //Master Clear pin enabled #FUSES NOPUT //No Power Up Timer #FUSES BROWNOUT //Reset when brownout detected #use delay(int=4000000) #use FIXED_IO( A_outputs=PIN_A0 ) #define GP0 PIN_A0 // TRIAC #define GP1 PIN_A1 // SIN USAR #define GP2 PIN_A2 // DETECTOR CRUCE POR CERO #define GP3 PIN_A3 // RESET - MASTER CLEAR #define GP4 PIN_A4 // UP #define GP5 PIN_A5 // DOWN int counter = 0; int retardo = 85; //int tmr0load; #int_EXT void EXT_isr(void) { output_low(GP0); counter = 0; set_timer0(retardo); enable_interrupts(INT_TIMER0); } #int_TIMER0 void TIMER0_isr(void) { set_timer0(retardo); counter = counter + 1; if (counter >= retardo){ output_high(GP0); disable_interrupts(INT_TIMER0); } } void main() { enable_interrupts(GLOBAL); enable_interrupts(INT_EXT); setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1); enable_interrupts(INT_TIMER0); output_low(GP0); while(TRUE) { if (input(GP4)==1) { delay_ms(50); if (retardo > 2) { retardo--; } else{ retardo = 1; } } if (input(GP5)==1) { delay_ms(50); if (retardo<85) { retardo++; } else{ retardo = 85; } } } }
Última edición por Mario; 02/07/2012 a las 13:56 Razón: Acomoda código para mejor visualización
Hola Barrero0717, me alegro que lo hayas echo andar.
Saludos
HJ
"Cuando llegue la inspiración, que me encuentre trabajando."
PICASSO, Pablo
Consulta el Indice de Montajes NeoTeo
Esta etapa concluyó, ahora estoy Por aquí...
No soy mas Moderador aunque figure como tal.
//este codigo es muy censillo y funciona, sin necesidad de tmr0 esta con dos pulsadores y esta hecho para que el triac entregue tres diferentes niveles de potencia a la caarga q deseesCódigo:#include <16F873A.h> // busca en el directorio include del compilador #fuses HS,NOWDT,PUT,NODEBUG,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT #use delay(clock = 20M) // CRISTAL DEL PIC = 20MHz // ======= DECLARACION DE PUERTOS Y REGISTROS ESPECIALES DEL PIC (BK5) ======== #BYTE pta = 0x5 // dirección en RAM #BYTE ptb = 0x6 // dirección en RAM #BYTE ptc = 0x7 // dirección en RAM //#BYTE ptd = 0x8 // dirección en RAM //#BYTE pte = 0x9 // dirección en RAM #BYTE trisa = 0x85 // dirección en RAM #BYTE trisb = 0x86 // dirección en RAM #BYTE trisc = 0x87 // dirección en RAM //#BYTE trisd = 0x88 // dirección en RAM //#BYTE trise = 0x89 // dirección en RAM #BYTE status = 0x3 // dirección en RAM #BYTE intcon = 0x0B // dirección en RAM #BYTE option = 0x81 // dirección en RAM #BYTE adcon0 = 0x1F // dirección en RAM #BYTE adcon1 = 0x9B // dirección en RAM #BYTE pir1 = 0x0C // dirección en RAM #BYTE pie1 = 0x8C // dirección en RAM #BYTE pir2 = 0x0D // dirección en RAM #BYTE pie2 = 0x8D // dirección en RAM //===== DECLARACION GLOBAL DE VARIABLES, VECTORES Y MATRICES EN RAM (BK3) ====== int8 x=0,i=0; // ================ NOMINACION DE PINES DEL HARDWARE (BK2) ============== #BIT D0 = ptc.7 //bit 1 del puerto c #BIT cambio = option.6 // ============== DECLARACION DE INTERRUPCIONES DEL PIC (BK8) ================= #int_EXT //ptb0 void int_b0(void) { cambio=!cambio; if(x==1) { D0=0; delay_us(6200); D0=1; delay_us(2); D0=0; } if(x==2) { D0=0; delay_us(4000); D0=1; delay_us(2); D0=0; } if(x==3) { D0=0; delay_us(0); D0=1; delay_us(2); D0=0; } } #int_RB //ptb4 A ptb7 void RB_isr(void) { if (!bit_test(ptb,4)) { if(x<3) x=x+1; } if (!bit_test(ptb,5)) { if(x>1) x=x-1; } } void main() // ========= INICIO FUNCION PRINCIPAL MAIN (BK5 A BK7) ============ { // ------------ configuracion Puertos --------------- set_tris_a(0b00000000); // dirección puerto C 0=out, 1=input // set_tris_d(0b00000000); // dirección puerto C 0=out, 1=input set_tris_c(0b00000000); // dirección puerto C 0=out, 1=input //set_tris_e(0b00000000); // dirección puerto C 0=out, 1=input output_low(pin_c7); // como salida e inicializado en 0 port_b_pullups(true); // habilito pull up portb // ------- configuracion interrupcion port b0 -------- ext_int_edge(h_to_l); // configuracion flanco ptb0 h_to_l ó l_to_h enable_interrupts(int_ext); // habilito int ptb0 output_float(pin_b0); // ptb0 como entrada // ------- configuracion interrupcion port b4 a b7-------- enable_interrupts(int_rb); // habilito int ptb4ab7 output_float(pin_b4); // ptb4 como entrada output_float(pin_b5); // ptb5 como entrada // ------- configuracion general del PIC -------- enable_interrupts(global); // ENABLE_INTERRUPTS(GLOBAL) do{ } while(true); }
Última edición por Mario; 17/11/2012 a las 00:21 Razón: Incrustar el código correctamente
Hola, se me ocurre probar de deshabilitar la interrupción externa antes de cambiar el flanco y luego habilitarla nuevamente.
Saludos,
Fernando