# Circuito detector de cruce por cero con moc



## sobreviviente33 (May 6, 2013)

Saludos, estoy realizando un proyecto en donde se regula la cantidad de voltaje que le llega a un motor de ac para variar su velocidad, para ello se conectara a 110 v 60 Hz y el control se realizará mediante un triac disparado en un cierto ángulo,  accionado por un arduino. El caso es que no se como obtener una señal cuando haya un cruce por cero mediante un moc 4n32.


----------



## electroconico (May 6, 2013)

Un _moc _es una cosa y el _4n32_ es otra.

Imagino que quieres detectar el cruce por cero con el 4n32.

1.-Puedes usar un pequeño transformador para detecar el cruce por cero.
2.-Puedes usar el 4n32 /4n25 etc.. también.

Te adjunto un circuito con el 4n25(no darlington con el que propones) el cual utilizo para realizar el dimming de unas lamparas.

*Se ven 2 resistencias en paralelo,son de 1/2 watt cada 1 para poder disipar.Es la desventaja de ese circuito.

*El circuito no tiene red snuber porque solo uso carga resitiva,en tu caso será necesario,consta de agregar una red RC.

*No omitas el diodo D1 que protege al LED del opto.

Saludos!


----------



## sobreviviente33 (May 6, 2013)

electroconico muchas gracias por tu respuesta, lo probaré de esa manera.


----------



## Scooter (May 6, 2013)

Ese circuito da un flanco de subida en un paso por cero y uno de bajada en el siguiente.
Si quieres un pulso por paso por cero usa un puente rectificador


----------



## sobreviviente33 (May 6, 2013)

Scooter, como seria agregando un puente rectificador?


----------



## Fogonazo (May 6, 2013)

sobreviviente33 dijo:


> Scooter, como seria agregando un puente rectificador?



Ver el archivo adjunto 80824​


----------



## sobreviviente33 (May 6, 2013)

Muchas gracias por el diagrama Fogonazo


----------



## chin0o (May 8, 2013)

que tal,


Pues aprovecho que esta al día este tema, tengo que hacer un detector de cruce por cero, no me gustaría solo copiar el cto que esta aquí y entregarlo sino que me encantaría saber como funciona y sentirme parte del diseño,  ya lo simule y todo bien me sale precisamente la misma onda en la imagen que puso Fogonazo, solo que como que los cálculos no me dan....    


según lo que vi en esta pagina el calculo para saber la corriente es la sig Formula aunque la verdad no se porque lo divide entre 16   












PERO SEGUN YO SERIA ALGO ASI 

VR= VP - (VD1+VD2+VD3)

I= VR / R







si estoy mal con toda confianza corriganme, 

otra cosita.....
el transistor comenzará a  conducir cuando el nivel de Tension se acerque a cero asi que no precisamente se disparara cuando sea cero esto lo podria mejorar agregando una histeresis ???? 


De Ante mano Gracias Saludos Cordiales 


PD: SI la manera de preguntar mi duda no es la correcta les pido que me lo hagan saber  y con gusto hare lo posible por mejorar.....


----------



## digito (May 8, 2013)

Hola te dejo otro circuito che funciona:

https://www.forosdeelectronica.com/f24/zero-crossing-optoaislado-93823/

 Chau.


----------



## Scooter (May 8, 2013)

La salida del optoacoplador no será senoidal ni por asomo.
El transistor conduce siempre menos en el paso por cero, por eso la salida es siempre "0" lógico menos en el paso por cero que es "1" lógico.
La idea es que el transistor se sature siempre que V no sea 0


----------



## chin0o (May 8, 2013)

digito dijo:


> Hola te dejo otro circuito che funciona:
> 
> https://www.forosdeelectronica.com/f24/zero-crossing-optoaislado-93823/
> 
> Chau.



Gracias Digito si es casi similar solo que se agrega una resistencia me gustaría saber como se hace el analisis del cto porque simulado antes de la entrada al LED del Optoacoplador  me da como 2volts y ayer que medi ese mismo nodo con un multimetro(Tester) me daba 1.2volts  me paso un pequeño accidente con el diodo porque cheque con el osciloscopio la salida del puente rectificador y la referencia de la sonda lo puse al lado negativo del puente y PUUUUF!!! se le salio el humo al diodo, aun estoy averiguando porque jeje




> El transistor conduce siempre menos en el paso por cero, por eso la salida es siempre "0" lógico menos en el paso por cero que es "1" lógico.




Gracias Scooter por la pronta respuesta:
Ok, ahora ya lo veo el transistor mientras este saturado entregara un 0 porque se cierra el circuito y se drena la corriente obviamente limitada por la resistencia y cuando esta en corte tengo los 5volts cierto??  Muchas Gracias

Sobre el análisis alguna idea de porque me da esa tensión?
en si quiero saber porque aunque le meti los 110v de la linea no se trono el Opto...

se que despues del primer Diodo voy a tener solo medio ciclo pero aun asi es una tension muy grande, es por la resistencia ? funciona como un divisor ? cómo es que se analiza?, segun yo debo tomar el valor pico de la onda pero no se si debo tomar el valor promedio...

En verdad estoy confundido 

Gracias Saludos Cordiales!


----------



## chin0o (May 10, 2013)

jeje pues creo que si era como pensaba lo simule y lo probé y los cálculos si me dan, Gracias!

ahora lo que quiero ver es de que manera ademas de poner resistencias en paralelo puedo reducir el desperdicio de tanta potencia.
Saludos Cordiales,


----------



## Fogonazo (May 10, 2013)

chin0o dijo:


> jeje pues creo que si era como pensaba lo simule y lo probé y los cálculos si me dan, Gracias!
> 
> ahora lo que quiero ver es de que manera ademas de poner resistencias en paralelo* puedo reducir el desperdicio de tanta potencia.*
> Saludos Cordiales,



*OJO al piojo*, se pueden evitar las resistencias colocando un capacitor de unos 100/150 nF, si bien esta configuración disipa una potencia mínima *"NO"* sirve para esta función, ya que el capacitor agrega un error por desfasaje en la detección del cruce por *0*


----------



## chin0o (May 10, 2013)

si es lo que tenia pensado, de hecho estoy viendo como funciona el siguiente cto...





el primer capacitor por lo que leo seria como filtro y el segundo aún no averiguo para que es pero sigo leyendo jeje les comparto la pagina

http://www.dextrel.net/diyzerocrosser.htm

Saludos Cordiales,


----------



## toromion (May 28, 2013)

sobreviviente33 dijo:


> Saludos, estoy realizando un proyecto en donde se regula la cantidad de voltaje que le llega a un motor de ac para variar su velocidad, para ello se conectara a 110 v 60 Hz y el control se realizará mediante un triac disparado en un cierto ángulo,  accionado por un arduino. El caso es que no se como obtener una señal cuando haya un cruce por cero mediante un moc 4n32.




Saludos,

No se que necesidad de diseño tengas en integrar el optoacoplador al circuito que deseas, si estuviera en tu lugar dejaria el optoacoplador solo para la etapa de salida y no en la entrada del cruce por cero, eso lo logras con un Amp. O. como comparador, la referencia de LM339 es un comparador por naturaleza, de hecho en su datasheet proponen circuitos comparadores e incluso directamente detector de cruce por cero.

Este circuito adopta tu necesidad como lo has descrito:
http://www.onsemi.com/pub_link/Collateral/AND8011-D.PDF

Como lo puedes notar hay una referencia especial de diodo (MUR160), si no consigues comercialmente ese semiconductor puedes optar con uno de caracteristicas similares, no es critica la elección de ese diodo, pero indudablemente si es necesario que sea de "INMEDIATO TIEMPO DE RECUPERACIÓN", es decir, un tiempo de recuperación no mayor a 75 nanosegundos en sus peores condiciones. Otras referencias que podrian servir aunque con diferente encapsulado son: MUR1510, 1515, 1520, 1540, 1560, MURF1560, SUR81520, SUR81560.

