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

Arduino mega 2560 - wykrywanie przejścia fazy przez zero

09 Lut 2013 16:23 5598 18
  • Poziom 11  
    Witam,
    zrobiłem układ wykrywania przejścia fazy przez zero oparty o CNY17-2, zgodnie z notą katalogową http://www.datasheetcatalog.org/datasheet/toshiba/2212.pdf .
    (strona 6 prawy dolny róg), zmieniłem tylko rezystor na kolektorze na 500ohm. Odczytuje wartości na serial monitorze i otrzymuję taką sekwencję na wejściu cyfrowym:
    0
    1
    1
    0
    1
    1
    0
    1
    1
    0
    chcę sterować triakiem poprzez ten układ tylko pytanie czy ta sekwencja jest dobra?
  • PCBway
  • Moderator Mikrokontrolery Projektowanie
    A skąd mamy to wiedzieć nie mając markerów czasowych? Ogólnie jeśli uzyskujesz zmianę co ok. 20 ms to jest ok (10 ms dla detekcji z dwoma diodami). Swoją droga ten CNY to się średnio nadaje, wymaga zewnętrznej diody połączonej antyrównolegle - zważ, że LEDy mają bardzo małe dopuszczalne napięcie wsteczne. Lepiej użyć transoptora, który ma w strukturze dwie diody.
  • PCBway
  • Poziom 30  
    Detekcja przejścia przez zero:

    Zamiast rezystora 4,7k można spokojnie wykorzystać wewnętrzne podciągnięcie w procesorze.

    Arduino mega 2560 - wykrywanie przejścia fazy przez zero

    Ja zwykle podłączam wyjście detektora do któregoś wejścia INT i wykorzystuję przerwanie do załadowania timera odpowiednią wartością i wyłączenia triaka. W przerwaniu z timera załączam triak.
  • Moderator Mikrokontrolery Projektowanie
  • Poziom 30  
    Po to, aby mieć impuls wyzwalający przerwanie w każdym półokresie sieci. Uprzedzając pytanie o detekcję przerwania na obu zboczach detektora, zaznaczam że zbocze opadające będzie w takim przypadku opóźnione względem zera, a narastające pojawi się wcześniej, innymi słowy, czas trwania stanu wysokiego będzie dłuższy niż niskiego. Zmuszało by to do programowej korekcji opóźnienia dla jednego z półokresów przebiegu.
  • Poziom 11  
    A jak zrobić markery czasowe? Szukałem w sieci rozwiązania i to było stosowane. Polecacie coś innego?
  • Poziom 30  
    Tak jak wcześniej pisałem, najłatwiej podpiąć wyjście detektora do wejścia INT0 lub INT1, w obsłudze przerwania wyłączamy pin odpowiedzialny za triak, ładujemy do TIMER1 ładujemy obliczoną wartość opóźnienia załączenia triaka. W obsłudze przerwania z TIMER1, włączamy pin wyjściowy.

    Przykład:

    Atmega8, taktowana 8 MHz, przerwanie INT1 skonfigurowane jako "RISING".
    TIMER1 - 16 bitów, jako timer, podział zegara taktującego przez 8 (taktowanie 1MHz).

    Jak łatwo policzyć maksymalne opóźnienie powinno być mniejsze niż 10mS, co daje nam 10 000 taktów licznika TIMER1. Wystarczy jedna zmienna globalna 16 - bit, do której w pętli głównej (lub gdziekolwiek indziej), wpisujemy wartość opóźnienia w zakresie 55535 - 65535, (timer liczy w górę, a nam zależy na przepełnieniu, więc im wyższa wartość załadowana do timera, tym szybciej otworzy się triak).

    Jeżeli na wyjście wybierzemy np. PORTB.0, to :

    W przerwaniu INT1 - RES PORTB.0, TIMER1 = zmiena

    W przerwaniu TIMER1 - SET PORTB.0

    I teraz spokojnie martwimy się tylko o zawartość "zmienna",l a przerwania zrobią resztę za nas.
  • Moderator Mikrokontrolery Projektowanie
    danthe napisał:
    Po to, aby mieć impuls wyzwalający przerwanie w każdym półokresie sieci. Uprzedzając pytanie o detekcję przerwania na obu zboczach detektora, zaznaczam że zbocze opadające będzie w takim przypadku opóźnione względem zera, a narastające pojawi się wcześniej, innymi słowy, czas trwania stanu wysokiego będzie dłuższy niż niskiego. Zmuszało by to do programowej korekcji opóźnienia dla jednego z półokresów przebiegu.


    Przecież dokładnie to samo można osiągnąć bez mostka stosując transoptor z dwoma diodami np. LTV814.
  • Poziom 30  
    Autor ma już CNY17, pewnie łatwiej dodać mostek, nowy transoptor trzeba prawdopodobnie kupić. Oczywiście, transoptor z dwoma diodami jak najbardziej. Także podwójny może być, zwarte wyjścia, a diody połączone odwrotnie równolegle.
  • Poziom 11  
    danthe napisał:
    Tak jak wcześniej pisałem, najłatwiej podpiąć wyjście detektora do wejścia INT0 lub INT1,

    Nie wiem czy się mylę ale płytce Arduino nie mam wyjścia INT0. Nie mógł bym zrobić tak, że jeżeli układ dostanie sygnał o przejściu przez zero, dać delay 10ms i załączyć wyjście?
  • Moderator Mikrokontrolery Projektowanie
    M2560 potrafi generować przerwania pinów IO. Zajrzyj do noty procka i wybierz sobie pin o takich możliwościach. O delay zapomnij - zastanó się - twój program w efekcie spędzał by 100% w pętli delay, nie mogąc robić nic innego. Jaki więc sens stosować potężny procek jakim jest M256, żeby czekał w pętli i ew. zmieniał stan wyjścia? To się robi na timerach i przerwaniach.
  • Poziom 11  
    W takim razie zostaje mi zapoznać się z przerwaniami i spróbować napisać pogram. Jeżeli będę miał problemy z kodem to będę pytał. A koniec końców układ wykrywania przejścia fazy przez zero mogę zostawić w takiej postaci jak jest?
  • Moderator Mikrokontrolery Projektowanie
    A w jakiej jest, bo schematu nie dałeś? Od strony MCU pewnie jest ok, a jak jest od strony sieci? Dwie antyrównoległe diody muszą być, inaczej zniszczysz diodę transoptora.
  • Poziom 11  
    Schemat mam dokładnie takie jak w poście 3.
  • Poziom 30  
    To tak może zostać. Wnioskuję z poprzednich postów, że kolega nie ma zbyt dużego doświadczenia z programowaniem? Nie bój się przerwań, one bardzo upraszczają wiele rzeczy, zwalniają od ciągłego sprawdzania stanów wejść lub licznika.
  • Poziom 11  
    Tak kolego, nie mam zbyt dużego doświadczenia w programowaniu, dopiero się uczę i jak to na początku jest bardzo pod górkę. O przerwaniach już poczytałem i wywołanie nie powinno stanowić problemu natomiast teraz jestem przy timerach i żeby je rozgryźć trzeba będzie więcej czasu. Dziękuję bardzo za pomoc i wsparcie.
  • Poziom 11  
    Przebrnąłem przez timery zobaczymy z jakim skutkiem, proszę o zweryfikowanie mojej pracy.
    Wybrałem tryb licznika CTC. Podział zegara taktującego 16Mhz przez 8 o daje nam taktowanie 2Mhz. Więc maksymalne opóźnienie będzie mogło wynosić 20 000 'zliczeń' licznika.
    Przerwanie pochodzące od układu wykrywającego zero wyłączy pin do którego będzie podpięty układ sterujący triakiem. W procedurze obsługi tego przerwania uruchamiam timer i ładuję do niego zmienną o nazwie czas, która będzie modyfikowana.
    Kiedy licznik się przepełni uruchomi to wewnętrzne przerwanie które włączy triak aż do momentu kolejnego przejścia przez zero.
    Chciałem zapytać czy mój kod jest poprawny? Jeżeli tak to czy dobrze umieściłem konfiguracje timera w pętli od przerwania zewnętrznego? Chodzi o to, żeby za każdym razem liczył od zera.


    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 2  
    Czesc i co jak poszło z tym projektem ? bo na podstawie tego chciałbym zbudować soft starter.