Minden, ami elektronika

Elektronikával hobbi szinten foglalkozó oldal

ARDUINO fázishasítás

2017. december 23. 08:00 - raptor13

Arduino phase control

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.

 acphasecontrolschematic.png

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.

 acwave.png

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

 

}

 

LINK

 

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.

Szólj hozzá!

A bejegyzés trackback címe:

https://electro.blog.hu/api/trackback/id/tr4213515643

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása