Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Program do dimmera! Włączanie MOC3021 w odpowiednich momentach.

sheeeep 04 Lut 2007 15:24 2214 11
  • #1 04 Lut 2007 15:24
    sheeeep
    Poziom 25  

    Witam!
    Potrzebuję program do mojej Atmegi16 który będzie sterował 8 kanałami dimmera poprzez włączanie MOC3021 w odpowiednich momentach.
    Przeszukałem elektrodę i jest nawet dość sporo informacji na temat regulacji fazowej, które chciałem wykożystać, ale mój program jak nie chodził tak nie chodzi. Już 150 wersji wypróbowałem i kicha. Nie mam w sumie żadnej wersji ostatecznej tego programu i prosiłbym Was o pomoc.

    Posiadam układ detekcji zera, który podłączyłem przez CNY17-3 do INT1 (reaguje na zbocze opadające), powiedzmy PORTC zostawiam na wyjścia MOC3021. Jak już uporam się z samym włączaniem i wyłączaniem triaków to dorzucę jeszcze sterowanie DMX, ale na razie nie chcą same traki chodzić :cry:. Co jescze? Atmega jest taktowana 16MHz zegarem.

    Wydaje mi się że poprzez wykożystanie timera1 można by bez problemu osiągnąć dla tych 8 kanałów 8 bit rozdzielczości regulacji. Jak wiadomo nie można tego proporcionalnie w czasie traktować, więc wydaje mi się sensownym wykonać to wszystko na tym timerze, zrobić tablicę z wartościami od których te triaki mają się włączać. 16bit * 256 = 512 bajtów, czyli 512 bajtów tablica z krokami poszczególnego włączania triaków. I później do tego jeszcze dojdzie USART aby komunikować się ze sterownikiem DMX.

    Nie wiem czy gdzieś nie popełniłem błędu logicznego jak to sobie wszystko wyobrażam, choć wydaje mi się że powinno to działać. Przesiedziałem całą noc i nie mam pomysłu co jest nie tak, albo żarówka świeci się cały czas, albo działa pulsacyjnie, cuda się dzieją. Nie wiem, próbowałem różnych wartości preskalerów od 8 do 256, i wydaje mi się że powinno to działać, przy 8 wychodzi niecałe 20 000 kroków timera1 przy tym kwarcu.

    Prosiłbym o pomoc w podanym temacie, bo już sam nie wiem co robić.
    Może jeszcze dodam że programuję w C.

    Pozdrawiam i proszę o pomoc,
    Sheep

    0 11
  • Pomocny post
    #2 04 Lut 2007 19:53
    Dexter77
    Poziom 28  

    Byc moze za duzo razy wyzwala Ci sie procedura detekcji zera. Kiedy zbocze narasta/opada powoli to tak moze byc. Kiedys pisalem program do podobnego zastosowania. Zero bylo wykrywane prostym sposobem przy pomocy komparatora wewnatrz Atmegi88. Po kilku godzinach prob i zastawianiu pulapek programowych okazalo sie ze przerwanie od komparatora bylo generowane kilkanascie razy. Rozwiazaniem bylo wylaczenie na czas ok. 1ms przerwan od komparatora po otrzymaniu pierwszego przerwania. Jest to system czasu rzeczywistego i bez oscyloskopu ciezko Ci bedzie sledzic bledy...
    Pozdro
    Dexter

    0
  • #3 04 Lut 2007 21:54
    sheeeep
    Poziom 25  

    No niestety takowego nie mam, i w tym jest problem. Jakbym miał to prosta piłka.
    A co do detekcji zera to już sprawdzałem kilka razy czy nie jest tak jak napisałeś. Patrzałem ile razy na sekundę wbija i jest ok.

    Może ktoś pisał coś takiego i podzieliłby się już sprawdzonym kodem, albo ktoś coś napisze i to szybciutko wrzucę i wypróbuję co się z tym dzieje.

    Jeszcze jedno pytanie, teoretycznie triak jak jest włączony to można go tylko wyłączyć przy przejściu przez zero. Czy wystarcza w praktyce że podam na MOC3021 impuls a nie będę go trzymał do końca? Próbowałem coś takiego zrobić, jako że pod przerwanie dawałem sleepa 2ms. i zaświecałem poczym po 1ms gasiłem MOC-a. Efekt był taki że świeciło pulsacyjnie. Dobrze czy źle? I czy trzeba do końca trzymać.

    Dzięki i pozdrawiam,
    Sheep

    0
  • #4 05 Lut 2007 01:44
    KJ
    Poziom 31  

    Walczyłem z podobnym problemem. Przyczyną było tak jak kolega wyżej napisał fałszywe przerwanie, u mnie powstawało ono w momencie włączania obciążenia. Mój układ działał w prawdzie na 12V elektronika była zasilana z tego samego trafa co żarówki a detektor zera składał się z diody i opornika. Problem rozwiązało dołożenie dość sporej cewki szeregowo z obciążeniem. Co do sterowania triakiem to wystarczy tylko impuls nawet jest to wskazane. Najlepiej było by zdobyć oscyloskop i pooglądać co się dzieje. Na dobry początek proponuję dać (jeśli nie ma) po kondensatorze 100n równolegle z każdą diodą mostka prostowniczego zasilającego cały układ.

    0
  • #5 05 Lut 2007 23:01
    sheeeep
    Poziom 25  

    Nic to nie zmieniło.
    http://student.agh.edu.pl/~ziziok/Sheep/CRW_7678.jpg
    Teraz to wygląda zdecydowanie inaczej, ale płytki takie same. Wykrywanie zera jest na części niskonapięciowej z 12V jest wzięty przez opornik prąd na bazę tranzystora poczym zaświca CNY17.
    Zrobiłem program który zliczał ilość wybić przerwań na sekundę i się zgadzało w ilości.
    Wydaje mi się że problem tkwi w wsadzie.
    A jakiej szerokości powinien być impuls podany na MOC-a żeby wszystko poprawnie chodziło?

    Ok, mam troche nowych odkryć ;-)



    Code:
    #include <avr/io.h>                // dostęp do rejestrów
    
    #include <avr/interrupt.h>       

    int i,b;

    SIGNAL (SIG_INTERRUPT1)
    {
    //0-7000x:  asm("nop"); żeby spowodować przerwę
    //(...)

    PORTC=0xFF;
    __asm("nop");
    __asm("nop");
    __asm("nop");
    __asm("nop");
    PORTC=0x00;

    }

    int main(void)
    {
      DDRD=0x00;
      PORTD=0xFF;
      DDRC=0xFF;
      PORTC=0x00;
      GICR = _BV(INT1);
      MCUCR = _BV(ISC11);
      sei();
      while(1);
    }





    W zależności od ilości przerwy w przerwaniu zmienia się jasność świecenia żarówki, jednak ponad powyżej 7000 cykli przed PORTC=0xFF; Nie chce się zaświecić, tzn jak jest 8k cykli to już nie działa. ale do 7 ściemnia żarówkę tylko do pewnego poziomu. Z czego to może wynikać? (kwarc wewn = 1Mhz, czyli na 100 dzieląc wychodzi że powinno być ok. 10 k cykli na jedną rundkę).
    5 cykli wystarcza żeby MOC-a skutecznie zaświecić(bez żadnej przerwy też działa ale czasem jest niestabilny).

    Więc sprzętowo wszystko chodzi tak jak ma być, więc trzeba napisać program który będzie:
    -obsługiwał DMX
    -wysterowywał MOC-e
    -i tyle =)

    Teraz powiedzcie czy dobrze myślę:
    -Preskaler CLK/8 Timer1 (20k cykli na półokres)
    -Int1 odpalony do zerowania Timera1
    -Tablica z 256 wartościami 16 bitowymi do przechowywania progów włączania (zcałkowana sinusoida)
    -DMX przez SN75176B podłączony do USART (tylko odbiór) baud 250 000 odbiór w głównej pętli programu i zapisywanie wartości do tablicy
    -Po przyciśnięciu przycisku odczyt adresu DMX
    -Wszystko taktowane 16Mhz zegarem

    Czy to ma prawo działać i gdzie Waszym zdaniem najlepiej jest sprawdzać wartości z Timerem1 i odpalać MOC-e? W Głównej pętli?

    Pozdrawiam,
    Sheep

    0
  • #6 08 Lut 2007 13:18
    Scyzor
    Poziom 12  

    Witam.

    To może ja wtrące swoje 5groszy. Zrobiłem już dwa dimery sterowane DMX-em, na podstawie projektów ze stron:

    1. http://www.hoelscher-hi.de/hendrik/english/dimmer.htm
    2. http://semitone.sourceforge.net/wiki/index.php/Semitone_Diamond

    Pierwszy układ jest dosyć prosty, tyle że program napisany jest w asemblerze i jakoś go niepotrafie zrozumiec. Co do drugiego projektu to irytuje mnie tylko to że jest to 20 kanałów na jednej fazie, więc chyba będzie trudność w zasileniu tego urządzenia przy obciązeniu każdego kanału np. 1000W PAR-em.

    0
  • #7 08 Lut 2007 21:55
    sheeeep
    Poziom 25  

    Scyzor, wielkie dzięki!
    Jutro rozczytam jak to było zrobione w tych 2 projektach. Nie lubie czytać obcego kodu w asm bo to jest jedna z najgorszych rzeczy, każdy pisze swoim stylem i nie fajnie się analizuje. Ale na pewno się przyda.
    A co do 20 kanałów to, to jest 83A jak każde wejście 1kW robisz 3 dimmery każdy pod osobną fazę i masz 83Ax3 Czyli dobra scena z PARami 64
    Pozdrawiam,
    Sheep

    0
  • Pomocny post
    #8 10 Lut 2007 01:01
    Scyzor
    Poziom 12  

    Cytat:
    Wykrywanie zera jest na części niskonapięciowej z 12V jest wzięty przez opornik prąd na bazę tranzystora poczym zaświca CNY17.


    Zdecydowanie odradzam takie podłączenie detekcji zera (po wtórnej stronie transformatora). Kiedyś podłączyłem układ detekci po stronie wtórnej trafa i w momencie załączania na 100% jasności dość sporego obciążenia tj. rzędu 15KW układ przestawał pracować i sygnalizował błąd synchronizacji sieci. Po podłączeniu detekcji zera bezpośrednio pod 220V problem ten ustąpił.

    A teraz troszke bardziej na temat.
    W jednym linku który podałem (Semitone Diamond) tablica czasów w pliku "timing.h" nie jest zbyt udana w porównaniu działania tego dimera z innymi. W źródłach tego projektu jest skrypt "timings" w którym jest proceudra która oblicza tę tablicę. Są w niej dwa algorytmy z czego jeden jest zachaszowany. Ja użyłem tego zachaszowanego i dimer działa trochę lepiej. To jest tylko moje zdanie ale może się komuś przyda.

    Pozdrawiam: Scyzor

    0
  • #9 10 Lut 2007 10:17
    sheeeep
    Poziom 25  

    Witam, dobrze że mówisz bo jeszcze płytki pod proca nie robiłem to jeszcze dorzucę układ detekcji zera pod 230V. Tak z ciekawości to używałeś tego schematu:
    Program do dimmera! Włączanie MOC3021 w odpowiednich momentach.
    Czy innego, to bym już w pełni sprawdzony wrzucił. Co do tablicy czasów, to przecałkowałem sinusoidę tak żeby odmierzać równe odcinki czasu dzięki czemu będzie to liniowe, a jak mi się nie spodoba to najwyżej zmienię.

    Teraz jeszcze Atmega mi padła, więc do poniedziałku jestem uziemiony, ale cóż - zdarza się :-) Ostatnią płytkę wytrawię i będzie elegancko.

    Dzięki i pozdrawiam,
    Sheep

    0
  • Pomocny post
    #10 12 Lut 2007 00:07
    Scyzor
    Poziom 12  

    Witam.

    Cytat:
    Tak z ciekawości to używałeś tego schematu


    Tak używałem tego układu i raczej nie miałem zastrzeżeń co do jego działania.

    0
  • #12 13 Lut 2007 13:02
    sheeeep
    Poziom 25  

    Ok, dzięki za informacje. Jutro się tym zajmę i zobacze co z tego będzie.
    pozdrawiam

    0