TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: AKENAFAB en 10 de Octubre de 2011, 05:47:22

Título: Dimmer 1 canal ,pic12F683.
Publicado por: AKENAFAB en 10 de Octubre de 2011, 05:47:22
Hola amigos!

Estoy retomando el proyecto del dimmer.
Se trata de un dimmer de 1 canal , se puede ajustar a 5 niveles de operación 0%,25%,50%,75% y 95% y se controla serialmente(4800bps,8bits,1stop,N).



Si envian 0x30H esta apagado
Si envian 0x31H " 1 " esta trabajando al 25%
Si envian 0x32H " 2 " esta trabajando al 50%
Si envian 0x33H " 3 " esta trabajando al 75%
Si envian 0x34H " 4 " esta trabajando al 95%

Código: C
  1. #include <12F683.h>
  2. #FUSES INTRC_IO,NOWDT,PUT,NOMCLR,BROWNOUT,PROTECT,CPD,NOIESO,NOFCMEN
  3. #use delay(internal=8MHZ)                                                                       //Oscilador interno 8MHz
  4. #use rs232(baud=4800,rcv=PIN_A3)                                                        //Velocidad limitada por receptor el receptor infrarrojo
  5. #use fast_io(A)
  6. #zero_ram
  7. #priority timer0,int_ra
  8. //************************************************************//
  9. #define debug     // Comment line out for no debug
  10.  
  11. #define Carga1          pin_A0
  12. #define Carga2          pin_A1
  13. #define Carga3          pin_A4
  14.  
  15. #define LED_status      pin_A5
  16. //************************************************************
  17. char intensidad[5]={0,159,191,224,254};                 //Equivale a 0%,25%,50%,75%,95%
  18. char nivel_intensidad;
  19. char desborde_T0;
  20. char cruce_detectado;
  21. char zero_HtoL;
  22. char dato_recibido;
  23. //************************************************************
  24. void main(){
  25.  
  26. //      setup_comparator(NC_NC_NC_NC);  //Comparadores desactivados
  27. //      SETUP_ADC_PORTS(NO_ANALOGS);
  28.  
  29.         output_a(0);                                    //Precargar Latch de Salida
  30.         set_tris_a(0b001100);                   //Configurción de pines
  31.                                                                         //A0=Out-Carga 1
  32.                                                                         //A1=Out-Carga 2
  33.                                                                         //A2=In -Cruce por Cero
  34.                                                                         //A3_MCLR=In -Detector Infrarrojo
  35.                                                                         //A4=Out-Carga 3
  36.                                                                         //A5=Out-LED de Estado
  37.  
  38.         SETUP_TIMER_0(T0_INTERNAL);
  39.         SETUP_TIMER_0(T0_DIV_128);                      //incremento cada 64us si Osc = 8MHz
  40.    
  41.         ENABLE_INTERRUPTS(INT_EXT);             //Initerrupcion externa por A2
  42.         EXT_INT_EDGE(H_TO_L);                   //flanco de bajada
  43.  
  44.         ENABLE_INTERRUPTS(INT_RA3);             //Interrupcion por cambio de estado usada para Recepción Serial
  45.  
  46.         ENABLE_INTERRUPTS(GLOBAL);              //Habilitar Interrupciones
  47.  
  48. //*********************************************************
  49. //*******        Programa Principal     **********************//
  50. //*********************************************************
  51. while(1){
  52.                
  53.         if(cruce_detectado==TRUE){
  54.                 cruce_detectado=FALSE;
  55.  
  56.                 if(nivel_intensidad!=0){                                                        //Si el nivel de intensidad es 0 entonces siempre apagado
  57.                         SET_TIMER0(intensidad[nivel_intensidad]);               //Se actualiza timer
  58.                         ENABLE_INTERRUPTS(INT_TIMER0);                                  //Habilitar Interrupción por desborde de Timer0
  59.                         while(desborde_T0==false);                                              //Esperar a que desborde el timer0
  60.                         DISABLE_INTERRUPTS(INT_TIMER0);                                 //Deshabilitar Interrupción por desborde de Timer0
  61.                         desborde_T0=FALSE;
  62.                         output_high(Carga1);                                                    //Disparo1= ON
  63.                         delay_us(50);
  64.                 }//if intensidad
  65.                 output_low(Carga1);                                                                     //Disparo1= OFF
  66.         }//if cruce detectado
  67.        
  68.         sleep();                                                                                                //
  69.        
  70.         }//end_while
  71.  
  72. }//end_main
  73.  
  74. //**********************************************************
  75. //******        Interrupciones  *******************************//
  76. //**********************************************************
  77.  
  78. #int_ext
  79. void z_cross(){
  80.  
  81.         if(zero_HtoL==TRUE){
  82.                 EXT_INT_EDGE(L_TO_H);                   //por flanco de subida
  83.                 zero_HtoL=FALSE;       
  84.                 }//if
  85.        
  86.         else{
  87.                 EXT_INT_EDGE(H_TO_L);                   //por flanco de bajada
  88.                 zero_HtoL=TRUE;
  89.                 }//else
  90.         cruce_detectado=TRUE;
  91.  
  92. #ifdef  DEBUG
  93.         output_toggle(LED_status);                      //Solo para pruebas
  94. #endif
  95.  
  96. }//int cruce por cero
  97.  
  98. //************************************************************
  99. #int_timer0
  100. void overflow_T0(){
  101.         desborde_T0=TRUE;                                       //Ocurrio desborde de timer0
  102. }//int desborde timer0
  103.  
  104.  
  105. //************************************************************
  106. #INT_RA
  107. void recepcion(){                       //Interrupcion por cambio de estado en pines
  108.         if(input(PIN_A3)==0){                   // Bit de inicio ??? pin A3 es 0 ?
  109.                 dato_recibido=getc();                   //Recibir dato
  110.                 nivel_intensidad=dato_recibido-0x30;    // Se resta 0x30 para pasar a decimal
  111.       }//if bit de inicio
  112. } //int_ra3 recepcion serial
  113.  
  114. //************************************************************

