Paso 3: El software, un poco de teoría
La manera de utilizar a un dimmer/atenuador de AC es bastante sencilla una vez que entienda los conceptos básicos:
En corriente alterna la energía alimenta a la lámpara está directamente relacionada con la superficie total de la sinuswave, la lámpara puede regularse al permitir sólo una parte previsible de sinuswave a fluir a través de la lámpara.
Como tal necesita un punto de referencia en ese seno de donde calculamos Cuándo la lámpara tiene que estar encendido.
El más fácil punto de referencia a utilizar es el llamado 'cero': el momento en que la luz pasa por cero.
Después de cada paso por cero hay un medio completo de la sinuswave disponible para enviar a través de la lámpara.
Así que lo que el software tiene que hacer es detectar la zerocrossing y luego esperar una cantidad de tiempo en sinuswave para activar el TRIAC.
Hay 2 principales frecuencias de red en el mundo: 100 Hz en Europa y de Asia y África y 120 Hz en la mayoría de los Estados Unidos (y partes del Caribe). Hay 2 tensiones principales en el mundo: 110-120 v y 220-240 v pero no son importantes para las matemáticas aquí.
Para facilidad de uso se llevará a la frecuencia de 50Hz como ejemplo:
50Hz es 50 ondas por segundo.
Cada sinuswave tiene así 1000ms/50 = 20 ms (milisegundos)
Como hay 2 sinuspeaks en una ola que significa que después de cada detección del cero hay un período de 10ms que podemos regular.
Debemos encender la lámpara directamente al principio de ese período, la lámpara recibe plenos poderes, debemos hacerlo al final de ese período de 10ms, que la lámpara no va a recibir ower y deberíamos nosotros hacerlo a mitad de camino, la lámpara recibirá la mitad de potencia.
Como estamos usando TRIACs, lo que el software tiene que hacer es esperar a que el punto cero en la sinuscurve, tome nota de y entonces esperar una determinada cantidad de tiempo dentro de ese período de 10 ms para enviar un pulso a lo TRIAC.
Si envía ese pulso a 5ms, la lámpara se quema sólo en la mitad de potencia.
En el circuito, la cero detección se realiza por el optoacoplador bifásico y está disponible como la señal de X en el tablero.
Básicamente hay 2 formas para que un microcontrolador detectar esa señal:
1-un continuo 'interrogación' del perno cruce cero
2-usando una interrupción para decirle al programa que había un cero
La principal diferencia entre ambos es que en 'interrogación' cada vez que la computadora va a través de su bucle principal necesita para verificar el pin. Si su programa está ocupada haciendo muchas otras cosas, podría ser demasiado tarde para verificar el cero pin de cruce, mientras que al utilizar una interrupción, no importa lo que el programa está ocupado con. La interrupción es 'golpeando en el hombro' diciendo "Hey mira, algo ocurrió que tiene que atender ahora".
Después de detecta el paso por cero el programa debe esperar un período de tiempo determinado y luego en el TRIAC.
También aquí, espera se puede hacer de dos formas diferentes
1 - mediante un comando de 'esperar'
2-por utilizar una interrupción de temporizador
Una vez más, ambos estos métodos tienen sus ventajas y de desventajas El comando 'esperar' ('retardo' en lenguaje de Arduino) literalmente vamos al ordenador espere el tiempo necesario y no puede hacer otra cosa en el tiempo. Si la lámpara se quema a baja potencia dejando la computadora esperar decir 9ms, esto significa que cada 10ms el ordenador dice que esperar 9ms: ergo será inactivo 90% del tiempo. Eso está bien si el controlador sólo se utiliza para controlar la lámpara, pero si tiene que hacer otras cosas poco tiempo se deja.
Usando una interrupción de temporizador soluciona eso. Básicamente lo que hace es que el programa dice el contador de tiempo: ¨Hey, acabo de oir tenemos un cero, tengo que hacer algo más, pero tú espérate 4.5ms y luego encienda el Triac "por lo que el programa va en es feliz camino y 4.5ms (como ejemplo) después de que fue dado aviso allí fue una travesía de 0, el temporizador de encendido del TRIAC.
Votación: (Nota Este es un ejemplo áspero para la ilustración de la interrogación, obviamente necesita alguna mejora)
Interrumpe por:
Para utilizar una interrupción, primero tenemos configurar. En el Arduino es como sigue:
Lo que esto dice es que la interrupción se une para interrumpir el 0, va a una función llamada "zero_crosss_int" y reacciona a un flanco ascendente en el pin.
En la función Zero_cross_int que salta el programa para después de la interrupción determinamos el tiempo que tenemos que esperar antes de disparar el TRIAC. También agregamos un poco de funcionalidad. No queremos un sistema de nivel que la lámpara se quema en, vamos a añadir algunas funciones para regular el nivel de luz en pasos.
Por eso he elegido la cantidad totalmente arbitraria de 128 pasos. Esto significa que cada paso es 10ms/128 = 10000us/128 = 75us (de hecho es 78, pero llegar a eso más adelante). Entonces el dimtime total se calcula a partir 75 x (1 a 128). El número entre 1-128, que determina nuestro nivel de atenuación, asignamos a la variable entero 'atenuación'
Lo que pasa aquí es que el programa calcula primero lo dimtime (= tiempo de espera antes de que el triac se dispara)
Se espera que la cantidad de tiempo, posteriormente espera que la cantidad de tiempo y dispara el Triac. El Triac se apaga otra vez en el siguiente paso por cero, pero nosotros vamos a escribir ya bajo en el pin TRIAC para evitar la ignición accidental en el ciclo siguiente. Tenemos que esperar un poco sin embargo conocer el TRIAC es encendido, así que esperamos 10us. Ahora (10000-10) / 128 es todavía 78 pero he encontrado 75 para funcionar bien. No dude en utilizar 78 aunque.
Lo único que queda entonces en el programa principal es establecer el nivel en el que queremos que la lámpara se quema:
Lo que pasa aquí es un simple bucle que regula la lámpara hasta en un 128 pasos. He decidido no empezar 1 sino 5 porque a ese nivel podría haber algunos problemas de sincronización que podrían provocar que la lámpara de parpadeo.
El programa anterior es sólo un ejemplo de cómo controlar la luz, obviamente quieres añadir algunas otras funciones en lugar de sólo hay una lámpara de ir arriba y abajo en brillo.
Utilizando un temporizador:
Si desea que su programa para ser eficaz necesita utilizar una interrupción para la detección de cruce por cero y un temporizador para determinar la cantidad de tiempo de espera.
Aproximadamente un programa sería como sigue:
Inicializar
Configurar los diferentes constantes y variables que necesites e incluye las bibliotecas (como la biblioteca de TimerOne)
Programa de instalación
SETP las clavijas y las 2 interrupciones
Los puntos de interrupción cero cruzar a una función y así hace la interrupción del temporizador
Cero-Cruz functie
Establece un valor booleano que indica si se ha producido una cero cruz
Función de temporizador
Si regulamos el brillo otra vez en 128 pasos, entonces la función de temporizador está configurados para ser llamado cuando el tiempo de un paso ha pasado (p. ej. 75us) y a continuación, comprueba si el número de pasos pasado es igual al número de pasos. Si es el caso, el Triac es encendido