logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Attiny 2313A, C - Sterowanie fazowe nie działa na liczniku, tylko na delay'ach

mitny 22 Wrz 2015 21:10 1062 10
REKLAMA
  • #1 15013855
    mitny
    Poziom 13  
    Witam,
    Niedawno zakupiłem kit AVT 2623 który chcę sobie wmontować w mój układ ale póki co mam problem z jego obsługą - a mianowicie nie działa mi sterowanie fazowe. Problem jest czysto programowy gdyż jeśli obsługę robię na delay'ach to działa a gdy na liczniku to nie działa.
    Poniżej mój kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Przerwanie INT0 jest inicjowane przy każdym przejściu przez 0 a więc 100 razy na sekundę. Czekam sobie 7ms i włączam zasilanie po czym po 3ms wyłączam i tak w kółko. Gdy zmieniam na obsługę za pomocą timera1:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    to przerwanie timera powinno być uruchamiane po 7ms od przerwania INT0, w jego trakcie powinno być włączone zasilanie i zatrzymany licznik po czym przy następnym przerwaniu od INT0 wyłaczane zasilanie i ponowne uruchomienie timera. Oscylator jest 8MHz wiec przy preskalerze 256 ustawienie licznika do porównania na 218 powinno również dać 7ms.
    Jednak efekt jest taki, że w tym 2 rozwiązaniu żarówka pali się ciągle chyba, że przekroczę czas do 10ms gdzie już wówczas pierwsze będzie przerwanie od INT0.

    Proszę o pomoc co robię nie tak.
  • REKLAMA
  • #2 15013880
    BlueDraco
    Specjalista - Mikrokontrolery
    A kto niby zatrzymuje i restartuje timer w Twoim programie?
  • REKLAMA
  • #3 15013974
    mitny
    Poziom 13  
    Zatrzymanie timera jest w obsłudze przerwania TIMER1_COMPA_vect w linii
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    W obsłudze przerwania INT0 jest wyzerowanie timera i ponowne uruchomienie.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #4 15014136
    BlueDraco
    Specjalista - Mikrokontrolery
    A od kiedy to zapis
    TIMSK &=~(1<<OCIE1A);
    zatrzymuje timer, a
    TIMSK |= (1<<OCIE1A);
    go startuje?

    Zmień SIGNAL na ISR - prosisz się o kłopoty.
  • #5 15014179
    mitny
    Poziom 13  
    OK - nie zatrzymuje timera ale wyłącza przerwanie więc dla mnie efekt ten sam.
    Jak zamieniłem na wyłączenie preskalera (czyli również timera):
    TCCR1B &=~(1<<CS12);
    i
    TCCR1B |= (1<<CS12);
    To efekt był ten sam. SIGNAL zamieniłem na ISR ale to niczego nie zmienia.
    Jakieś inne pomysły?
  • #6 15014397
    Konto nie istnieje
    Konto nie istnieje  
  • #7 15014499
    mitny
    Poziom 13  
    Ja nie próbuję zbudować kompletnego kitu AVT 2623 tylko wykorzystać moduł sterujący w innym układzie stąd inne wyprowadzenia. Póki co zmontowałem sobie pełen układ wykonawczy oraz na płytce prototypowej elementy sterujące. W moim układzie informacja o przejściu przez 0 jest na PD2 (tak jak w oryginale) natomiast wyjście sterujące jest na PB0. Jeśli chodzi o pozostałe elementy to ich po prostu nie ma – jest tylko mikrokontroler z układem oscylatora.
    W samym programie nie ma sterowania grupowego, nie ma tu w sumie niczego ale to celowe bo chciałem wyeliminować wszystko co nie dotyczyło sterowania fazowego i to chyba widać po kodzie programu.
    Nie rozumiem też dlaczego twierdzisz, że program działa jak wyłącznik na ścianie – mnie się wydaje OK – szczególnie, że pierwsza wersja oparta o delay działa i żarówka rzeczywiście się tylko żarzy. W drugiej wersji opartej o timer w obsłudze przerwania przejścia przez 0 wyłączam triaka, ustawiam timer na 0 i uruchamiam przerwania które zachodzi w momencie zrównania się timera z OCR1A. W obsłudze przerwania timera uruchamiam triaka i wyłączam przerwania z timera. Efekt powinien być taki, że przy przejściu przez 0 triak jest wyłączany i uruchamiany jest timer który po 7ms wywoła przerwanie w obsłudze którego uruchamiam triakia i wyłączam przerwania z timera, następnie znów zachodzi przerwanie z przejścia przez 0 które znów wyłącza triaka i znów zeruje timer i uruchamia przerwania na nim. Ponieważ przerwania z przejścia przez 0 występują co 10ms to faktycznie triak powinien być załączony przez 3ms. Działanie jakie oczekuję widać w pierwszej wersji gdzie w obsłudze przerwania przejścia przez 0 daję 7ms delay, włączam triaka, czekam 3ms i wyłączam triaka – przy czym taki kod zapełnia 100% czasu mikrokontrolera gdyż przerwanie zachodzi co 10ms – ale takie rozwiązanie działa więc sam układ jest poprawnie zmontowany i sterowany.
    Próbowałem też z wyłączeniem preskalera (czyli również timera) ale efekt ten sam:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Być może problem jest bardzo oczywisty i robię jakiś prosty błąd ale go po prostu nie widzę.
  • Pomocny post
    #8 15014567
    Andrzej__S
    Poziom 28  
    Nie wiem, jak dokładnie masz zbudowaną detekcję przejścia przez zero, ale jeśli w programie reagujesz na niewłaściwe zbocze sygnału detekcji, to SWIATLO_OFF może następować za późno.
    Jeśli nie próbowałeś jeszcze na drugim zboczu, to proponuję spróbować.
  • #9 15016236
    mitny
    Poziom 13  
    W końcu znalazłem przyczynę problemów - dzięki sugestii Andrzej__S zweryfikowałem jeszcze raz układ by się na 100% upewnić czy mam wszystko dobrze podłączone i wszystko było OK tylko ja zapomniałem o jednej oczywistej rzeczy - sterowanie oświetleniem odbywa się za pomocą TRIAKA :)
    Gdy załączałem triaka w obsłudze przerwania z timera to jego wyłączenie robiłem dopiero gdy otrzymałem przerwanie przejścia przez 0 a to było już za późno gdyż w rzeczywistości triak nie wyłączał się bo sinusoida już przekroczyła 0 gdy go wyłączałem i mimo mojego sterowania nie wyłączał się nigdy.
    Rozwiązanie było banalnie proste - załączyć triaka w przerwaniu od timera, poczekać moment by się załączył i wyłączyć sterowanie triaka który i tak będzie załączony do momentu przejścia przez 0 w którym to wyłączy się sam.

    Poniżej załączam poprawny kod dla tych którzy trafią na podobny problem.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dziękuję wszystkim za rady - temat do zamknięcia.
  • #10 15016931
    footmanx
    Poziom 11  
    mitny napisz mi jeszcze proszę przed zamknięciem tematu (sam musisz zamknąć temat) jak zrealizowałeś detekcję przejścia przez 0?
    Jeśli dodatnie zbocze -> dodatnia połówka, jeśli z dodatniej w 0 -> zbocze opadające -> dolna połówka? Zatem przerwanie INT sprzętowo obsługuje całość, czy tak?

    Dodam, że bardzo fajnie wyjaśniliście sterowanie triakiem.
  • REKLAMA
  • #11 15017495
    mitny
    Poziom 13  
    Mechanizm detekcji przejścia przez 0 jest na płytce wykonawczej która jest zgodna z kitem AVT2623 więc możesz sobie poczytać - tam jest na końcu tranzystor który wyłącza się gdy napięcie jest poniżej 1.2V a wszystko idzie jeszcze przez transoptora - a wiec ja w mikrokontrolerze mam ciągłe napięcie a gdy jest przejście przez 0 niezależnie od tego czy jest to górna czy dolna połówka sinusoidy to ja dostaję na wejściu 0V i dlatego przerwanie jest oparte o zbocze opadające.
REKLAMA