Saludos!
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 22 de Mayo de 2012, 01:17:54
Hola amigos!

Estoy retomando el proyecto del dimmer.
Se trata de un dimmer de 1 canal , se puede ajustar a 5 niveles de operación 0%,25%,50%,75% y 95% y se controla serialmente(4800bps,8bits,1stop,N).



Si envian 0x30H esta apagado
Si envian 0x31H " 1 " esta trabajando al 25%
Si envian 0x32H " 2 " esta trabajando al 50%
Si envian 0x33H " 3 " esta trabajando al 75%
Si envian 0x34H " 4 " esta trabajando al 95%

Código: C
  1. #include <12F683.h>
  2. #FUSES INTRC_IO,NOWDT,PUT,NOMCLR,BROWNOUT,PROTECT,CPD,NOIESO,NOFCMEN
  3. #use delay(internal=8MHZ)                                                                       //Oscilador interno 8MHz
  4. #use rs232(baud=4800,rcv=PIN_A3)                                                        //Velocidad limitada por receptor el receptor infrarrojo
  5. #use fast_io(A)
  6. #zero_ram
  7. #priority timer0,int_ra
  8. //************************************************************//
  9. #define debug     // Comment line out for no debug
  10.  
  11. #define Carga1          pin_A0
  12. #define Carga2          pin_A1
  13. #define Carga3          pin_A4
  14.  
  15. #define LED_status      pin_A5
  16. //************************************************************
  17. char intensidad[5]={0,159,191,224,254};                 //Equivale a 0%,25%,50%,75%,95%
  18. char nivel_intensidad;
  19. char desborde_T0;
  20. char cruce_detectado;
  21. char zero_HtoL;
  22. char dato_recibido;
  23. //************************************************************
  24. void main(){
  25.  
  26. //      setup_comparator(NC_NC_NC_NC);  //Comparadores desactivados
  27. //      SETUP_ADC_PORTS(NO_ANALOGS);
  28.  
  29.         output_a(0);                                    //Precargar Latch de Salida
  30.         set_tris_a(0b001100);                   //Configurción de pines
  31.                                                                         //A0=Out-Carga 1
  32.                                                                         //A1=Out-Carga 2
  33.                                                                         //A2=In -Cruce por Cero
  34.                                                                         //A3_MCLR=In -Detector Infrarrojo
  35.                                                                         //A4=Out-Carga 3
  36.                                                                         //A5=Out-LED de Estado
  37.  
  38.         SETUP_TIMER_0(T0_INTERNAL);
  39.         SETUP_TIMER_0(T0_DIV_128);                      //incremento cada 64us si Osc = 8MHz
  40.    
  41.         ENABLE_INTERRUPTS(INT_EXT);             //Initerrupcion externa por A2
  42.         EXT_INT_EDGE(H_TO_L);                   //flanco de bajada
  43.  
  44.         ENABLE_INTERRUPTS(INT_RA3);             //Interrupcion por cambio de estado usada para Recepción Serial
  45.  
  46.         ENABLE_INTERRUPTS(GLOBAL);              //Habilitar Interrupciones
  47.  
  48. //*********************************************************
  49. //*******        Programa Principal     **********************//
  50. //*********************************************************
  51. while(1){
  52.                
  53.         if(cruce_detectado==TRUE){
  54.                 cruce_detectado=FALSE;
  55.  
  56.                 if(nivel_intensidad!=0){                                                        //Si el nivel de intensidad es 0 entonces siempre apagado
  57.                         SET_TIMER0(intensidad[nivel_intensidad]);               //Se actualiza timer
  58.                         ENABLE_INTERRUPTS(INT_TIMER0);                                  //Habilitar Interrupción por desborde de Timer0
  59.                         while(desborde_T0==false);                                              //Esperar a que desborde el timer0
  60.                         DISABLE_INTERRUPTS(INT_TIMER0);                                 //Deshabilitar Interrupción por desborde de Timer0
  61.                         desborde_T0=FALSE;
  62.                         output_high(Carga1);                                                    //Disparo1= ON
  63.                         delay_us(50);
  64.                 }//if intensidad
  65.                 output_low(Carga1);                                                                     //Disparo1= OFF
  66.         }//if cruce detectado
  67.        
  68.         sleep();                                                                                                //
  69.        
  70.         }//end_while
  71.  
  72. }//end_main
  73.  
  74. //**********************************************************
  75. //******        Interrupciones  *******************************//
  76. //**********************************************************
  77.  
  78. #int_ext
  79. void z_cross(){
  80.  
  81.         if(zero_HtoL==TRUE){
  82.                 EXT_INT_EDGE(L_TO_H);                   //por flanco de subida
  83.                 zero_HtoL=FALSE;       
  84.                 }//if
  85.        
  86.         else{
  87.                 EXT_INT_EDGE(H_TO_L);                   //por flanco de bajada
  88.                 zero_HtoL=TRUE;
  89.                 }//else
  90.         cruce_detectado=TRUE;
  91.  
  92. #ifdef  DEBUG
  93.         output_toggle(LED_status);                      //Solo para pruebas
  94. #endif
  95.  
  96. }//int cruce por cero
  97.  
  98. //************************************************************
  99. #int_timer0
  100. void overflow_T0(){
  101.         desborde_T0=TRUE;                                       //Ocurrio desborde de timer0
  102. }//int desborde timer0
  103.  
  104.  
  105. //************************************************************
  106. #INT_RA
  107. void recepcion(){                       //Interrupcion por cambio de estado en pines
  108.         if(input(PIN_A3)==0){                   // Bit de inicio ??? pin A3 es 0 ?
  109.                 dato_recibido=getc();                   //Recibir dato
  110.                 nivel_intensidad=dato_recibido-0x30;    // Se resta 0x30 para pasar a decimal
  111.       }//if bit de inicio
  112. } //int_ra3 recepcion serial
  113.  
  114. //************************************************************

