miércoles, 12 de febrero de 2014

Control de Potencia en AC con triac y microcontrolador PIC 16F628A

El Triac
El Triac es un dispositivo capaz conducir en ambas direcciones,  es útil para usarlo en control potencia de corriente alterna, posee un pin a través del cual se controla la conducción.

Símbolo esquemático del triac

La conducción  empieza cuando se ingresa una corriente de magnitud mínima $I_{GT}$   positiva o negativa por la compuerta (Pin G), una vez que el triac entra en conducción, la compuerta pierde el control  y el triac permanecerá conduciendo hasta que la corriente que circula entre A1 y A2 sea menor a una corriente de mantenimiento $I_H$, si necesitamos que el triac vuelva a conducir debemos lanzar otro pulso de corriente en el gate, aun cuando existen mas formas de disparar el triac, para el propósito presente solo usaremos la que hemos mencionado.

Control de Fase
 Si conectamos la fuente Vac directamente a la carga y suponiendo que la carga "LOAD" es puramente resistiva, la potencia en la carga viene dada por:

$$P=\frac{V_{AC}^2}{R}$$

Donde:
$V_{AC}$: es el voltaje efectivo de la onda senoidal
$R$: Es el valor en $\Omega$ de la carga resistiva.

Ahora, que pasa si permitimos que se transfiera corriente a la carga solo a partir de un cierto ángulo de disparo al cual llamaremos "$\alpha$", la tensión que llega a la carga tendría la forma de la onda de color verde como muestra la siguiente figura.

Control de fase

El ángulo $\alpha$ puede tomar cualquier valor entre $0$ y $\pi$ radianes, la potencia promedio  que recibe la carga en función del ángulo de disparo $\alpha$, estará dada por la fórmula:
$$P =\frac{1}{\pi} \int_{\alpha}^{ \pi} \frac{[A \cdot sin(\alpha)]^2}{R} \cdot d\alpha$$
$$P=\frac{A^2}{2\pi R}[{\pi-\alpha +\frac{1}{2} \sin(2\alpha})]$$
Donde $A$ es la amplitud de la onda senoidal.
Por simetría del problema solo es necesario integrar hasta $pi$ .

De la misma manera si queremos calcular el voltaje efectivo de la nueva onda "senoidal troceada" , en función del ángulo $\alpha$ tenemos:
$$V_{rms}=\frac{A}{\sqrt{2\pi}}\sqrt{[{\pi-\alpha +\frac{1}{2} \sin(2\alpha})]}$$

A continuación graficamos la dependencia entre el ángulo "$\alpha$", la potencia promedio "$P$" y el voltaje efectivo de la onda troceada "$V_{rms}$"


Gráfica de Ángulo de disparo, Potencia y Tensión Eficaz


El anterior gráfico, muestra como variando el ángulo de disparo (eje $X$) del triac, podemos variar la potencia que se suministra a la carga. EN el grafico, $V_{max}$ es el valor efectivo máximo que corresponde al valor efectivo de una senoidal completa es decir $\frac{A}{\sqrt{2}}$

Un circuito típico para manejar cargas en AC es como el de la figura siguiente:


Circuito 1, para variación de potencia con triac


El proceso que llevara a cabo el microcontrolador  para variar potencia mediante el triac consta de los siguientes pasos:

1:  - Detectar inicio de un nuevo medio ciclo de onda  
2:  - Esperar un tiempo t correspondiente al ángulo alfa
3:  - Enviar la señal de disparo al circuito de control  
4:  - Volver al paso 1  

Para detectar el principio de un medio ciclo de onda, usaremos este circuito cuya salida conectaremos al pin de Interrupción externa.


Circuito 2, para detectar cruce por cero de la onda senoidal.


En el Circuito 2 muestran  las formas de onda generadas en cada etapa del circuito conformador, este circuito se encarga de acondicionar la señal de la red para que el PIC16f628A detecte cada medio ciclo de la red, por medio de la interrupción externa (pin B0).

Circuito 3, circuito completo para probar el ejemplo.


 El código usado para probar el circuito es el siguiente, se usa esta usando el oscilador interno a 4MHz:


