5 votos

Arduino 230v Regulación de bombillas

Hola chicos he hecho un montón de investigación y pruebas en diferentes circuitos para 230v (50hz) o 220v atenuación de la luz, pero no puedo conseguir mi arduino para atenuar mi luz. Esto es lo último que he probado.

hizo este circuito : Enlace de circuito y código

Código que he probado:

int AC_LOAD = 3;    // Output to Opto Triac pin
int dimming = 128;  // Dimming level (0-128)  0 = ON, 128 = OFF

void setup()
{
  pinMode(AC_LOAD, OUTPUT);       // Set the AC Load as output
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  // Firing angle calculation :: 50Hz-> 10ms (1/2 Cycle)
  // (10000us - 10us) / 128 = 75 (Approx)
  int dimtime = (75*dimming);      
  delayMicroseconds(dimtime);    // Off cycle
  digitalWrite(AC_LOAD, HIGH);   // triac firing
  delayMicroseconds(10);         // triac On propogation delay
  digitalWrite(AC_LOAD, LOW);    // triac Off
}

void loop()
{
  dimming = 128; 
  delay(100);
  dimming = 75;  
  delay(100);
  dimming = 25;  
  delay(100);

}

0 votos

Olvídate de la rutina de interrupción por unos momentos. ¿Has comprobado si realmente ves los cruces por cero en tu pin de entrada? Tal vez quieras escribir un sketch que conmute el LED del pin13 cada 50 o 60 o cruces por cero. Deberías ver un parpadeo visible de 1Hz.

0 votos

¿Qué pin de entrada has utilizado para conectar el detector de paso por cero? Ten en cuenta que el número de interrupción puede no ser el mismo que el número de pin de entrada y que los números de pin de interrupción pueden variar según el tipo de placa Arduino. ¿Qué Arduino estás utilizando?

0 votos

@jippie Estoy usando Arduino uno y mi pin de interrupción es el 2

5voto

xilun Puntos 261

Yo empezaría a depurar intentando encender y apagar la carga unas cuantas veces en la configuración para asegurarme de que el TRIAC está disparando, por ejemplo:

void setup()
{
  pinMode(AC_LOAD, OUTPUT);       // Set the AC Load as output
  for (int i=0; i < 10; i++)
  {
      digitalWrite(AC_LOAD, HIGH);   // triac firing
      delay(1000);
      digitalWrite(AC_LOAD, LOW);    // triac Off
      delay(1000);
  }
}

El Ficha técnica del MOC3021SM muestra que pueden ser necesarios 15mA para accionar el LED. A 3,3V como se muestra en el esquema R5 la resistencia 470R limitaría la corriente a 7mA y a 5V seguiría siendo sólo 10mA y eso ignorando la caída de tensión hacia adelante.

Puedes usar un cálculo normal de resistencias de LED para determinar la resistencia, parece que hay una caída de tensión hacia delante de 1,15V para esa parte a temperatura ambiente, así que 120 ohmios a 3,3V sería más apropiado para dar un poco más de 15mA. Las siguientes son las recomendaciones relativas a la corriente del LED de la hoja de datos:

Se garantiza que todos los dispositivos se disparan con un valor de IF menor o igual a la IFT máxima. Por lo tanto, la FI recomendada se encuentra entre el IFT máximo (30mA para MOC3020M, 15mA para MOC3010M y MOC3021M, 10mA para MOC3011M yMOC3022M, 5mA para MOC3012M y MOC3023M) y la IF máxima absoluta (60mA)

Si eso funciona bien el siguiente paso puede ser probar que la detección del paso por cero funciona al menos una vez, quizás usando lo siguiente y viendo si se enciende después de 10 segundos:

void setup()
{
  pinMode(AC_LOAD, OUTPUT);       // Set the AC Load as output
  digitalWrite(AC_LOAD, LOW);     // triac Off
  delay(10000);
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
    digitalWrite(AC_LOAD, HIGH);   // triac firing
}

