2 votos

Atenuador de CA independiente de varios canales utilizando Arduino

Quiero construir un atenuador de CA de 8 canales, controlado independientemente, usando Arduino. He probado con éxito un dimmer de un solo canal, pero estoy atascado en la ampliación a 8 canales. El circuito al que me refiero es el siguiente single channel dimmer circuit

El código del 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 ampliar el código y el circuito para que funcione con 8 canales que puedan ser controlados INDEPENDIENTEMENTE?

3voto

transistor Puntos 2074

Sin hacer una revisión en profundidad 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 pueda realizar ningún otro procesamiento.

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

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

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

  • Divida su medio ciclo en un número discreto de pasos de, por ejemplo, 50 s.
  • En su bucle principal añada un contador que se pone a cero y se incrementa cada 50 s.
  • En el bucle se compara el nivel de atenuación de cada canal con el temporizador y se enciende ese canal si se supera el nivel de atenuación.

enter image description here

Figura 1. Relación entre la corriente y el á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 de la tensión de red sinusoidal. Pequeños cambios alrededor del pico de voltaje tendrán un efecto más significativo que más cerca del cruce de cero. Es posible que desee abordar esto en su código si el efecto visual no coincide con la configuración de su atenuador.

0voto

Billy Logan Puntos 1072

Si quieres usar una tabla ya probada y lista usa esto. Cada canal se controla de forma independiente. Atenuador de CA Arduino de 8 canales

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X