Saludos!


saludos que optocoplador usuarias??
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: bigluis en 22 de Mayo de 2012, 02:31:18
Debes utilizar un opto-acoplador sin detección de cruce por cero por ejemplo

MOC3011 o MOC3021

También puedes conectar directamente el PIC con la compuerta del TRIAC mediante un resistor, pero es muy peligroso. Una vez quemé un PIC por utilizar esta configuración y me decidí a hacerlo con optoacopladores. Mira la siguiente Nota de Aplicación de Microchip.

http://ww1.microchip.com/downloads/en/AppNotes/91094A.pdf (http://ww1.microchip.com/downloads/en/AppNotes/91094A.pdf)
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: tannke en 22 de Mayo de 2012, 07:14:01
Debes utilizar un opto-acoplador sin detección de cruce por cero por ejemplo

MOC3011 o MOC3021

Tengo la sensación que está preguntando por el optoacoplador y no por el optotriac, al que no sabría contestarte, yo provaría con uno de los típicos tipo 4n25 o 26.

Un saludo
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: bigluis en 22 de Mayo de 2012, 16:08:31
 :oops: Lo siento, tienes razon.

En ese caso no se cual utilizar, pero tambien puedes utilizar un divisor de voltaje mediante resistencias. Es decir, puedes utilizar una resistencia de 10k conectada en serie con una de 2M. Esto hará que practicamente lleguen los 170Vp de la fuente al PIC, pero con muy poca cantidad de corriente, limitada por la resistencia de 10k.
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: AKENAFAB en 23 de Mayo de 2012, 04:55:22


