Atenuador de CA independiente de múltiples canales usando Arduino

2

Quiero construir un regulador de CA de 8 canales y controlado de forma independiente utilizando 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.

El código 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 trabajar con 8 canales que se pueden controlar INDEPENDIENTEMENTE?

    
pregunta gaurav bhand

2 respuestas

2

Sin hacer una revisión detallada 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 haga un 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 preset (el valor en el que se activa la salida del temporizador),
  • el valor actual (el valor de tiempo actual) y
  • el estado de salida (temporizador terminado o no).

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

  • Divida su semiciclo en un número discreto de pasos de, por ejemplo, 50 μs.
  • En su bucle principal, agregue un contador que se restablezca en cero y se incremente cada 50 μs.
  • En el bucle, compare el nivel de dimmer para cada canal con el temporizador y encienda ese canal si se supera el nivel de dimmer.

Figura 1. Relación entre la corriente y el ángulo de activación.

Tenga en cuenta que la corriente producida no varía linealmente con el ángulo de disparo debido a la forma de onda de la tensión de red sinusoidal. Los pequeños cambios alrededor del pico de voltaje 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 su configuración de atenuador.

    
respondido por el Transistor
0

Si desea utilizar una placa ya probada y lista, use esto. Cada canal es controlado de forma independiente. 8 ch Arduino AC dimmer

    
respondido por el Gurbetteyim NoktaCom

Lea otras preguntas en las etiquetas