Atenuador de CA independiente de múltiples canales con Arduino

Quiero construir un atenuador de CA controlado de forma independiente de 8 canales usando Arduino. He probado con éxito un atenuador de un solo canal, pero estoy atascado en expandirlo a 8 canales. El circuito al que me refiero es el siguiente.circuito atenuador de un solo canal

El código de arduino que estoy usando es el siguiente

/*
AC Voltage dimmer with Zero cross detection
Author: Charith Fernanado http://www.inmojo.com
License: Creative Commons Attribution Share-Alike 3.0 License. 

Attach the Zero cross pin of the module to Arduino External Interrupt pin
Select the correct Interrupt # from the below table:
(the Pin numbers are digital pins, NOT physical pins:
digital pin 2 [INT0]=physical pin 4 
and digital pin 3 [INT1]= physical pin 5)

 Pin    |  Interrrupt # | Arduino Platform
 ---------------------------------------
 2      |  0            |  All
 3      |  1            |  All
 18     |  5            |  Arduino Mega Only
 19     |  4            |  Arduino Mega Only
 20     |  3            |  Arduino Mega Only
 21     |  2            |  Arduino Mega Only

In the program pin 2 is chosen
 */

int AC_LOAD = 3;    // Output to Opto Triac pin
int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF
/* Due to timing problems, the use of ‘0’ can sometimes make the circuit 
flicker. It is safer to use a value slightly higher than ‘0’
*/
void setup()
{
  pinMode(AC_LOAD, OUTPUT);// Set AC Load pin as output
  attachInterrupt(0, zero_crosss_int, RISING);  
// Chooses '0' as interrupt for the zero-crossing
}
// the interrupt function must take no parameters and return nothing
void zero_crosss_int()  
// function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation : 1 full 50Hz wave =1/50=20ms  
  // Every zerocrossing thus: (50Hz)-> 10ms (1/2 Cycle) For 60Hz => 8.33ms

  // 10ms=10000us
  // (10000us - 10us) / 128 = 75 (Approx) For 60Hz =>65
  int dimtime = (75*dimming);    // For 60Hz =>65     
  delayMicroseconds(dimtime);    // Off cycle
  digitalWrite(AC_LOAD, HIGH);   // triac firing
  delayMicroseconds(10);         // triac On propogation delay
                                 //(for 60Hz use 8.33)
  digitalWrite(AC_LOAD, LOW);    // triac Off
}
void loop()  {
 for (int i=5; i <= 128; i++)
{
 dimming=i;
 delay(10);
 }
 }

¿Alguna idea sobre cómo puedo expandir el código y el circuito para que funcione con 8 canales que se pueden controlar de forma INDEPENDIENTE?

Su diagrama y fragmento de código para un solo canal, si pregunta su problema exactamente, ¡la respuesta será un cierre más para la solución!

Respuestas (2)

Sin hacer una revisión profunda del código, es probable que el problema esté aquí:

delayMicroseconds(dimtime);    // Off cycle
digitalWrite(AC_LOAD, HIGH);   // triac firing
delayMicroseconds(10);         // triac On propogation delay

Las funciones de retardo hacen que la CPU entre en bucle y no se puede realizar ningún otro procesamiento.

Una mejor manera sería crear una rutina de temporizador y llamarla para cada canal. Esto necesitaría una variable asignada para

  • el valor preestablecido (el valor en el que se activa la salida del temporizador),
  • el valor real (el valor de tiempo actual) y
  • el estado de salida (temporizador hecho o no).

Un método más fácil podría ser:

  • Divide tu medio ciclo en un número discreto de pasos de, digamos, 50 μs.
  • En su bucle principal, agregue un contador que se restablece en el cruce por cero y se incrementa cada 50 μs.
  • En el ciclo, compare el nivel de dimmer para cada canal con el temporizador y encienda ese canal si se excede el nivel de dimmer.

ingrese la descripción de la imagen aquí

Figura 1. Relación entre corriente y ángulo de disparo.

Tenga en cuenta que la corriente producida no varía linealmente con el ángulo de disparo debido a la forma de onda sinusoidal de la tensión de red. Pequeños cambios alrededor del voltaje máximo tendrán un efecto más significativo que cerca del cruce por cero. Es posible que desee abordar esto en su código si el efecto visual no coincide con la configuración de su atenuador.

Gracias por su respuesta. Consideraré sus sugerencias e intentaré trabajar más en mi código para múltiples canales.
De nada. Trate de evitar el uso de retrasos en su código. Utilice temporizadores en su lugar. De esa manera, su micro puede hacer otras cosas mientras tanto. Los retrasos son muy tentadores, pero son una mala práctica y creo que todos los tutoriales que los usan hacen que los usuarios tengan un mal comienzo.

Si desea usar una placa ya probada y lista, use esto. Cada canal se controla de forma independiente. Atenuador de CA Arduino de 8 canales

Esa placa es un módulo de hardware. Todavía queda la pregunta original de cómo programar para ocho canales. Si revisa los ejemplos de código que le brindan, es posible que encuentre una solución que evite la instrucción de pausa , que es la causa del problema original. Pon eso en tu publicación con alguna explicación y es posible que tengas una buena respuesta.