AC Fázishasítás
Az egyik eljárás, ha váltakozó feszültségről üzemelő fogyasztó teljesítményét szeretnénk szabályozni az úgynevezett fázishasításos eljárás. Ezt TRIAC-kal valósítják meg, méghozzá olyan elven, hogy a váltakozó feszültséggel szinkronban kapcsolgatják ki/be a TRIAC-ot. Általában lámpák fényerő-szabályozására valamint elektromos fűtések teljesítmény-szabályozására használják.
Lásd még:
http://playground.arduino.cc/Code/ACPhaseControl
Az áramkör
Az Arduino fejlesztői környezetet pár egyszerű alkatrésszel megtámogatva képesek leszünk rá, hogy monitorozzuk a szinuszhullámot és a hullámhoz képest a megfelelő időben kapcsoljuk ki illetve be a TRIAC-ot (egy 10 kOhm nagyságú felhúzó ellenállás szükséges a H11AA1 5. lábára). Ezt az áramkört mutatjuk be az alábbiakban.
Az áramkör tartalmaz egy optocsatolóval elválasztott nullpont érzékelőt és egy szintén optocsatolós áramkört, amivel bekapcsoló impulzust tudunk adni a TRIAC-nak. Az optocsatolók használata azért szükséges, mert galvanikusan le tudják választani egymástól a kis és a nagyfeszültségű részét az áramkörnek, ami biztonsági szempontból rendkívül fontos. Az összes olyan áramkörnél, amely közvetlenül az AC 230 V-os hálózathoz van kötve, mindig győződjünk meg róla, hogy mit csinálunk. Mindig győződjünk meg róla, hogy biztonságos-e amit csinálunk, ha olyan áramkörrel dolgozunk, amely közvetlenül az AC 230 V-os hálózathoz van csatlakoztatva.
A működés elmélete
A nullpont érzékelő áramkör minden egyes alkalommal, amikor a váltakozó feszültség pillanatnyi értéke nullán van ad egy 5 voltos impulzust. Ezt az impulzust dolgozzuk fel az arduino egyik megszakítást kezelő lábával, és ennek alapján szinkronizáljuk a kapcsolást a hálózattal. Ezt a kapcsolást lehet az alábbi ábrán látni.
Amikor a kapcsolásunk érzékeli a nulla átmenetet, a TRIAC kikapcsolva marad még az általunk számított ideig (t1). Minél hosszabb ez az idő, annál kisebb lesz a teljesítmény. Amikor a „kikapcsolási idő” t1 letelik, a mikrovezérlő bekapcsolja a TRIAC-ot, a gate-jére kapcsolt feszültséggel (pirossal jelölve). Amikor a TRIAC bekapcsolt, az onnantól bekapcsolva is marad akkor is, ha a gate lába nem kap feszültséget. Abban az esetben, ha a gate láb nem kap feszültséget, a következő nullaátmenetkor a TRIAC kikapcsol. Ezért van az, hogy nem szükséges ismét lekapcsolni a TRIAC-ot a szinuszhullám kezdetén. Az egyetlen dolog, amire oda kell figyelnünk, az az, hogy a TRIAC-ot le kell kapcsolnunk,. mire a következő nullaátmenet (t3) bekövetkezik. Azt az időt, ameddig a gate lábtra feszültséget kell adnunk (t2), a TRIAC típusa határozza meg (az adatlapjában benne van). Amennyiben a bekapcsoló impulzus nem tart elég ideig a TRIAC kapcsolása bizonytalanná válik, előfordulhat, hogy 1-1 félhullámban nem kapcsol be, ami a kimeneten alacsonyabb teljesítményként jelentkezik.
Az arduino megszakításkezelését is az időzítőjét fogjuk használni, hogy precízen tudjuk a gate lábra a feszültséget kapcsolgatni. Ahhoz, hogy az időzítés jó legyen meg kell vizsgálni a szinuszhullámot és az időzítőt.
A szinuszhullám frekvenciája (hazánkban) 50 Hz. Ez azt jelenti, hogy másodpercenként ötven alkalommal játszódik le, hogy a hullám eléri a 0 átmenetet, majd pozitív feszültség lesz, majd ismét eléri a 0 átmenetet és akkor átvált negatív polaritásra. A teljes periódus 1/50, azaz 20 ms (milliszekundum) ideig tart. Ebből következik, hogy a fél periódus – ami a 2 db 0 átmenet között van – ideje 10 ms. Ez szerepel a diagramon t3 időként.
Az arduino sebessége 16 MHz, ami 16.000.000 ciklus másodpercenként: egy ciklus 0,0625 us (mikroszekundum) ideig tart. A szinuszhullám fél hulláma ez alapján pontosan 160000 ciklus ideig tart. Ez fontos, mert mi nem idő alapon, hanem ciklus-számlálás alapon tudunk a mikrovezérlővel dolgozni.
Az interneten sok információ fellelhető azzal kapcsolatban, hogy pontosan hogyan is működnek (mind a külső, mind a belső) megszakítások, így ezt itt most nem fogjuk részletezni, röviden arról van szó, hogy megszakítás keletkezésekor a vezérlőben futó program megáll és a megszakításhoz kapcsolódó eseményt abban a pillanatban végrehajtja, majd miután ezzel végzett, visszaáll a program normál futása. Ez teszi lehetővé a mikroprocesszor számára, hogy a nagyon időkritikus feladatokat, mint pl. a fázishasításos vezérlés, el tudja végezni.
Egyéb:
Ehhez a kapcsoláshoz nyomtatott áramkör a következő linken érhető el:
https://batchpcb.com/pcbs/93955
Program:
HeaterControl.pde
// 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 2 //zero cross detect
#define GATE 9 //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);
}
Figyelem! A program az eredeti, arduino oldalról származik, nincs benne módosítva semmi, így ez a 60 Hz-es hálózatokra van optimalizálva. A kapcsolás 120 VAC hálózaton lett tesztelve, elképzelhető, hogy a 2 db 15k ellenállás értékét duplázni kell. A fordításban lévő esetleges hibákért felelősséget nem vállalok.