Si eso no funciona, tal vez puedas quitarle a U1 el optoacoplador (si está en un zócalo) y ver si lo anterior funciona si cortocircuitas la salida entre el emisor y el colector (¡con cuidado!) de U1 para llevar la entrada a tierra. Puede ser que tengas un problema general de configuración de la interrupción dependiendo del pin al que esté conectado, lo cual deberías añadir a la pregunta, pero eso ayudará a aislar un problema de software frente a uno de hardware.

0 votos

Gracias por la respuesta. El MOC3021SM está funcionando perfectamente i cansado el código que dio y su conmutación perfecta.

0 votos

Creo que me estoy equivocando con la detección del paso por cero, ¿puede guiarme más?

0 votos

ahora no brilla voy a cambiar mis componentes y luego te digo los resultados.

3voto

aryeh Puntos 1594

Si no MOSTRAN el circuito exacto y las conexiones que USTEDES están usando entonces TODAS las preguntas de este tipo no tienen sentido.

Este es el diagrama del circuito al que se accede a través de la página a la que has hecho referencia. Por favor, añada SUS conexiones a él y publique como parte de su pregunta.

enter image description here


La tierra del Arduino DEBE estar conectada a la tierra del MOC3021.


¡¡¡NB!!! - Lo siguiente pone de manifiesto un defecto en el diseño del circuito. Esto puede o no puede ser lo que está mal con su circuito. Por ejemplo, pueden haber encontrado que el MOC3021SM no funcionó de manera fiable y sustituido un MOC3023 o MOC 022. Su problema puede no estar relacionado.

  1. Usando un cable conecte 3.3V+ al pin de entrada del Dimmer.
    El triac debe funcionar e impulsar la carga.

  2. Si 1. funciona, conecta 3,3V+ en la conexión del pin de salida del Arduino. Lo ideal es quitar la conexión del pin del Arduino ya que esto PUEDE dañar el Arduino. En casi todos los casos debería estar bien, pero la retroalimentación de 3,3V en un bajo conducido en es "travieso" en el mejor. El TRIAC debería funcionar.

Si 1. y 2. no funcionan, el problema puede ser un circuito como el que se indica a continuación o todavía es culpa suya. Cambie R5 como se indica a continuación y vuelva a intentar 1 y 2.

Cuando Arduino alta O +3,3V está conectado a Dimmer en debe haber una caída de tensión a través de R5 (muy aproximadamente 1,5V + ) y U @ pin de entrada debe estar en 1,2 - 1,5V por encima de grpund.

El circuito ha sido mal "diseñado" y con un accionamiento de 3,3V no funcionará con optoacopladores que cumplan las especificaciones típicas de la hoja de datos y es (por supuesto) aún peor con las especificaciones de la hoja de datos del peor caso. Incluso con el accionamiento de 5V no cumplirá con las especificaciones típicas.
El diseñador, si es que hubo uno, tuvo un severo desvanecimiento cerebral el día que esto fue diseñado.

Ficha técnica del MOC3021 - marca PUEDE importar, por desgracia.

Tensión de entrada óptica a 20 mA = 1/15V / 1,5V típico / máximo .
Corriente para enclavar el TRIAC = 8 / 15 mA típicos/ máximos.

Trabajando con un opto vin típico y una corriente de accionamiento típica (es decir, el caso más optimista).
Iopto = (Vin - Vopto)/R5 = (3,3-1,15)/470 = 4,6 mA.
Corriente típica de optto = 8 mA.
Corriente de optotipo en el peor de los casos = ¡¡¡15 mA!!!

Corriente de accionamiento de Arduino mínima = ??? mA.

En el peor de los casos R5 = (Vin-Vopto_max)/Imax = (3,3-1,5)/15 mA = 120 Ohm.

Vopto_max está a 20 mA pero es posible que necesites la mayor parte de 20 mA en el peor de los casos.
Cuál es la capacidad máxima de corriente del Arduino y a qué nivel cae Vhi con esta corriente.

Cambie R5 a 100 ohmios. O coloque 120 Ohms o 150 Ohms en paralelo con R5.

8-15 mA 1.15-1.5V (3.3-1.5)/470 =


AÑADIDO

Se formuló una pregunta sobre los dispositivos de muy baja corriente de disparo.

