Jump to content
ELFORUM - Forumul electronistilor

Dimmer AC - nelamurire


rlodina
 Share

Recommended Posts

Buna.

 

Pentru un mic proiect am de facut o dimare (independenta) la 10 becuri - controlata de Arduino.

 

Dupa un pic de research - s-a conturat urmatoarea schema :

 

Posted Image

 

o rectificare: folosesc BT 137-600E si MOC3051M

 

Logica de dimare este urmatoarea:

  - detectez trecerea prin zero a tensiunii retelei printr-o intrerupere 

  - in rutina de intrerupere deschid triacul cu o temporizare (α - din desenul de mai jos) => dimare

 

Posted Image

(http://www.pcbheaven.com/wikipages/Dimmer_Theory/)

 

Problema-i ca pe output nu am decat max  ~30% - chiar daca α = 0

 

Ce nu inteleg de ce codul:

//Arduino NANO#define IN_A 5void setup(){       pinMode(IN_A, OUTPUT);    attachInterrupt(0 /* PIN 2 */, onZeroCross, RISING);  }void onZeroCross() {   digitalWrite(IN_A, HIGH);        delayMicroseconds(10);         // wait for triac   digitalWrite(IN_A, LOW);   }void loop()  {}

Genereaza pe canalul IN_A - cate 2 sau 3 HI | LO (vezi zoom-urile din imaginea de mai jos). Ar trebui sa fie doar un HIGH urmat de un LOW. Nu ?

 

Posted Image

 

Canalul Zero_cross = PIN 2

Canalul IN_A = PIN 5

 

Orice idee sau comentariu (chiar si o alta schema/abordare) este binevenit.

 

Multumesc

Radu

Edited by rlodina
Link to comment
Share on other sites

  • Replies 38
  • Created
  • Last Reply

Top Posters In This Topic

Dar un osciloscop ai pus sa masori si sa vezi ce se intimpla pe acolo?

Nu gasesc date despre optocuplorul de detectie dar esti sigur ca ai ce te astepti sa ai la iesire?

 

edit: screenshootul este dintr-un osciloscop pe usb? sau este un simulator?

Edited by sesebe
Link to comment
Share on other sites

@sesebe:

 

Dar un osciloscop ai pus sa masori si sa vezi ce se intimpla pe acolo?

  - nu-mi este acasa 

 

Nu gasesc date despre optocuplorul de detectie 

 - HAA1X : http://www.tme.eu/ro/Document/9d740051576413a595b2de55776108d8/H11AAx-I.pdf

 

dar esti sigur ca ai ce te astepti sa ai la iesire?

- apoi ... acum nu mai sunt sigur de nimic 

 

 screenshootul este dintr-un osciloscop pe usb? sau este un simulator?

 - analizor logic: (un canal este pus pe ZERO_CROSS si unul pe IN_A)

Edited by rlodina
Link to comment
Share on other sites

nu prea e ok sa folosesti delay-uri in intreruperi.

posibil de-asta sa faca re-trigering.

 

pune in intrerupere un flag volatil (pentru ca il accesezi si din loop) si muta procedura de comanda in loop.

ai ~30% pentru ca ai un impuls de ~14uS

 

acum... a = ~0 , dar dureaza prea putin. ca sa fie cat mai aproape de zero, trebuie renuntat la digitalWrite(); pentru ca ai o latenta de 3+2 = 5uS; nu ar fi foarte semnificativ dar ...

 

dupa schema, nu ar fi FALLING la intrerupere ?

 

cred ca ar trebuii in in setup, sa activezi pull-up

void setup(){  pinMode(IN_A, OUTPUT);  pinMode(2, INPUT);  digitalWrite(2, HIGH);  attachInterrupt(0 /* PIN 2 */, onZeroCross, RISING); } 
Edited by Guest
Link to comment
Share on other sites

O observație suplimentară : impulsul de ZERO_CROSS este centrat pe trecerea efectivă prin zero și are o lățime destul de mare .

Comanda de aprindere a triacului nu ar trebui să o dai pe RISING pentru că asta se întâmplă tocmai înainte de terminarea semialternaței în curs ci pe FALLING , când tocmai ce a început o nouă semialternanță .

Link to comment
Share on other sites

@costi002 :

 - "MOC3031 pare sa aiba si cross 0 ....  " - folosesc  MOC3051M  care nu are zero cross (scuze: pe schema a ramas MOC3031  - ca pe asta l-am gasit in eagle).

  - "eu am reusit sa fac asa ceva pe 4 canale si merge f bine"  - dacă poți  să ne dai ceva detalii (schemă, cod) ar fi grozav. 

 

Am inclus in program sugestiilel:

//Arduino NANO#define IN_A 5#define cbi(PORT, BIT) (_SFR_BYTE(PORT) &= ~_BV(BIT))// clear bit #define sbi(PORT, BIT) (_SFR_BYTE(PORT) |= _BV(BIT)) // set bit volatile boolean isZeroCross = 0;void setup(){       pinMode(IN_A, OUTPUT);        pinMode(2, INPUT);    digitalWrite(2, HIGH);        attachInterrupt(0 /* PIN 2 */, onZeroCross, FALLING);  }void onZeroCross() {      isZeroCross = 1;}void loop()  {    if (isZeroCross){        isZeroCross = 0;        sbi(PORTD, IN_A);            delayMicroseconds(10);         // wait for triac        cbi(PORTD, IN_A);    }}

Comportamentl este acelasi.

 

Posted Image

O observatie: cu ajutorul condensatorului (sugerat de colegul mars01) - am scapat de  A (vezi imaginea de mai sus).

Un alt lucru interesant este ca cele 2 leduri emitatoare din HAA1X nu lucrează la fel astfel incat exista o dif. de ~600 µs intre ele. 

 

Voi experimenta alte valori pentru rezistentele din zona de zero-cross-detection + nici nu stiu cate incredere sa am eu in acest analizor - este o clona de Saleae.

 

Sunt cobză de răcit - și nu ies nici azi - dar mâine-mi aduc osciloscopul și poate-i dau de capăt.

 

In esență va fi un modul I2C care-ti va permite sa controlezi dimarea pe cele 12 canale.

 

Link to comment
Share on other sites

Prin data sheetul de la ATMega328 nu gasesc nici un indiciu despre tipul intrarilor (daca au Schmitt-Trigger sau nu). In conditiile in care nu au, atunci comportamentul e destul de normal.

Ai pus si condensatorul sugerat de Marius?

Stiu ca ti s-a spus sa nu folosesti delay in functia de servire a intreruperii, dar pentru teste poti sa revii la prima forma a functiei asteia si sa faci un mic debouncing.

Eu as incerca cu un delay de vreo 100 - 150 us (cam atat pare sa oscileze, din ce vad eu un poze). Cu alte cuvinte, cand ajungi in intrerupere, astepti 100-150 us, verifici ca esti in 0 (detectie front cazator) si abia dupa aia treci la prelucrari (faci isZeroCross = 1;).

Sau pui un bufer cu Schmitt Trigger la intrare sau un comparator (cu fereastra) intre H1AA1 si Arduino.

Edit: Pacalit de nume, am batut cu eleganta campii. Am crezut ca IN_A e intrarea ta de detectie, dar pare iesire.

Uita tot ce-am zis anterior, n-are probabil nici o treaba cu problema ta, intrarea (ZERO_CROSS) pare sa comute ferm.

Edit la edit: Interesant e ca tie iesirea ti-o ia la plimbare inainte sa ai semnal la intrare.

Link to comment
Share on other sites

@digix - codul de mai sus era un exemplu care sa ilustreze o nelămurire:  de ce se la o detectare a trecerii in zero (ZERO_CROSS) sun generare mai multe impulsuri (IN_A).

 

Voi posta și codul complet. Practic totul a început de la următoarea constatate: chiar dacă α = 0 (cel puțin teoretic) eu pe ieșire obțineam ~ 35%.

Link to comment
Share on other sites

Dar de ce ai pus opto bidirecțional pentru zerocross?

Eu văd situația așa, cînd alternanța scade sub +1,2V ledul ce era comandat pînă atunci se dezactivează, detectînd zerocros, urmează un timp mort pînă alternanța atinge -1,2V cînd se activează celălalt led, și iar ai schimbare de stare deci detecție de zero cross. Acel opto este făcut să lucreze în AC. Dar tu puteai pune un PC817/123 banal. Eu am lucrat chiar recent cu așa ceva și nu am avut probleme.

Edited by XAN77
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share




×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines