1 de 5
http://www.bristolwatch.com/ele2/zero_crossing.htm
Hobby Electronics
Bristol Tri-Cities
Fig. 1
2 de 5
http://www.bristolwatch.com/ele2/zero_crossing.htm
Fig. 2
Fig. 2 shows how to use a H11AA1 opto-coupler to generate a TTL level pulse.
During most of the time the photo transistor output is LOW except when the voltage
is near zero when the collector goes HIGH. The dual LED emitters of the H11AA1
assures both half-cycles are utilized.
Fig. 3
Fig shows a more common opto-coupler such as a 4N25, but to use both half-cycles
will require a diode bridge input.
3 de 5
http://www.bristolwatch.com/ele2/zero_crossing.htm
Fig. 4
Fig. 4 shows a direct application of a zero-crossing detector using an Arduino microcontroller to control the power output to a lamp. This variation still uses the H11AA1
but can be directly connected to 120VAC. The sketch is shown below.
The output of the H11AA1 is connected to Arduino DP2 to use its internal interrupt
INTR0. When the switch on DP4 is closed a LOW is detected and the program
connects interrupt 0 turning on a interrupt service routine acon.
The ISR reads the value of the potentiometer on AN0, divides by 4, then calculates a
delay based on that value. The longer the delay (between 200uSec. and 8.3mSec.)
the less power delivered to the load. The circuit will act as a lamp dimmer.
When the switch is opened the interrupt is detached and the lamp goes off. See the
following related pages:
Hardware Interrupts Tutorial for Arduino
Basic Triacs and SCRs
Solid State AC Relays with Triacs
Light Activated Silicon Controlled Rectifier (LASCR)
Arduino AC Power Control Using Interrupts
In Depth Look at AC Power Control with Arduino
/*
Purpose: to detect zero crossing pulse at INT0 digital pin 2,
which after delay switches on a triac.
Power activate by external switch
01/08/2016 02:21 a.m.
4 de 5
http://www.bristolwatch.com/ele2/zero_crossing.htm
*/
#define triacPulse 5
#define SW 4
#define aconLed 13
int val;
void setup() {
pinMode(2, INPUT);
digitalWrite(2, HIGH); // pull up
pinMode(triacPulse, OUTPUT);
pinMode(SW, INPUT);
digitalWrite(SW, HIGH);
pinMode(aconLed, OUTPUT);
digitalWrite(aconLed, LOW);
}
void loop() {
// check for SW closed
if (!digitalRead(SW)) {
// enable power
attachInterrupt(0, acon, FALLING);
// HV indicator on
digitalWrite(aconLed, HIGH);
} // end if
else if (digitalRead(SW)) {
detachInterrupt(0); // disable power
// HV indicator off
digitalWrite(aconLed, LOW);
} // else
} // end loop
5 de 5
http://www.bristolwatch.com/ele2/zero_crossing.htm