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

[Rozwiązano] Ściemniacz - czyli jak zsynchronizować sygnał PWM z zasilaniem sieciowym 230V

29 Lis 2015 19:52 2355 4
  • Poziom 5  
    Witam wszystkich

    Mam pewien problem ze stworzeniem ściemniacza. Problem jest tego rodzaju, że nie mogę zsynchronizować sygnału PWM pochodzącego z RPi z siecią w celu zapalenia żarówki. Ogólnie rzecz biorąc układ skonstruowany jest następująco:

    1) Układ detekcji zera sieci - wykorzystałem do tego transoptor PC814, schemat jak na rys. poniżej.
    Ściemniacz - czyli jak zsynchronizować sygnał PWM z zasilaniem sieciowym 230V

    Ma za zadanie, ustawić stan "wysoki" na wejściu Maliny w momencie gdy następuje przejście sinusoidy przez 0. Kiedy półfala jest dodatnia lub ujemna napięcie +3V płynie do masy i wtedy na wejściu jest stan niski. Tutaj jest wszystko okey, gdyż otrzymuje "szpilki" kiedy półfala przechodzi przez 0 i ustawia się stan wysoki na wejściu, a w innym przypadku jest w stanie niskim.


    2) Układ wykonawczy ściemniacza - W tym przypadku wykorzystuje dwa elementy. Optotriak MOC 3021 oraz triak BTA16 - 600C. Schemat połączenia pokazany na kolejnym rysunku. ( Na obrazku są inne elementy, ale połączenia są takie same )
    Ściemniacz - czyli jak zsynchronizować sygnał PWM z zasilaniem sieciowym 230V

    Tutaj na wejście MOC 3021 pojawia się sygnał PWM pochodzący od RPi, który "rozpoczyna" proces zadziałania żarówki z odpowiednią mocą (w zależności od szerokości impulsu). Sprawa jest tego typu, kiedy załączy się układ, PWM nie jest zsynchronizowany z siecią i następuje wyzwolenie w nieodpowiednim momencie. PWM powinien być wyzwalany, kiedy następuje przejście przez 0 sieci.

    Z pomocą miał mi przyjść wspomniany w pkt. 1 układ detekcji zera sieci. Jednak po napisaniu krótkiego kodu w Pythonie okazało się że nie jest tak kolorowo. Niestety nie mam zrzutów z oscyloskopu, aby dokładnie pokazać jak to wszystko wygląda. Podejrzewam że układ pod względem elektrycznym jest w porządku, gdyż pojawia się to czego oczekiwałem. Moim zdaniem problem jest z napisanym kodem, albo w ogóle z czymś innym o czym nie mam pojęcia.

    Wracając do Pythona. Zamieszczam dwa screeny z utworzonych kodów do sterowania przedstawionym układem.
    Ściemniacz - czyli jak zsynchronizować sygnał PWM z zasilaniem sieciowym 230V Ściemniacz - czyli jak zsynchronizować sygnał PWM z zasilaniem sieciowym 230V

    Pierwszy kod jest bardzo prosty. Kiedy pojawia się stan wysoki (pochodzący od układu detekcji zera sieci) następuje wyzwolenie PWM o szerokości impulsu 50%.
    Drugi kod również nie jest skomplikowany. Użyłem w nim przerwania. Zarówno ze zboczem opadającym czy narastającym. Zauważyłem że tak jakby ignorowany jest warunek detekcji zera, i PWM wyzwala się w momencie uruchomienia skryptu. Zarówno dla jednego jak i drugiego kody dzieje się tak samo.

    Wspierałem się innym projektem, gdzie były wykorzystywane te elementy które omówiłem, jednak był to projekt robiony na mikrokontrolerze ATmega. Stąd moja pewność że układy są w porządku.

    Może ktoś z was wie co może być nie tak, lub ma pomysł co można byłoby z tym jeszcze zrobić/poprawić. Liczę na waszą pomoc, gdyż walczę z tym od 3 miesięcy próbując już różnych sposobów.

    W razie niejasności proszę pytać, gdyż mogłem o czymś zapomnieć napisać lub za bardzo zagmatwać problem :)
  • Moderator Mikrokontrolery Projektowanie
    Ogólnie triak musisz wyzwolić sterując odpowiednio pinem IO, a nie przebiegiem PWM. Kolejny problem to czas - mówimy o precyzji wyzwalania rzędu kilku mikrosekund. W RPi z linuksem na pokładzie raczej programowo nie uzyskasz stosownej rozdzielczości, ani dokładności. Jeśli już by to miało działać, to trzeba by wszystko napisać jako moduł jądra, albo nadać jakiś kosmiczny priorytet. Tego typu rzeczy łatwiej zrobić przy pomocy prostych mikrokontrolerów. Np. użyj jakiegoś prostego ATTiny do którego wysyłaj pożądaną jasność z RPi, a ten mały MCU zajmie się resztą. Wymagać to będzie banalnego programu w C.
  • Poziom 5  
    Co masz na myśli mówiąc sterując pinem, a nie przebiegiem PWM? Myślałem że poprzez wyzwalanie PWM w odpowiednim momencie i o odpowiedniej szerokości impulsu uzyska się przebiegi wyjściowe jak dla klasycznego ściemniacza. A po drugie mam rozumieć że wykonanie tego na RPi jest raczej niemożliwe lub zbyt skomplikowane ?
  • Moderator Mikrokontrolery Projektowanie
    PWM ma swój okres i samego PWM nie zsynchronizujesz z siecią. Normalnie sterowanie ściemniaczem robi się przez impuls wyzwalany z regulowanym opóźnieniem po wykryciu detekcji przejścia przez zero. Ponieważ pomiędzy przejściem przez zero a impulsem musi upłynąć ściśle określony czas, z dokładnością po dziesiątek mikrosekund w systemie wielozadaniowym jest to trudne. Jak masz niski priorytet to inny wątek może cię w międzyczasie wywłaszczyć, a i wysoki priorytet nie gwarantuje, że sterowanie natychmiast przejdzie do twojego wątku. Takie rzeczy jak już to można robić w RTOS. Nie twierdzę, że na RPi to niemożliwe, ale raczej nie zrobisz tego w Pythonie pisząc zwykłą apkę. Trzebaby zrobić jakiś sterownik pracujący w trybie jądra. Dlatego o wiele prościej to zrobić przy pomocy zewnętrznych układów. Mikrokontroler za 2-3 złote zrobi to o wiele lepiej i będzie prościej.
  • Poziom 5  
    Rozumiem. Szczerze mówiąc to rozpatrywałem zrobić na oddzielnym układzie mikroprocesorowym, ale miałem nadzieje że jednak na tym też da radę bez większego problemu to zrealizować. Dzięki za pomoc :)