saludos que optocoplador usuarias??

Uso el 4n25
Esto esta probado a 120VCA , las resistencias son de 1/2 Watt.
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 23 de Mayo de 2012, 11:29:10
thx thx gracias a todos por sus respuestas  :lol: ((:-))
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 24 de Mayo de 2012, 11:41:56


saludos que optocoplador usuarias??

Uso el 4n25
Esto esta probado a 120VCA , las resistencias son de 1/2 Watt.

me quede con la duda el opto-triac debe ser uno que no tenga cruce por zero??? y en que influye que sea con cruce???  saludos!
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: bigluis en 24 de Mayo de 2012, 13:37:51
Si el optotriac tiene detección de cruce por cero, no podrás entregarle voltaje a la carga, ya que esta solo podrá ser encendida cuando exista cruce por cero. Por ejemplo, si deseas encender el TRIAC al 50% de la onda, este no encenderá debido a que no es el cruce por cero.
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 24 de Mayo de 2012, 15:45:17
Hola amigos!

Estoy retomando el proyecto del dimmer.
Se trata de un dimmer de 1 canal , se puede ajustar a 5 niveles de operación 0%,25%,50%,75% y 95% y se controla serialmente(4800bps,8bits,1stop,N).



Si envian 0x30H esta apagado
Si envian 0x31H " 1 " esta trabajando al 25%
Si envian 0x32H " 2 " esta trabajando al 50%
Si envian 0x33H " 3 " esta trabajando al 75%
Si envian 0x34H " 4 " esta trabajando al 95%

Código: C
  1. #include <12F683.h>
  2. #FUSES INTRC_IO,NOWDT,PUT,NOMCLR,BROWNOUT,PROTECT,CPD,NOIESO,NOFCMEN
  3. #use delay(internal=8MHZ)                                                                       //Oscilador interno 8MHz
  4. #use rs232(baud=4800,rcv=PIN_A3)                                                        //Velocidad limitada por receptor el receptor infrarrojo
  5. #use fast_io(A)
  6. #zero_ram
  7. #priority timer0,int_ra
  8. //************************************************************//
  9. #define debug     // Comment line out for no debug
  10.  
  11. #define Carga1          pin_A0
  12. #define Carga2          pin_A1
  13. #define Carga3          pin_A4
  14.  
  15. #define LED_status      pin_A5
  16. //************************************************************
  17. char intensidad[5]={0,159,191,224,254};                 //Equivale a 0%,25%,50%,75%,95%
  18. char nivel_intensidad;
  19. char desborde_T0;
  20. char cruce_detectado;
  21. char zero_HtoL;
  22. char dato_recibido;
  23. //************************************************************
  24. void main(){
  25.  
  26. //      setup_comparator(NC_NC_NC_NC);  //Comparadores desactivados
  27. //      SETUP_ADC_PORTS(NO_ANALOGS);
  28.  
  29.         output_a(0);                                    //Precargar Latch de Salida
  30.         set_tris_a(0b001100);                   //Configurción de pines
  31.                                                                         //A0=Out-Carga 1
  32.                                                                         //A1=Out-Carga 2
  33.                                                                         //A2=In -Cruce por Cero
  34.                                                                         //A3_MCLR=In -Detector Infrarrojo
  35.                                                                         //A4=Out-Carga 3
  36.                                                                         //A5=Out-LED de Estado
  37.  
  38.         SETUP_TIMER_0(T0_INTERNAL);
  39.         SETUP_TIMER_0(T0_DIV_128);                      //incremento cada 64us si Osc = 8MHz
  40.    
  41.         ENABLE_INTERRUPTS(INT_EXT);             //Initerrupcion externa por A2
  42.         EXT_INT_EDGE(H_TO_L);                   //flanco de bajada
  43.  
  44.         ENABLE_INTERRUPTS(INT_RA3);             //Interrupcion por cambio de estado usada para Recepción Serial
  45.  
  46.         ENABLE_INTERRUPTS(GLOBAL);              //Habilitar Interrupciones
  47.  
  48. //*********************************************************
  49. //*******        Programa Principal     **********************//
  50. //*********************************************************
  51. while(1){
  52.                
  53.         if(cruce_detectado==TRUE){
  54.                 cruce_detectado=FALSE;
  55.  
  56.                 if(nivel_intensidad!=0){                                                        //Si el nivel de intensidad es 0 entonces siempre apagado
  57.                         SET_TIMER0(intensidad[nivel_intensidad]);               //Se actualiza timer
  58.                         ENABLE_INTERRUPTS(INT_TIMER0);                                  //Habilitar Interrupción por desborde de Timer0
  59.                         while(desborde_T0==false);                                              //Esperar a que desborde el timer0
  60.                         DISABLE_INTERRUPTS(INT_TIMER0);                                 //Deshabilitar Interrupción por desborde de Timer0
  61.                         desborde_T0=FALSE;
  62.                         output_high(Carga1);                                                    //Disparo1= ON
  63.                         delay_us(50);
  64.                 }//if intensidad
  65.                 output_low(Carga1);                                                                     //Disparo1= OFF
  66.         }//if cruce detectado
  67.        
  68.         sleep();                                                                                                //
  69.        
  70.         }//end_while
  71.  
  72. }//end_main
  73.  
  74. //**********************************************************
  75. //******        Interrupciones  *******************************//
  76. //**********************************************************
  77.  
  78. #int_ext
  79. void z_cross(){
  80.  
  81.         if(zero_HtoL==TRUE){
  82.                 EXT_INT_EDGE(L_TO_H);                   //por flanco de subida
  83.                 zero_HtoL=FALSE;       
  84.                 }//if
  85.        
  86.         else{
  87.                 EXT_INT_EDGE(H_TO_L);                   //por flanco de bajada
  88.                 zero_HtoL=TRUE;
  89.                 }//else
  90.         cruce_detectado=TRUE;
  91.  
  92. #ifdef  DEBUG
  93.         output_toggle(LED_status);                      //Solo para pruebas
  94. #endif
  95.  
  96. }//int cruce por cero
  97.  
  98. //************************************************************
  99. #int_timer0
  100. void overflow_T0(){
  101.         desborde_T0=TRUE;                                       //Ocurrio desborde de timer0
  102. }//int desborde timer0
  103.  
  104.  
  105. //************************************************************
  106. #INT_RA
  107. void recepcion(){                       //Interrupcion por cambio de estado en pines
  108.         if(input(PIN_A3)==0){                   // Bit de inicio ??? pin A3 es 0 ?
  109.                 dato_recibido=getc();                   //Recibir dato
  110.                 nivel_intensidad=dato_recibido-0x30;    // Se resta 0x30 para pasar a decimal
  111.       }//if bit de inicio
  112. } //int_ra3 recepcion serial
  113.  
  114. //************************************************************

Saludos!

una consulta donde puedo encontrar informacion sobre la modulacion por posicion de pulso ya que no encuentro nada teorico y mucho menos que este explicado correctamente, saludos!
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 24 de Mayo de 2012, 18:27:26
AKENAFAB  me explicas como es el programa porque por mas que lo razono no entiendo algunas cosas por ejemplo el pin A0 es el mismo que GP0???
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: rivale en 24 de Mayo de 2012, 19:37:38
El A0 es igual al GP0 debido a que ccs no tiene el nombre del puerto GP, por eso le llama A
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 27 de Mayo de 2012, 19:43:15
AKENAFAB  me explicas como es el programa porque por mas que lo razono no entiendo algunas cosas por ejemplo el pin A0 es el mismo que GP0???
sigo sin entender tu programa y esque quisiera hacer algo similar en el pic 16f877A agradezco tu ayuda
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: bigluis en 27 de Mayo de 2012, 21:21:06
Por lo general cuando se hace una pregunta esta debe ser específica. Es decir, que cosa del programa no entiendes. De lo contrario no sabremos como ayudarte.