Ahora bien, si piensas utilizar un dispositivo programable, como un microcontrolador, DSP, DSPic, Tarjeta de adquisición de datos, o bien una tarjeta de desarrollo, entonces si es recomendado el detector de cruce por cero aislado, el circuito propuesto por el usuario "digito" es una excelente alternativa para conseguir el objetivo, particularmente lo utilizo con frecuencia sin tener problemas, claro que yo a dicho circuito le añado en la salida un circuito integrado schmitt-trigger invertido (inversor) recomendablemente de tecnologia cmos, el IC 74HC14 cumple con esos parametros, la razón es que ademas de invertir la señal en la salida del optoacoplador (especificamente un OPTO-TRANSISTOR), tambien le dara niveles logicos validos en todo momento al dispositivo de control y como ventaga adicional tambien lo protegera.

En esta imagen observaras la señal de entrada senoidal (verde), la señal de salida del optotransistor NPN (amarillo)y la señal de salida del schmitt-trigger (azul).






Como veras, la señal de salida es opuesta y con niveles logicos apropiados para un dispositivo de programación.

Espero haberles colaborado.

Saludos.


----------



## chin0o (May 30, 2013)

Muchas Gracias





> toromion



De verdad aprecio tu respuesta tan elaborada y notablemente fundamentada.



> No se que necesidad de diseño tengas en integrar el optoacoplador al circuito que deseas


Mi necesidad es simplemente entregar un circuito que detecte el cruce por cero de la señal a donde lo conecte, en mi caso 120Vac / 60Hz  y que en la salida me entregue niveles TTL cada vez que cruce por cero, decidí tomar el estado alto por eso la resistencia Pull - up, esa es realmente mi necesidad pero me gustaria ir mas alla de lo que pide el profesor y entender y tal vez diseñar algo mejor.

El optoacoplador lo elegí simplemente por comodidad y por que a mi parecer es el circuito mas simple y entendible ya que mis conocimientos sobre Opamp´s son realmente básicos o bien, nulos  (Lo se, tengo que mejorar y pronto me daré ese tiempo)
a mi entender si quisiera utilizar un Opamp requiero de un -Transformador- para reducir el nivel de Tensión en la entrada no inversora, y aquí viene una pregunta ¿el transformador puede desfasar la señal? si es así estaría sincronizando el detector cruce por cero pero respecto a la señal desfasada saliente del transformador, y si en un futuro quisiera detectar el cruce por cero para poder controlar el disparo de un puente de Tiristores por ejemplo, ¿no estaría entonces disparando con un error de desfazamiento?

Por eso opte por solo utilizar un optoacoplador con una resistencia en serie para que en esta se caiga la tension sobrante, el problema como te imaginarás es que la resistencia se calienta y para mi es un desperdicio innecesario de energía,





> yo a dicho circuito le añado en la salida un circuito integrado schmitt-trigger invertido (inversor) recomendablemente de tecnologia cmos, el IC 74HC14



como lo mencionas, lo más probable es que la señal de salida del detector lo utilice para ingresarla a un dispositivo programable(micro) por lo que la idea de agregar un dispositivo con niveles lógicos estandarizados me agrada, desconozco la ventaja de utilizar CMOS a TTL, para mi el TTL es mejor y mas sencillo(enseguida comienzo a investigar sobre la diferencia TTL a CMOS) aunque creo que también se podría agregar un capacitor para lograr como lo muestras en la gráfica un cierto ciclo de servicio del pulso de salida.

En verdad agradezco tu respuesta e interés 
Saludos Cordiales!!!


----------



## mario congona (Feb 14, 2017)

saludos chicos he leido y visto sus comentarios y circuitos y tengo un problema similar, quiero adoptar el opto como comparador, quiero decir que me mande la señal al pic cuando en una entrada de 220v ac este en 0 no logro o un voltaje menor para que me mande señal al pic como 0 no se si me puedan ayudar se los agradezco


----------



## Scooter (Feb 14, 2017)

PC814 + R 180k 
Eso es todo lo que necesitas.


----------



## guezro (Abr 20, 2018)

Buenos días.

Les escribo porque tengo dos problemas para el control de disparo de un TRIAC.
Adjunto la imagen donde encontramos un detector de cero y 2 triacs.
Tras hacer pruebas (fisicamente) detecta el paso por cero, pero no me activa la salida del triac. Lo he revisado varias veces y no consigo ver el error.
Los TRIACS estan conectados de manera que las A1 estarían con la R1(J6) o R2(J16) y la A2 con F(J2)
(El H11AA1 entre A y K no es un diodo, es un DIAC)
¿ Alguien podría ayudarme?


.
La segunda duda es: como podría controlar el segundo triac en este código de manera que sea independiente al otro TRIAC?

```
// AC Control V1.1
//
// This Arduino sketch is for use with the heater
// control circuit board which includes a zero
// crossing detect function and an opto-isolated TRIAC.
//
// AC Phase control is accomplished using the internal
// hardware timer1 in the Arduino
//
// Timing Sequence
// * timer is set up but disabled
// * zero crossing detected on pin 2
// * timer starts counting from zero
// * comparator set to "delay to on" value
// * counter reaches comparator value
// * comparator ISR turns on TRIAC gate
// * counter set to overflow - pulse width
// * counter reaches overflow
// * overflow ISR turns off TRIAC gate
// * TRIAC stops conducting at next zero cross


// The hardware timer runs at 16MHz. Using a
// divide by 256 on the counter each count is
// 16 microseconds.  1/2 wave of a 60Hz AC signal
// is about 520 counts (8,333 microseconds).


#include <avr/io.h>
#include <avr/interrupt.h>

#define DETECT 6  //zero cross detect
#define GATE 7    //TRIAC gate
#define PULSE 4   //trigger pulse width (counts)
int i=483;

void setup(){

  // set up pins
  pinMode(DETECT, INPUT);     //zero cross detect
  digitalWrite(DETECT, HIGH); //enable pull-up resistor
  pinMode(GATE, OUTPUT);      //TRIAC gate control

  // set up Timer1
  //(see ATMEGA 328 data sheet pg 134 for more details)
  OCR1A = 100;      //initialize the comparator
  TIMSK1 = 0x03;    //enable comparator A and overflow interrupts
  TCCR1A = 0x00;    //timer control registers set for
  TCCR1B = 0x00;    //normal operation, timer disabled


  // set up zero crossing interrupt
  attachInterrupt(0,zeroCrossingInterrupt, RISING); 
    //IRQ0 is pin 2. Call zeroCrossingInterrupt
    //on rising signal

}

//Interrupt Service Routines

void zeroCrossingInterrupt(){ //zero cross detect 
  TCCR1B=0x04; //start timer with divide by 256 input
  TCNT1 = 0;   //reset timer - count from zero
}

ISR(TIMER1_COMPA_vect){ //comparator match
  digitalWrite(GATE,HIGH);  //set TRIAC gate to high
  TCNT1 = 65536-PULSE;      //trigger pulse width
}

ISR(TIMER1_OVF_vect){ //timer1 overflow
  digitalWrite(GATE,LOW); //turn off TRIAC gate
  TCCR1B = 0x00;          //disable timer stopd unintended triggers
}

void loop(){ // sample code to exercise the circuit

i--;
OCR1A = i;     //set the compare register brightness desired.
if (i<65){i=483;}                   
delay(15);                           

}
```
Muchas gracias,
Un saludo.


----------



## Scooter (Abr 20, 2018)

Ese detector de paso por cero se quemó en el primer semicicloque le entró al revés.
Y si no se quemó es que tiene un led mágico o algo así...
Puedes usar un PC814 que lleva dos diodos en antiparalelo y dará pulsos en cada semiciclo.


----------



## chclau (Abr 20, 2018)

Y con que tension estas alimentando al micro, 3.3V o 5V?


----------



## guezro (Abr 20, 2018)

Perdona en el dibujo está mal, el H11AA1 tiene DIAC en lugar de un diodo por lo tanto está bien. Aunque creo que he encontrado el problema. El problema está en el código, que usando como DETECT el pin 6 no funciona ya que la funcion "atachinterrupt" solo funciona con los pines 2 y 3 en el ATMEGA328P-PU. Alguien podría ayudarme con el segundo problema del códgo (querer controlar un segundo TRIAC independiente del otro, es decir distinto valor de disparo)?


----------



## Fogonazo (Abr 20, 2018)

guezro dijo:


> Perdona en el dibujo está mal, el H11AA1 tiene DIAC en lugar de un diodo por lo tanto está bien. . . . .


No tiene ningún DIAC, posee 2 LED´s en anti-paralelo

*H11AA1*


----------



## Scooter (Abr 20, 2018)

... ¿Delay 15?
¿Eso para qué sirve?
Si quemas 15ms en un semiciclo de 43...

Para empezar quita los delays

Me parece que estás usando el timer directamente, mira flexitimer o alguna librería que facilita esas cosas por si te interesa.

Pues para manejar dos o más triacs...

Interrupción paso por cero:
Lanzo en timer con el tiempo del primer triac
Vez=0

Interrupción timer:
Si vez ==0
Enciendo el primer triac
Lanzo el timer con la diferencia de tiempo hasta el segundo triac
Vez++


Si vez ==1
Enciendo el segundo triac
Lanzo el timer con la diferencia hasta el tercer triac
Vez++

Si vez ==3
Lo mismo con el tercer triac

Etc


----------



## guezro (Abr 24, 2018)

los 15 ms de delay es para que la luz se mantenga un poco de tiempo hasta que vuelva a cambiar.
en el código que estoy utilizando se podría añadir la función para el segundo TRIAC?
Voy a revisar la libreria flexitimer porque usando el timer directamente no lo entiendo muy bien.

Gracias, un saludo.


----------



## Scooter (Abr 24, 2018)

No entiendo el delay.
Si activas en triac se queda activado hasta el próximo paso por cero.
No le veo ningún sentido.
Además en aplicaciones en las que los tiempos son críticos los delays lo matan y lo entierran todo.
Hacer un dimmer es bastante delicado, si además haces varios dimmers a la vez no pongas delays si quieres que funcionen.

Supongo que tu código se podrá adaptar.


----------



## guezro (May 4, 2018)

Scooter dijo:


> No entiendo el delay.
> Si activas en triac se queda activado hasta el próximo paso por cero.
> No le veo ningún sentido.
> Además en aplicaciones en las que los tiempos son críticos los delays lo matan y lo entierran todo.
> ...


Si, tienes razón que el delay no tiene sentido ahí.

Como puedo adaptar mi código para meter otro triac independiente, es decir que la tensión de salida de uno sea mayor/menor que la del otro? porque añadir otro que tenga la misma tensión a la salida si lo veo sencillo añadiendo en esta parte su "GATE" 

```
ISR(TIMER1_COMPA_vect){ //comparator match
  digitalWrite(GATE1,HIGH);  //set TRIAC gate 1 to high
  digitalWrite(GATE2,HIGH);  //set TRIAC gate 2 to high
  TCNT1 = 65536-PULSE;      //trigger pulse width
}

ISR(TIMER1_OVF_vect){ //timer1 overflow
  digitalWrite(GATE1,LOW); //turn off TRIAC gate 1
  digitalWrite(GATE2,LOW); //turn off TRIAC gate 2
  TCCR1B = 0x00;          //disable timer stopd unintended triggers
}
```
y tampoco entiendo muy bien la forma de activarlo con esta parte:

```
i--;
OCR1A = i;     //set the compare register brightness desired.
if (i<65){i=483;}
```


----------

