rlodina Posted September 28, 2016 Share Posted September 28, 2016 (edited) 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 : 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 (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 ? 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 September 28, 2016 by rlodina Quote Link to comment Share on other sites More sharing options...
sesebe Posted September 28, 2016 Share Posted September 28, 2016 (edited) 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 September 28, 2016 by sesebe Quote Link to comment Share on other sites More sharing options...
rlodina Posted September 28, 2016 Author Share Posted September 28, 2016 (edited) @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 September 28, 2016 by rlodina Quote Link to comment Share on other sites More sharing options...
mars01 Posted September 29, 2016 Share Posted September 29, 2016 Posibil ringing pe Zero Cross pe rising edge cand atinge palierul High. Incearca sa pui un condensator de cca 10nF la ground din Zero Cross ca sa actioneze cu rezistorul de pull up ca un FTJ. Quote Link to comment Share on other sites More sharing options...
Guest Posted September 29, 2016 Share Posted September 29, 2016 (edited) 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 September 29, 2016 by Guest Quote Link to comment Share on other sites More sharing options...
UDAR Posted September 29, 2016 Share Posted September 29, 2016 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ță . Quote Link to comment Share on other sites More sharing options...
Liviu M Posted September 29, 2016 Share Posted September 29, 2016 (edited) HAA1 ala e "bidirectional"? Edited September 29, 2016 by Liviu M Quote Link to comment Share on other sites More sharing options...
rlodina Posted September 29, 2016 Author Share Posted September 29, 2016 Ok - multumesc de raspunsuri - fac cateva teste si revin. @Liviu M : HAA1 ala e "bidirectional"? - da ma scuteste de o punte redresoare inainte (ex: la 4N25) Quote Link to comment Share on other sites More sharing options...
costi002 Posted September 29, 2016 Share Posted September 29, 2016 MOC3031 pare sa aiba si cross 0 detection. a-ti incercat si cu unul fara detectie? eu am reusit sa fac asa ceva pe 4 canale si merge f bine. Quote Link to comment Share on other sites More sharing options...
rlodina Posted September 29, 2016 Author Share Posted September 29, 2016 @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. 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. Quote Link to comment Share on other sites More sharing options...
Liviu M Posted September 29, 2016 Share Posted September 29, 2016 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. Quote Link to comment Share on other sites More sharing options...
costi002 Posted September 29, 2016 Share Posted September 29, 2016 Am sa pun schema si codul cand ajung acasa. Quote Link to comment Share on other sites More sharing options...
digix Posted September 29, 2016 Share Posted September 29, 2016 (edited) Dupa detectarea trecerii prin zero ar trebui sa intarzii deschiderea triacului cu "a" milisecunde unde faci asta ? a < 10 milisecunde Edited September 29, 2016 by digix Quote Link to comment Share on other sites More sharing options...
rlodina Posted September 29, 2016 Author Share Posted September 29, 2016 @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%. Quote Link to comment Share on other sites More sharing options...
x_dadu Posted September 29, 2016 Share Posted September 29, 2016 (edited) 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 September 29, 2016 by XAN77 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.