Si el problema es que no entiendes el programa completo, probablemente se deba a que no conoces mucho de C ni de PICs. Si ese es el caso te recomiendo que primero aprendas sobre estos antes de adentrarte a un proyecto.
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 29 de Mayo de 2012, 13:32:37
Por lo general cuando se hace una pregunta esta debe ser específica. Es decir, que cosa del programa no entiendes. De lo contrario no sabremos como ayudarte.

Si el problema es que no entiendes el programa completo, probablemente se deba a que no conoces mucho de C ni de PICs. Si ese es el caso te recomiendo que primero aprendas sobre estos antes de adentrarte a un proyecto.

entonces me podrias sugerir un libro o material de consulta asi evito molestias, saludos
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: bigluis en 31 de Mayo de 2012, 02:26:24
Lo siento, no era mi intención ser o parecer grosero.

En el siguiente link encontrarás información de programación básica
http://www.todopic.com.ar/foros/index.php?topic=14634.0 (http://www.todopic.com.ar/foros/index.php?topic=14634.0)

Te recomiendo que comiences desde lo mas sencillo, hasta llegar a lo más complejo.
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 05 de Junio de 2012, 19:50:20
saludos!, tengo una nueva consulta, y el puntoe s que no recuerdo exactamente como relacionar el ADC de la siguiente manera: ejemplo si un adc de 4 bit tenemos que pueden hacerce que 2^4=16 valores, entonces si el vref es 5v como saco la relacion de:

0000    0v
0001     ??
0010     ???

sucesivamente hasta llegar a 1111   5v

en verdad agradesco su apoyo ya que tengo algo que egrese de la facultad y entre el trabajo y lo demas me despiste.


 saludos a todos y gracias al compañero que me apoyo con los tutoriales en el ultimo post me e apoyado en ellos mucho
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: bigluis en 05 de Junio de 2012, 21:00:15
Lo primero que debes hacer es convertir el valor Binario a un valor decimal, por ejemplo

0010=2

luego realizas una regla de 3

1111=15 dec = 5V

0010= 2 dec = x

por lo tanto

x = 5V * 2dec / 15 dec = 0.6667 V
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 06 de Junio de 2012, 01:03:16
Lo primero que debes hacer es convertir el valor Binario a un valor decimal, por ejemplo

0010=2

luego realizas una regla de 3

1111=15 dec = 5V

0010= 2 dec = x

por lo tanto

x = 5V * 2dec / 15 dec = 0.6667 V


O.o y asi de facil??? yo recordaba una formula que decia vo=vref/(2^n-1)   o algo asi porl el estilo jeje XD bueno esque ya son mas de 2 años que deje los libros atras por eso el de retomar los temas.

bueno gracias y saludos!
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: bigluis en 06 de Junio de 2012, 18:56:21
 :D Si a mi también me enseñaron de esa forma, pero lo olvidé y solo me acordé de esta otra forma  :D
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: MLO__ en 06 de Junio de 2012, 22:41:43
Hola

Es la forma correcta como dices hypnos00, pero mira que si tienes un Vref=5v y un ADC de 4 bits, vas a tener la razon:  5/15, la cual es la que multiplicas por el valor ADC que te entrega el PIC.

Si tienes un ADC de 8 bits, la razon sera de 5/255, tal y como lo recuerdas :)

