Arduino 230v Regulación de la bombilla

5

Hola chicos, he investigado y probado mucho en diferentes circuitos para 230v (50Hz) o 220v de atenuación de luz, pero no puedo hacer que mi arduino atenúe mi luz. Esto es lo último que intenté.

hizo este circuito: Enlace de circuito y código

Código que probé:

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);

}
    
pregunta Daniel Euchar

4 respuestas

5

Comenzaría a depurar intentando encender y apagar la carga varias veces en la configuración para asegurar 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);
  }
}

La Hoja de datos de MOC3021SM muestra que es posible que se requieran 15 mA para controlar el LED. A 3.3 V, como se muestra en el esquema R5, la resistencia 470R limitaría la corriente a 7 mA y a 5 V aún sería solo 10 mA y eso es ignorar la caída de tensión directa.

Puede usar un cálculo de resistencia LED normal para determinar la resistencia, se ve como una caída de voltaje directa de aproximadamente 1.15 V para esa parte a temperatura ambiente, por lo que 120 ohmios a 3.3 V serían más apropiados para proporcionar un poco más de 15 mA. Las siguientes son recomendaciones sobre la corriente de LED de la hoja de datos:

  

Se garantiza que todos los dispositivos se activarán a un valor de IF menor o igual que   hasta el máximo IFT. Por lo tanto, el IF de operación recomendado se encuentra entre el máximo IFT   (30mA para MOC3020M, 15mA para MOC3010M y MOC3021M, 10mA para MOC3011M   y MOC3022M, 5 mA para MOC3012M y MOC3023M) y IF máx absoluto (60 mA)

Si funciona bien, el siguiente paso puede ser probar que la detección de cruce por cero funciona al menos una vez, tal vez utilizando lo siguiente y ver 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 retire U1 el optoacoplador (¿está en un zócalo?) y vea si funciona lo anterior si corta la salida entre el emisor y el colector (¡con cuidado!) en U1 para juntar la entrada hasta suelo. Es posible que tenga un problema general de configuración de interrupción, dependiendo de a qué pin está conectado, lo que debería agregar a la pregunta, pero eso ayudará a aislar un problema de software frente a un problema de hardware.

    
respondido por el PeterJ
3

Olvídate de la rutina de interrupción por unos momentos. ¿Comprobó si realmente ve los cruces por cero en su pin de entrada? Es posible que desee escribir un boceto que alterne el pin13 LED cada 50 o 60 o zerocross. Debería ver un parpadeo de 1Hz visible.

No puedo probar el boceto (pero se compila sin errores), pero creo que debería verse un poco como este:

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;
  }
}
    
respondido por el jippie
3

Si no MUESTRE el circuito y las conexiones exactas que USTED está utilizando, 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 hace referencia. Agregue SUS conexiones y publique como parte de su pregunta.

LatierradeArduinoDEBEestarconectadaalatierraMOC3021.

¡¡¡NB!!!-Acontinuaciónsedestacaundefectoeneldiseñodelcircuito.Estopuedeonoserloqueestámalensucircuito.porejemplo,puedenhaberencontradoqueelMOC3021SMnofuncionódemaneraconfiableysustituyóaunMOC3023oMOC022.SuproblemaPUEDEnoestarrelacionado.

  1. Usandouncable,conecte3.3V+alpindeentradadelAtenuador.
    Triacdeberíaoperaryconducirlacarga.

  2. Si1.funciona,conecte3.3V+alaconexióndelpindesalidadelaunidadArduino.LoidealeseliminarlaconexióndelpinArduino,yaqueestoPUEDEdañarelArduino.Encasitodosloscasos,deberíaestarbien,peroenelmejordeloscasos,laalimentaciónretroactivade3.3Vaunabajaimpulsiónes"mala". TRIAC debería funcionar.

Si 1. & 2. No trabaje, el problema podría ser un circuito como el que se muestra a continuación o aún su culpa. Cambie R5 como se muestra a continuación y vuelva a intentar 1 & 2.

Cuando Arduino high OR + 3.3V está conectado a un atenuador, debe haber una caída de voltaje en R5 (muy aproximadamente 1.5V +) y el pin de entrada U @ debe estar a 1.2 - 1.5V por encima de grpund.

El circuito ha sido mal "diseñado" y con la unidad de 3.3 V no funcionará con los optoacopladores que cumplan con las especificaciones típicas de la hoja de datos y (por supuesto) es aún peor con las especificaciones de la hoja de datos del caso más desfavorable. Incluso con una unidad de 5 V no cumplirá con las especificaciones típicas.
 El diseñador, si hubiera uno, sufrió una pérdida grave del cerebro el día en que se diseñó.

hoja de datos MOC3021 : la marca PUEDE importarle, por desgracia.

Voltaje de entrada opto a 20 mA = 1 / 15V / 1.5V típico / máx.  Corriente al seguro TRIAC = 8/15 mA típico / máx.

Trabajar con opto vin TÍPICO y corriente de excitación típica (es decir, el caso más optimista).
 Iopto = (Vin - Vopto) / R5 = (3.3-1.15) / 470 = 4.6 mA.
 Corriente típica del optto = 8 mA.
 Peor caso opto actual = 15 mA !!!

Arduino drive current min = ??? 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 puede que necesite la mayoría de los 20 mA en el peor de los casos.
 ¿Cuál es la capacidad máxima de la corriente de Arduino y a qué se reduce Vhi en esta corriente?

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

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

AÑADIDO

Se hizo una pregunta sobre los dispositivos actuales de activación muy baja.

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

La familia Fairchild ** FOD4xx y xxx son similares.

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

    
respondido por el Russell McMahon
1

El código anterior froim jippie no funcionó para mí, pero esto, que se basa 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;
  }
}
    
respondido por el Dan Bemowski

Lea otras preguntas en las etiquetas