Sari la conținut
ELFORUM - Forumul electronistilor

Dimmer AC - nelamurire


rlodina

Postări Recomandate

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

Editat de rlodina
Link spre comentariu
  • Răspunsuri 38
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

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?

Editat de sesebe
Link spre comentariu

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

Editat de rlodina
Link spre comentariu

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); } 
Editat de Vizitator
Link spre comentariu

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 spre comentariu

@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 spre comentariu

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 spre comentariu

@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 spre comentariu

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.

Editat de XAN77
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări