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

Atmega8 - Regulacja fazowa, 230V, fluktuacje natężenia światła

r0bby 13 Lut 2015 16:13 1995 17
REKLAMA
  • #1 14435097
    r0bby
    Poziom 9  
    Witam,

    Zrobiłem na Atmega8 regulator oświetlenia. W zasadzie wszystko działa, tylko irytuje mnie występująca niewielka fluktuacja natężenia światła. Nic nie mruga, ale jak się uważnie przyjrzeć, to natężenie światła lekko faluje. Na każdym etapie regulacji. AVR taktowany zewnętrznym kwarcem 8MHz. Zmienna light, zmieniana w głównej części programu. Nie mam pomysłu, co może być powodem tych fluktuacji.
    Atmega8 - Regulacja fazowa, 230V, fluktuacje natężenia światła

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 14435348
    nasty_photon
    Poziom 22  
    Pewno zakłócenia wytwarzane podczas załączania triaka wpływają na działanie
    mikrokontrolera. Trzeba obejrzeć zasilanie na oscuyloskopie, dodać jakieś kond. odsprzęgające, ekranować, etc.
  • #3 14435398
    archanoid
    Poziom 26  
    Witam . Po pierwsze jak zadajesz wartość która jest wpisywana do zmiennej light ( pokaż cały kod ) . Po drugie pokaż schemat (jak zasilasz mikrokontroler). Po trzecie prosta próba . Wpisz do zmiennej light na stałe jakąś wartość i zobacz czy światło faluje . Dodatkowi nie podoba mi się detekcja zera . Ja stosuję troszkę rozbudowany ale za to pewny i dokładny .Link
  • #4 14435487
    r0bby
    Poziom 9  
    Niestety, oscyloskopu nie posiadam. Zasilanie ATmegi oba GND na masie i 10nF przy samych nogach między GND i Vcc.

    Co może być złego z tak prostą detekcją zera? Na pewno działa, zlicza do 100Hz.

    Wartość light uzyskiwana jest przez obsługę enkodera - podglądałem tą zmienną na lcd - na pewno sama się nie zmienia. Ale faktycznie, tak jak radzisz, wpisze ja na stałe i zobaczę.

    Próbowałem też stosować zewn. rezystor podciągający na D3, gdyby wewnętrzne podciągnięcie było za słabe, ale jest to samo.
  • REKLAMA
  • #5 14435526
    archanoid
    Poziom 26  
    Witam . Kolego pokaż cały kod . Natomiast kondensatory odsprzęgające powinny być 100nF .
  • #6 14435572
    r0bby
    Poziom 9  
    Jest 100nF - przejęzyczyłem się. Kod jest duży, w kilku plikach. Zamieściłem to co dotyczy regulacji.
  • #7 14435608
    archanoid
    Poziom 26  
    Witam . Jeśli to tylko sama regulacja fazowa + obsługa enkodera to jak duży może być ten kod. Jak obsługujesz enkoder . I jeszcze raz jak zasilasz mikrokontroler . Z zasilacza bez transformatorowego czy z jakiegoś trafka może przetwornica ?.
  • #8 14435639
    r0bby
    Poziom 9  
    To projekt sterownika do terrarium, lcd, czujniki, uart, rtc i się uzbierało. Zasilane jest z ładowarki do telefonu + stabilizator 5V. Faktycznie, może by jakiś elektrolit większy dać na wyjściu z przetwornicy.

    Enkoder obsługiwany w pętli głównej. Inne przerwania w czasie regulacji oświetlenia nie chodzą.
  • #9 14436134
    szelus
    Poziom 34  
    Cytat:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    To nie jest dobre rozwiązanie. Musisz mieć pewność, że wyzwolenie triaka wyłączysz zanim pojawi się zero, a tak istnieje spora szansa, że nie zdążysz i triak wyzwoli się ponownie (w zależności od prędkości obsługi przerwania). Generalnie, zrobiłbym wyłączanie z przerwania od timera po np. 0,1ms od wyzwolenia triaka i ograniczył minimalne wypełnienie do 2-3%.
  • REKLAMA
  • #10 14437076
    r0bby
    Poziom 9  
    szelus napisał:


    To nie jest dobre rozwiązanie. Musisz mieć pewność, że wyzwolenie triaka wyłączysz zanim pojawi się zero, a tak istnieje spora szansa, że nie zdążysz i triak wyzwoli się ponownie (w zależności od prędkości obsługi przerwania). Generalnie, zrobiłbym wyłączanie z przerwania od timera po np. 0,1ms od wyzwolenia triaka i ograniczył minimalne wypełnienie do 2-3%.


    Tak jak piszesz, mogłoby się stać przy wartościach wpisywanych do OCR1L większych niż 80, gdy przeciągnąłbym załączanie triaka na następny półokres, ale pilnuję aby takie wartości się nie pojawiły.

    W poprzednich wersjach wyłączałem prąd bramki po kilku us, ale że i tak chodzi dobrze, skróciłem czas wykonywania przerwania.

    Jutro pokombinuję z zasilaniem i napisze jaki efekt.
  • Pomocny post
    #11 14443046
    szelus
    Poziom 34  
    No, nie zupełnie. Kiedy kończy się półokres, pojawia się zbocze narastające na INT, a moment póżniej sieć przechodzi przez zero. Ciężko oszacować ile wynosi ten "moment", ale jeżeli nie zdążysz wyłączyć sygnału triaka (obsługa przerwania się opóźni itp.) zanim sieć przejdzie przez zero, to triak włączy się ponownie i pozostanie włączony przez cały następny okres.
    [edit]
    Spróbowałem oszacować i i wychodzi mi, że ten "moment" powinien mieć przynajmniej kilkadziesiąt us, więc powinno się wyrabiać bez problemu. Oczywiście o ile nigdzie w programie głównym nie masz blokowanych przerwań na jakąś istotną ilość czasu.
  • Pomocny post
    #12 14443082
    archanoid
    Poziom 26  
    Witam . Dlatego pierwszą instrukcją w przerwaniu INT powinno być wyłączenie triaka i to bez żadnego warunku . Nie wiem czemu ma służyć ten warunek .
  • #13 14443870
    r0bby
    Poziom 9  
    Dziękuję kolegom za zainteresowanie.

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

    jest po to, żeby przy light=0 (pełne światło, brak regulacji) , triak był cały czas włączony.

    Zmieniłem kod w przerwaniu od Timer1 - wyłączam triak po 10us.

    Co do zasilania - przeniosłem zasilanie przekaźników przed stabilizator. Przetwornica ma na wyjściu elektrolit 100uF, więc nic nie dokładałem.

    Niefortunnie albo coś zwarłem przy montażu/demontażu, albo coś zablokowałem przy programowaniu. Procek przestał gadać - czekam na nowy.

    Jak dojdzie, napiszę jaki efekt.
  • #14 14492269
    r0bby
    Poziom 9  
    Walczę dalej: układ roboczo zasilany z USB z PC przez programator MKII. Kody przerwań roboczo uproszczone do:

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


    w main OCR1AL=51 i na pewno nigdzie indziej wartość rejestru nie jest zmieniana. W każdym obiegu pętli głównej odczytywany rtc na PCF8563 i wysyłane dane na lcd.

    Żarówka mryga jak mrygała :( Nie rzuca się to w oczy, ale chyba nie powinno tak być.
  • REKLAMA
  • Pomocny post
    #15 14492845
    szelus
    Poziom 34  
    Spróbuj ewentualnie resetować preskaler łącznie z resetowaniem timera. To wprawdzie ok 1%, więc raczej nie powinno być widać, ale można sprawdzić.
    Domyślam się, że oscyloskopu nie masz?
  • #16 14492960
    r0bby
    Poziom 9  
    BINGO !!!
    Dzięki :) Teraz świeci stabilnie tak na wewnętrznym generatorze RC, jak i kwarcu.

    Jak zacząłem pisać ten program, to na początku resetowałem preskaler, ale potem rozbudowując program i nie widząc różnicy, zrezygnowałem z tego, żeby zminimalizować czas trwania przerwania.

    Bardzo dziękuję :)
  • #17 14493191
    szelus
    Poziom 34  
    Cieszę się, że pomogłem. Pamiętaj, że reset preskalera wpłynie nagatywnie na stabilność timera 0 jeżeli też korzystasz w projekcie.
  • #18 14493269
    r0bby
    Poziom 9  
    Tak, wiem. Dlatego wcześniej usunąłem tą opcję.

    Stary, gdybyś wiedział ile ja egzorcyzmów nad tym układem odprawiałem :)
REKLAMA