1:  #include"16f628a.h"  
2:  #use delay(clock=4000000)  
3:  #use standard_io(a)  
4:  #use standard_io(b)  
5:  #FUSES NOWDT              //No Watch Dog Timer  
6:  #FUSES INTRC_IO            //Internal RC Osc, no CLKOUT  
7:  #FUSES PUT               //Power Up Timer  
8:  #FUSES PROTECT             //Code protected from reads  
9:  #FUSES NOBROWNOUT           //No brownout reset  
10:  #FUSES MCLR              //Master Clear pin enabled  
11:  #FUSES NOLVP              //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O  
12:  #FUSES NOCPD              //No EE protection  
13:  #FUSES RESERVED            //Used to set the reserved FUSE bits  
14:  #DEFINE PIN_TTRIAC1 PIN_A3  
15:  #DEFINE PIN_TTRIAC2 PIN_b2  
16:  // El programa funciona de la siguiente manera:  
17:  // El circuito de conformacion de onda, conectado al pin de INT0  
18:  // hace que se genere una interrupcion en cada inicio de medio ciclo de la onda senoidal  
19:  // de la red, asi para 60Hz, se generara una interrupcion cada 1/(2*60Hz)=8.33ms  
20:  // Cuando se produzca la interrupcion, desde la rutina EXT_ISR   
21:  // se habilitara la interrupcion INT_T0 y se cargara el registro TIMER0 con un valor "k"  
22:  // Luego vendra la interrupcion por desbordamiento de Timer0, y disparara el triac,  
23:  // el valor de "k" se hara variar continuamente para conseguir un efecto de destello  
24:  #int_TIMER0  
25:  void INT_T0(void)   
26:  {  
27:    output_high(PIN_TTRIAC1);  
28:    output_high(PIN_TTRIAC2);  
29:    delay_us(10);   
30:    output_low(PIN_TTRIAC1);  
31:    output_low(PIN_TTRIAC2);  
32:    disable_interrupts(INT_TIMER0);  
33:  }  
34:  int k=0;  
35:  #int_EXT  
36:  void EXT_isr(void)   
37:  {  
38:     set_timer0(k--);  
39:     enable_interrupts(INT_TIMER0);  
40:  }  
41:  void config (void)  
42:  {  
43:    setup_timer_1(T1_DISABLED);  
44:    setup_timer_2(T2_DISABLED,0,1);  
45:    setup_ccp1(CCP_OFF);  
46:    setup_comparator(NC_NC_NC_NC);  
47:    setup_vref(FALSE);  
48:    enable_interrupts(INT_EXT);  
49:    ext_int_edge(l_to_h);// interrupcion externa por flanco de subida  
50:    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);//timer con desbordamiento maximo de t=1/(2*60Hz)=8.33ms  
51:    enable_interrupts(GLOBAL);  
52:    disable_interrupts(Int_Timer0);//deshabilitamos interrupcion de timer 0  
53:    set_tris_b(1);  
54:    set_tris_a(0);  
56:  }  
57:  void main (void)  
58:  {  
59:   config();  
61:   while(true)  
62:   {  
63:    //  
64:   }  
65:  }  



Vídeo de demostración



Este ensayo puede servir como base para implementar un controlador de temperatura o de cualquier variable, directamente en AC.
Los PCB que se muestran el vídeo contienen los circuitos expuestos, me despido hasta una próxima entrada.

29 comentarios:

  1. Muy buen trabajo, pensaba implementar algo similar, pero colo con CD, con un SCR, el transformador para la detección de cruce por cero es de 120 Vca- 5 Vca??

    ResponderEliminar
  2. Hola Charlie, el transformador debe ser tal que su tensión pico sea mayor a 6V, de mi parte aproveche el transformador que use para la fuente del circuito.

    ResponderEliminar
  3. Muy buen post! Mi pregunta es, que funcion cumplen Rs y Cs..? De que valores deben ser..??

    Saludos!

    ResponderEliminar
    Respuestas
    1. Hola nacho, Rs y Cs forman un circuito Snubber sirve para amortiguar el sobrepico producido al conmutar cargas inductivas, es posible probar con valores tal como 100 ohm y 100n (funciona o no dependiendo de los valores de impedancia de carga), sin embargo si deseas algo mas riguroso puedes revisar el ste documento: http://educypedia.karadimov.info/library/6785.pdf.
      Saludos.

      Eliminar
  4. Hola muchas gracias por tu aporte me va a ser de gran utilidad para un proyecto que tengo pensado. Solo una duda: en la etapa de detección del cruce por cero se obtiene en la salida (conexión a RB0) un valor algo mayor a 5V ya que hay que sumar la tensión que cae en el diodo a los 5V de la alimentación. Ya que la alimentación del PIC está conectada a estos 5V ¿Existe algún problema o riesgo de dañar el PIC si el voltaje que llega a la patilla de interrupción es mayor al voltaje de la alimentación del PIC? Gracias y Saludos.

    ResponderEliminar
    Respuestas
    1. Para cada uC debes consultar el Datasheet y verificar que el voltaje maximo que se puede generar en el circuito esta dentro de los limites seguros para la entrada del uC, saludos.

      Eliminar
  5. Hola Manuel, la corriente de entrada al pic esta limitada por la resistencia de 10 kohm los diodos ayudan a que no se supere el voltaje maximo de entrada al uc, sin embargo para asegurarte puedes colocar una resistencia entre el punto Vc y GND de tal manera que la tensión nunca supere los 5v aun sin la presencia del PIC, saludos.

    ResponderEliminar
  6. Saludos compañero, muy buen post. Excelente, y hasta lo que he buscado no existen muchos post tan explicitos sobre el tema. Mi aplicación es controlar la corriente alterna de una resistencia de freído de una máquina para freír. Tengo varias preguntas, con todo respeto:

    1. ¿En qué lenguaje está escrito el programa?

    2. ¿Puedo dejar al PIC generando un ángulo alfa de disparo al TRIAC y realizar otras diversas acciones luego?

    3. ¿Solo puedo utilizar el pin de interrupciones?

    Muchas gracias de antemano.

    ResponderEliminar
    Respuestas
    1. Hola amigo, estoy trabajando en un proyecto parecido del control de una resistencia de inmersión pero tengo problemas con la etapa de potencia, no se si me podrias apoyar con respecto al tema. Saludos

      Eliminar
    2. Hola Ernesto.
      1. Esta escrito en lenguaje C para compilador PIC CCS.
      2. Claro porque el angulo alfa se genera por interrupción de timer.
      3. No, puede haber otros planteamientos, como el utilizar cualquier pin y con un timer verificar el estado de este pin.

      Eliminar
  7. otra duda buen hombre, me imagino que el transformador que se utiliza transforma a 5V AC, para que sea un nivel optimo para el micro. Yo tengo uno de 6V AC, que a pesar de eso entrega 7V AC. ¿Qué podría hacer? Gracias.

    ResponderEliminar
    Respuestas
    1. Lo importante es mantener la tension a la entrada del uC en límites seguro. Podrías añadir un divisor resistivo para bajar la tensión.

      Eliminar
  8. Saludos amigo, en que compilador esta desarrollado, yo uso MikroC

    ResponderEliminar
    Respuestas
    1. Esta en PIC CCS.
      Pero en base a la explicación puedes adaptarlo al lenguaje de tu preferencia.

      Eliminar
  9. El programa está en PICC de CCS, pero en base al funcionamiento descrito puedes adaptarlo a código de MikroC

    ResponderEliminar
  10. Gracias por su circuito estimado!

    Consulta: Sabes de donde puedo aprender PIC? de tu circuito, solo entiendo como el 50%. Lo que es temporización, nada.

    Saludos.

    ResponderEliminar
  11. Muy buen video tengo una pregunta profe uno de cuanto es el transformador y su relación. Y la otra observe tu programación y me doy cuenta que su merced en el timer0 declara que cada 10 us se haga un destello de luz cuando se active el timer con k--, yo puedo quitar esa instrucción y por medio de un potenciometro variar la señal?

    ResponderEliminar
    Respuestas
    1. Claro, puedes hacer eso y mas, incluso un PID digital o cuaquier algoritmo de control.

      Eliminar
  12. no entiendo esaprogramacion podria subirla en el compilador mikroc

    ResponderEliminar
    Respuestas
    1. Te sugeriría que busques entender el funcionamiento del circuito y del algoritmo planteado, en base a ello realices la programación de tu uC en mikrobasic o cualquier lenguaje o dispositivo.

      Eliminar
  13. Hola:

    ¿Es necesario tantos diodos para detectar los pulsos?

    Saludos.

    ResponderEliminar
  14. No es necesario, puede realizarse incluso con un diodo y cambiar el planteamiento del sistema para que funcioné de esta manera, saludos.

    ResponderEliminar
  15. Buenas:

    En las lavadoras, su tacómetro, si te fijas bien en la placa, como dices, no es necesarios.

    ¿Por qué todo este planteamiento de tantos diodos?

    Dependiendo del tacómetro de entrada que genera un motor de lavadora, puedes controlar dicha velociad.

    ¿Puedes hacer ese experimento?

    Aquí dejo un simulador de lavadora y su motor como debería funcionar.
    http://www.cambatronics.com/web/media/kunena/attachments/500/Simulador_motor.zip

    Saludos.
    Saludos.

    ResponderEliminar
    Respuestas
    1. Hola Meta, ya no dispongo de tiempo para dedicarle a la programación y los microcontroladores, mil disculpas.

      Eliminar
    2. Buenas:

      Cuando tengas tiempo en el futuro, ánimos y adelante.

      Saludos.

      Eliminar
  16. Hola, yo estoy realizando un circuito similar, y recien comienzo. Pero no uso el H11AA1, decidí hacer el circuito del diagrama de arriba. Incluso decidi medir su frecuencia con un programa de frecuenciometro en arduino. Mi pregunta es; El detector de cruce por cero debe marcar 60 o 120 Hz en el frecuenciometro? Qué valor es el correcto? Porque me marca 120Hz a mi. De antemano muchas gracias!

    ResponderEliminar
  17. Hola Amigo,

    Para una señal sinusoidal de 60Hz como entrada el puente de diodos generará una señal rectificada de 120Hz

    ResponderEliminar
  18. Buenas noches amigo yo tengo un proyecto similar pero es controlar la velocidad de un motor que se alimenta con 120 vac, quisiera de su apoyo para desarrollar este proyecto, yo le podria pagar por su asesoria

    ResponderEliminar
  19. Hola escribeme a jcoterobaca@gmail.com para ver en que puedo ayudarte.

    ResponderEliminar