Utilice esta búsqueda para ver todos los optoacopladores de cruce por cero de Digikey, ordenados por corriente de trogger ascendente. Ignorando aquellos para los que no se muestra la Ift, el (Vishay IL411x La familia tiene el Ift más bajo con 1,3 mA en el peor de los casos. Dicen que la corriente real utilizada debe ser varias veces eso, y muestran que la corriente de disparo varía con el voltaje de carga y la temperatura y más., Lea la hoja de datos para obtener más información.

El Fairchild **FOD4xx y xxx familia son similares.

El MOC3063 de Liteon y otros tiene Ift = 5 mA. Consulte la hoja de datos para más detalles.

2 votos

El Arduino basado en el AVR puede generar/enviar 40mA por pin con un máximo de 200mA por paquete. El Arduino basado en AVR suele funcionar a 5VDC. Arduino Due (no Duemilanove) es un controlador basado en ARM, que tiene un chip de 3V3, no está seguro acerca de la corriente máxima de salida sink/source.

0 votos

He probado el código dado por @PerterJ y el triac parece funcionar bien puede usted guiarme. como soy un bastante perdido

0 votos

@DanielEuchar - PeterJ parece estar en el camino correcto re código. No te limites a hacer lo que él dice PERO TAMBIÉN entiende por qué los tangos funcionan o no cuando cambias las cosas. ¿Funciona el código original de la página web donde compraste la placa? ¿Qué dice? SI el accionamiento del TRIAC está bien Y el paso por cero está bien (lo que debes demostrar con los ejemplos que te dan) entonces el código que estás ejecutando difiere en lo que hace de lo que hacen los ejemplos. ¿Cómo? ¿Por qué?

3voto

jason Puntos 147

Olvídate de la rutina de interrupción por unos momentos. ¿Has comprobado si realmente ves los cruces por cero en tu pin de entrada? Tal vez quieras escribir un sketch que conmute el LED del pin13 cada 50 o 60 o cruces por cero. Deberías ver un parpadeo visible de 1Hz.

No puedo probar el sketch (pero compila sin errores), pero creo que debe quedar un poco así:

const uint8_t ledPin = 13;                          // Digital output pin that has the on board LED
const uint8_t zeroPin = 2;                          // Digital input pin to which the zero crossing detector is connected

uint8_t zeroCounter = 0;
bool zeroState = 0;
bool ledState = 0;

void setup() {
  pinMode( ledPin , OUTPUT );                       // Enable output driver for LED pin
}

void loop() {
  while ( digitalRead( zeroPin ) == zeroState ) {}; // Wait for the state of the zero crossing detector to change
  zeroState != zeroState;
  zeroCounter++;
  if ( zeroCounter == 50 ) {                        // Every 50 zero crossings change the LED state
    ledState != ledState;
    digitalWrite( ledPin , ledState );
    zeroCounter = 0;
  }
}

0 votos

he probado el código anterior y nop el led no parpadea en absoluto :( incluso trató de la impresión en serie para comprobar el valor que estaba todo lleno de '1'

0 votos

Empieza por conectar R1 (10k) a +5VDC en lugar de +3V3, eso no puede hacer daño.

0 votos

No hubo suerte :( supongo que tengo que reemplazar los componentes. lo intentaré

1voto

Dan Bemowski Puntos 111

El código anterior de jippie no me funcionó, pero esto, que está basado en este código sí. También prueba el ISR.

const uint8_t ledPin = 13;                          // Digital output pin that has the on board LED
const uint8_t zeroPin = 2;                          // Digital input pin to which the zero crossing detector is connected

uint8_t zeroCounter = 0;
bool zeroState = 0;
bool ledState = LOW;

void setup() {
  Serial.begin(9600);
  pinMode( ledPin , OUTPUT );                       // Enable output driver for LED pin
  attachInterrupt(0, zero_crosss_int, RISING);  // Choose the zero cross interrupt # from the table above
}

void loop() {

}

void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  zeroState != zeroState; 
  zeroCounter++;

  if ( zeroCounter == 60 ) {                        // Every 50 zero crossings change the LED state
    ledState = (ledState == LOW) ? HIGH : LOW;
    digitalWrite( ledPin , ledState );
    zeroCounter = 0;
  }
}

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