Saludos
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 12 de Junio de 2012, 14:46:08
encontre este programa que se supone que es el dimmer con int externa pero noe ntiendo a que hacen referencia con la formula retardo=(int16)(255-data)*32 ya que cual es el objetivo de poner int16 entre parentesis, y de donde sale el 32, bueno si alguien tiene la respuesta le agradezco de antemano, saludos!


 #include "16f877a.h"
            #device ADC=8
            #fuses XT,NOWDT,NOPROTECT,NOLVP,NODEBUG
            #use delay(clock=4000000)
            #define Pulse PIN_C0             //aquí manda pulso disparo al triac
           
            int flag=0;                      //#include
               
            #int_ext
            void ext_isr()
            { flag=1; }
           
            void main()
            {
            BYTE i, j, address, value;
            int16 q, q1;
            int16 retardo=0,data=200;
            float p; q1=0;
           
            output_low(Pulse);
            setup_adc_ports(AN0);
            setup_adc(ADC_CLOCK_INTERNAL);
            set_adc_channel(0);
            ext_int_edge(0,L_TO_H);
            enable_interrupts(INT_EXT);
            enable_interrupts(GLOBAL);
           
            do
            {
            if(flag)
            {
            data=read_adc();
            retardo=(int16)(255-data)*32;
            delay_us(retardo);
            output_high(Pulse);
            delay_us(40);
            output_low(Pulse);
            flag=0;
            }
            }while (TRUE);
            }
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 12 de Junio de 2012, 14:47:33
Hola

Es la forma correcta como dices hypnos00, pero mira que si tienes un Vref=5v y un ADC de 4 bits, vas a tener la razon:  5/15, la cual es la que multiplicas por el valor ADC que te entrega el PIC.

Si tienes un ADC de 8 bits, la razon sera de 5/255, tal y como lo recuerdas :)

Saludos


lo pillo thx men :)
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: bigluis en 14 de Junio de 2012, 14:33:19
a que hacen referencia con la formula retardo=(int16)(255-data)*32 ya que cual es el objetivo de poner int16 entre parentesis, y de donde sale el 32,

Ese (int16) convierte del valor de (255-data) a un entero de 16 bits mediante casting ya que data es un entero de 8 bits. Por ejemplo si data es igual a 0 entonces 255-data sería igual a 255. Si multiplicas 255 por 32, el resultado debería ser 8160 (que es un entero de mas de 8bits), pero si 255 esta almacenado en una variable de 8 bits, la multiplicación daría 224 debido a que se pierden los demás bits. Es por ello que es necesario convertir el resultado de la resta a un entero de 16 bits antes de realizar la multiplicación.

Por otro lado la multiplicación por 32 se debe a que el valor maximo obtenido es 8160. Este valor luego es pasado a la función delay_us. Es decir, conviertes los valores del ADC a retardos, dando como máximo retardo 8.16ms lo que equivale a medio ciclo de la onda senoidal.
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 14 de Junio de 2012, 19:28:24
a que hacen referencia con la formula retardo=(int16)(255-data)*32 ya que cual es el objetivo de poner int16 entre parentesis, y de donde sale el 32,

Ese (int16) convierte del valor de (255-data) a un entero de 16 bits mediante casting ya que data es un entero de 8 bits. Por ejemplo si data es igual a 0 entonces 255-data sería igual a 255. Si multiplicas 255 por 32, el resultado debería ser 8160 (que es un entero de mas de 8bits), pero si 255 esta almacenado en una variable de 8 bits, la multiplicación daría 224 debido a que se pierden los demás bits. Es por ello que es necesario convertir el resultado de la resta a un entero de 16 bits antes de realizar la multiplicación.

Por otro lado la multiplicación por 32 se debe a que el valor maximo obtenido es 8160. Este valor luego es pasado a la función delay_us. Es decir, conviertes los valores del ADC a retardos, dando como máximo retardo 8.16ms lo que equivale a medio ciclo de la onda senoidal.

colega me das permiso de agregarte al msn???
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: bigluis en 15 de Junio de 2012, 01:05:01
Ok, pero por los momentos no tengo mucho tiempo, así que no podré atenderte.
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 02 de Julio de 2012, 15:20:45
a que hacen referencia con la formula retardo=(int16)(255-data)*32 ya que cual es el objetivo de poner int16 entre parentesis, y de donde sale el 32,

Ese (int16) convierte del valor de (255-data) a un entero de 16 bits mediante casting ya que data es un entero de 8 bits. Por ejemplo si data es igual a 0 entonces 255-data sería igual a 255. Si multiplicas 255 por 32, el resultado debería ser 8160 (que es un entero de mas de 8bits), pero si 255 esta almacenado en una variable de 8 bits, la multiplicación daría 224 debido a que se pierden los demás bits. Es por ello que es necesario convertir el resultado de la resta a un entero de 16 bits antes de realizar la multiplicación.

Por otro lado la multiplicación por 32 se debe a que el valor maximo obtenido es 8160. Este valor luego es pasado a la función delay_us. Es decir, conviertes los valores del ADC a retardos, dando como máximo retardo 8.16ms lo que equivale a medio ciclo de la onda senoidal.

colega me das permiso de agregarte al msn???

 int16 retardo=0,data=200; otra dura pork limitan a data a 200 bueno a lo que se es por que esta almacenado en 8 bit y para no saturar solo hacen que llegue a 200, bueno si me equivoco corrijanme porfavor
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 22 de Agosto de 2012, 17:17:08
:oops: Lo siento, tienes razon.

En ese caso no se cual utilizar, pero tambien puedes utilizar un divisor de voltaje mediante resistencias. Es decir, puedes utilizar una resistencia de 10k conectada en serie con una de 2M. Esto hará que practicamente lleguen los 170Vp de la fuente al PIC, pero con muy poca cantidad de corriente, limitada por la resistencia de 10k.


la resistencia deberia de se a 5w??
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: bigluis en 22 de Agosto de 2012, 23:33:50
No

Para obtener el valor de potencia debes tomar en cuenta lo siguiente

P=V*I=(V^2)/R=(170^2)/2M=0.01445W

Puedes utilizar una resistencia de 1/4W pero lo mejor es una de 1/2W por seguridad.

Por cierto, no es un divisor de voltaje, es la Resistencia de 2M directamente a la entrada del PIC, pero esta debe ser una entrada con diodos de protección. Por lo general todas las entradas q sirven para ADC traen esa protección. De lo contrario tendrás que poner los diodos de protección.
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: bigluis en 23 de Agosto de 2012, 00:26:45
Como puedes ver en la siguiente imagen utilizan 2 resistencias de 11k de 1/8W y una de 22k para detectar el cruce por cero.

(https://sphotos-b.xx.fbcdn.net/hphotos-prn1/531099_3492240756915_954397815_n.jpg)

esto lo puedes ver en la nota de aplicación de microchip q aparee en el siguiente enlace

http://ww1.microchip.com/downloads/en/AppNotes/91094A.pdf (http://ww1.microchip.com/downloads/en/AppNotes/91094A.pdf)
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: hypnos00 en 13 de Septiembre de 2012, 16:12:03
No

Para obtener el valor de potencia debes tomar en cuenta lo siguiente

P=V*I=(V^2)/R=(170^2)/2M=0.01445W

Puedes utilizar una resistencia de 1/4W pero lo mejor es una de 1/2W por seguridad.

Por cierto, no es un divisor de voltaje, es la Resistencia de 2M directamente a la entrada del PIC, pero esta debe ser una entrada con diodos de protección. Por lo general todas las entradas q sirven para ADC traen esa protección. De lo contrario tendrás que poner los diodos de protección.

que diodos me  recomiendas? yo pensaba en unos basicos 1N4002
Título: Re: Dimmer 1 canal ,pic12F683.
Publicado por: bigluis en 13 de Septiembre de 2012, 17:32:26
si esos estan bien
Título: Re:Dimmer 1 canal ,pic12F683 triac control temperatura con pic
Publicado por: rozjav en 28 de Enero de 2016, 19:50:29
Apreciados señores estoy buscando un proyecto que me ayude a diseñar un sistema de control temperatura mediante un pic, moc 3031 o 3041 y tiac HQ6025 para poder graduar temperatura máxima y mínima de la resistencia calefactora - controlar hasta 170 ¬C y mínima 40-50C; hasta ahora tengo claro que debo tener un detector de cruce cero; para evitar disparos del triac que ocasionen ruido eléctrico y sobre corriente; estaba viendo el mensaje de la referencia; pero no logro aclarar si el código y configuración es la adecuada para tal fin. Las resistencias que van entre el moc y el triac que potencia deberán disipar

Que pasa si empleo moc 3041 que viene con detector cruce cero; como modifica el programa del pic?


Saludos


Javier
Título: Re:Dimmer 1 canal ,pic12F683.
Publicado por: KILLERJC en 28 de Enero de 2016, 21:05:41
Citar
Que pasa si empleo moc 3041 que viene con detector cruce cero; como modifica el programa del pic?

Es que vas a tener que implementar otra forma de recortar el voltaje, en ves de hacerlo por fase, vas a tener que recortar medio ciclos.