Domyślną metodą kontroli napięcia 230 V AC jest kontrola poprzez triak. Tak zrealizowany jest każdy ściemniacz. Kontrola taka oparta jest o kontrolę fazy - triak jest otwierany jedynie na pewną część sinusa napięcia przemiennego.
Zasadniczo można by wykorzystać do takiej kontroli Arduino, które bezpośrednio sterowałoby triakiem, ale niestety jest to rozwiązanie dalekie od idealnego. Arduino jest zdolne otwierać triak na kilka mikrosekund, jednakże nie przekłada się to na ściemnianie sterowanego światła w sposób deterministyczny - musimy otwierać triak w fazie z napięciem w gniazdku, więc potrzebny jest jakiś referencyjny moment w czasie.
Takim momentem odniesienia jest chwila przejścia napięcia przez zero. Z tego powodu konieczne jest zbudowanie detektora przejścia przez zero, który można podpiąć do Arduino czy innego mikrokontrolera, aby informował on układ o tym, że napięcie przemienne właśnie przeszło przez wartość 0 V. W tym momencie układ jest w stanie otwierać triak na znaną liczbę mikrosekund w fazie z sygnałem, co pozwala na sterowanie obciążeniem za triakiem.
Autor przetestował dwa sposoby, na jakie zastosować można triak do sterowania jasnością żarówki 230 V - analogowy i cyfrowy (programowy). Różnią się one realizacją sposobu detekcji przejścia przez zero i sterowania triakiem. Przyjrzyjmy się bliżej rozwiązaniu programowemu, które wykorzystuje mikrokontroler np. Arduino.
Kontrola programowa
Wykorzystany układ detekcji przejścia przez zero, generuje 5 V impuls za każdym razem, gdy sygnał AC przechodzi przez zero. Impulsy 5 V dołączone są do Arduino do wejścia przerwania i wyzwalają program w układzie w precyzyjny sposób. Ogólny algorytm kontroli pokazany jest na poniższym diagramie.
W momencie wykrycia przez zero triak pozostaje jeszcze wyłączony przez dokładnie określony czas t1. Im dłuższy jest czas t1, tym mniej mocy dostarczone zostanie do układu. Po upłynięciu czasu t1 mikrokontroler załącza triak podając napięcie na jego bramkę. Triak pozostaje włączony, nawet po odłączeniu napięcia z bramki - wyłączy się dopiero przy przejściu napięcia zmiennego przez zero (o ile na bramce nie ma wtedy napięcia). Z uwagi na to, nie musimy ściśle monitorować czasu trwania impulsu wyzwalającego bramkę triaka, a jedynie zapewnić, że będzie on się mieścił w połowie okresu sinusa (t3). Dokładniej mówiąc czas trwania impulsu (t2) determinowany jest wymaganiami triaka, ponieważ jeśli będzie on za krótki, triak się nie załączy.
W rezultacie takiego sterowania triakiem otrzymujemy na wyjściu z układu fragment sinusoidy. Im mniejszy jest to fragment, tym mniejsza moc zostaje przekazana na obciążenie - w naszym przypadku żarówkę. Sterowanie takie jest daleką analogią do sterowania PWM dla napięcia stałego.
Aby zrealizować precyzyjnie zależności czasowe na mikrokontrolerze, wykorzystamy jego przerwanie. Napięcie przemienne, z jakim pracujemy, ma częstotliwość 50 Hz, to znaczy, że napięcie przechodzi przez zero, osiąga maksimum, ponownie przechodzi przez zero, osiąga minimum i zbiega do kolejnego przejścia przez zero 50 razy na sekundę. Okres takiego sygnału to 20 milisekund, połowa tego okresu to 10 ms - jest to czas t3 na naszym diagramie.
Układ pokazany na schemacie realizuje właśnie opisane powyżej funkcje. Napięcie sieci - 230 V - podawane jest przez dwa oporniki 30 kΩ na mostek prostowniczy, z którego wychodzi sygnał o podwojonej częstotliwości. Sygnał ten podany jest na transoptor 4N25 - LED w tym układzie mruga z częstotliwością 100 Hz, załączając tranzystor po stronie wtórnej układu - wszystko w fazie z sygnałem w sieci energetycznej. Sygnał wyjściowy z transoptora podawany jest na wejście przerwania Arduino.
Program podczas przerwania generuje impuls odpowiedniej długości, który w zaprogramowanym momencie wyzwala triak. Jeden z pinów wyjściowych Arduino, podłączony jest do optotriaka MOC3021, który steruje triakiem kontrolującym moc na obciążeniu. W szereg z optotriakiem wpięta jest dioda LED, sygnalizująca płynięcie prądu przez bramkę triaka. Zapala się ona tylko na chwilę, podczas załączania triaka przez optotriak, więc nie jest zbyt dobrze widoczna.
Układ można zmodyfikować tak, aby móc sterować nim nie tylko żarówkami, ale np. silnikami. Modyfikacja układu polega na dodaniu rezystora i kondensatora. Prąd bramki jest poniżej 15 mA, więc jeśli używamy do sterowania obciążenia indukcyjnego (jakim jest silnik elektryczny) triaka z mniej czułą bramką, konieczna może być zmiana rezystora w bramce z 2,4 kΩ na 1,2 kΩ, aby zapewnić większy prąd bramki. Przy takiej rezystancji należy pojemność kondensatora zwiększyć do około 200 nF. Układ RC w bramce to tak zwany snubber, który zapewnia tłumienie szpilek wysokiego napięcia, generowanego przez indukcyjność obciążenia. W przypadku pracy z obciążeniem o charakterze nieindukcyjnym układ taki może być problematyczny. Nawet niewielka upływność kondensatora może dawać dostatecznie duży prąd, który będzie załączał triak.
Przyjrzyjmy się teraz oprogramowaniu, które po stronie Arduino steruje opisanym powyżej układem. Oprogramowanie dostaje informacje o przejściu przez zero, następnie musi odczekać ustalony okres czasu i załączyć triak. W Europie częstotliwość napięcia w sieci wynosi 50 Hz, więc jeden okres to 20 ms. Jako że w sinusoidzie są dwa ekstrema i dwa przejścia przez zero w czasie jednego okresu czas, w jakim realizujemy nasz algorytm regulacji to połowa okresu - 10 ms. Tyle właśnie wynosi czas t3 na diagramie.
Nasz algorytm sterujący triakiem musi teraz czekać na przejście sinusa przez zero, odczekać określony czas w okresie 10 ms i wysłać impuls załączający triak. Jeśli poczekamy 5 ms, to do odbiornika dostarczymy równo połowę mocy.
Do sterowania układem wykorzystamy przerwanie. Wyzwalane ono będzie impulsem, informującym mikrokontroler o przejściu sygnału przez zero. Po detekcji zero układ musi odmierzyć określony w programie czas i wysłać impuls załączający triak. Oto jak jest to zrealizowane programowo:
Aby wykorzystać przerwanie, musimy najpierw je skonfigurować. W programie Arduino piszemy:
Dzięki takiej konfiguracji na zboczu narastającym sygnału z detekcji przejścia przez zero uruchomimy funkcję “zero_crosss_int”, która reagować będzie odpowiednio. Przerwanie numer 1, z którego korzystamy znajduje się na pinie numer 3 modułu Arduino.
W funkcji "zero_cross_int", do której przeniesie nas przerwanie musimy zaprogramować oczekiwanie na załączenie triaka i jego wyzwolenie. Dodatkowo chcemy zaimplementować tam pewne funkcje, które pozwolą nam kontrolować nam jasność żarówki (czy moc na obciążeniu) w dyskretnych krokach.
Załóżmy ilość kroków regulatora na 128. Oznacza to, że każdy krok ma 10 ms / 128 = 75 µs (dokładnie 78 µs, ale trzymajmy się wartości 75 µs - omówimy to za chwilę). Czas oczekiwania na załączenie obliczany jest jako 75 x (od 1 do 128) µs. Liczby od 1 do 128 to nasze dyskretne kroki ustawiania mocy. Zadany poziom przekazujemy do funkcji poprzez zmienną "dimming":
int dimming = 128;
Program w napisanym powyżej kodzie oblicza czas, jaki musi minąć od zera do wyzwolenia triaka (dimtime). Następnie odczekuje taki czas i wyzwala triaka impulsem o długości odpowiedniej, aby przeszedł on w stan przewodzenia. Finalnie napięcie na bramce triaka jest wyłączane, aby nie wyzwolić go przypadkiem w kolejnej części sinusoidy. To także częściowo tłumaczy dlaczego do obliczeń wykorzystujemy 75 a nie 78 mikrosekund - ten dodatkowy czas pozwala nam na odczekanie 10 µs z napięciem na triaku przy pewności, że wyłączy się on przy najbliższym przejściu przez zero.
Teraz musimy tylko w głównej pętli programu kontrolować wartość zmiennej dimming, która odpowiadać będzie za jasność naszej żarówki. Testowo możemy wykorzystać prosty algorytm, zaprezentowany poniżej. W pojedynczej pętli for zmienia on jasność w krokach co 1 od 5 do 128:
Jeśli chcemy stworzyć troszkę bardziej zaawansowany kod, możemy do odmierzania czasu wykorzystać timer, zamiast programowej funkcji delay. Jego zasada działania jest bardzo podobna. Program czeka na przejście sygnału przez zero. Po jego wykryciu czeka od 0 do 9090 (10 µs na impuls dla triaka) mikrosekund, załącza napięcie na bramce triaka na 10 mikrosekund i je wyłącza. Triak pozostanie załączony przez cały czas, do następnego przejścia przez zero.
Przy napięciu w gniazdku o częstotliwości 50 Hz sygnał na przerwanie nadchodzi co 10 ms, czyli 10000 µs. Jako że nasz program ma pozwalać na regulację w 128 krokach, to jeden krok odpowiada 75 µs.
Cały opisany powyżej program prezentuje się następująco:
Iterację w głównej pętli programu w teorii zacząć można od zera, nie od 5, ale zasadniczo z uwagi na to, że zależności czasowe w systemie nie są zbyt dokładne - np. przerwanie zajmuje pewien czas, aby się uruchomić etc. - użycie wartości równej 0 (w pełni załączony) może trochę namieszać w systemie. Podobnie sprawa ma się sprawa z wyłączeniem układu - 128 może być problematyczne, ale nie tak bardzo jak 0. Ustalenie tych wartości (tzn. odkąd dokąd realizowana jest regulacja) to kwestia eksperymentów w gotowym układzie.
Źródło: http://alfadex.com/2014/02/dimming-230v-ac-with-arduino-2/
Zasadniczo można by wykorzystać do takiej kontroli Arduino, które bezpośrednio sterowałoby triakiem, ale niestety jest to rozwiązanie dalekie od idealnego. Arduino jest zdolne otwierać triak na kilka mikrosekund, jednakże nie przekłada się to na ściemnianie sterowanego światła w sposób deterministyczny - musimy otwierać triak w fazie z napięciem w gniazdku, więc potrzebny jest jakiś referencyjny moment w czasie.
Takim momentem odniesienia jest chwila przejścia napięcia przez zero. Z tego powodu konieczne jest zbudowanie detektora przejścia przez zero, który można podpiąć do Arduino czy innego mikrokontrolera, aby informował on układ o tym, że napięcie przemienne właśnie przeszło przez wartość 0 V. W tym momencie układ jest w stanie otwierać triak na znaną liczbę mikrosekund w fazie z sygnałem, co pozwala na sterowanie obciążeniem za triakiem.
Autor przetestował dwa sposoby, na jakie zastosować można triak do sterowania jasnością żarówki 230 V - analogowy i cyfrowy (programowy). Różnią się one realizacją sposobu detekcji przejścia przez zero i sterowania triakiem. Przyjrzyjmy się bliżej rozwiązaniu programowemu, które wykorzystuje mikrokontroler np. Arduino.
Kontrola programowa
Wykorzystany układ detekcji przejścia przez zero, generuje 5 V impuls za każdym razem, gdy sygnał AC przechodzi przez zero. Impulsy 5 V dołączone są do Arduino do wejścia przerwania i wyzwalają program w układzie w precyzyjny sposób. Ogólny algorytm kontroli pokazany jest na poniższym diagramie.
W momencie wykrycia przez zero triak pozostaje jeszcze wyłączony przez dokładnie określony czas t1. Im dłuższy jest czas t1, tym mniej mocy dostarczone zostanie do układu. Po upłynięciu czasu t1 mikrokontroler załącza triak podając napięcie na jego bramkę. Triak pozostaje włączony, nawet po odłączeniu napięcia z bramki - wyłączy się dopiero przy przejściu napięcia zmiennego przez zero (o ile na bramce nie ma wtedy napięcia). Z uwagi na to, nie musimy ściśle monitorować czasu trwania impulsu wyzwalającego bramkę triaka, a jedynie zapewnić, że będzie on się mieścił w połowie okresu sinusa (t3). Dokładniej mówiąc czas trwania impulsu (t2) determinowany jest wymaganiami triaka, ponieważ jeśli będzie on za krótki, triak się nie załączy.
W rezultacie takiego sterowania triakiem otrzymujemy na wyjściu z układu fragment sinusoidy. Im mniejszy jest to fragment, tym mniejsza moc zostaje przekazana na obciążenie - w naszym przypadku żarówkę. Sterowanie takie jest daleką analogią do sterowania PWM dla napięcia stałego.
Aby zrealizować precyzyjnie zależności czasowe na mikrokontrolerze, wykorzystamy jego przerwanie. Napięcie przemienne, z jakim pracujemy, ma częstotliwość 50 Hz, to znaczy, że napięcie przechodzi przez zero, osiąga maksimum, ponownie przechodzi przez zero, osiąga minimum i zbiega do kolejnego przejścia przez zero 50 razy na sekundę. Okres takiego sygnału to 20 milisekund, połowa tego okresu to 10 ms - jest to czas t3 na naszym diagramie.
Układ pokazany na schemacie realizuje właśnie opisane powyżej funkcje. Napięcie sieci - 230 V - podawane jest przez dwa oporniki 30 kΩ na mostek prostowniczy, z którego wychodzi sygnał o podwojonej częstotliwości. Sygnał ten podany jest na transoptor 4N25 - LED w tym układzie mruga z częstotliwością 100 Hz, załączając tranzystor po stronie wtórnej układu - wszystko w fazie z sygnałem w sieci energetycznej. Sygnał wyjściowy z transoptora podawany jest na wejście przerwania Arduino.
Program podczas przerwania generuje impuls odpowiedniej długości, który w zaprogramowanym momencie wyzwala triak. Jeden z pinów wyjściowych Arduino, podłączony jest do optotriaka MOC3021, który steruje triakiem kontrolującym moc na obciążeniu. W szereg z optotriakiem wpięta jest dioda LED, sygnalizująca płynięcie prądu przez bramkę triaka. Zapala się ona tylko na chwilę, podczas załączania triaka przez optotriak, więc nie jest zbyt dobrze widoczna.
Układ można zmodyfikować tak, aby móc sterować nim nie tylko żarówkami, ale np. silnikami. Modyfikacja układu polega na dodaniu rezystora i kondensatora. Prąd bramki jest poniżej 15 mA, więc jeśli używamy do sterowania obciążenia indukcyjnego (jakim jest silnik elektryczny) triaka z mniej czułą bramką, konieczna może być zmiana rezystora w bramce z 2,4 kΩ na 1,2 kΩ, aby zapewnić większy prąd bramki. Przy takiej rezystancji należy pojemność kondensatora zwiększyć do około 200 nF. Układ RC w bramce to tak zwany snubber, który zapewnia tłumienie szpilek wysokiego napięcia, generowanego przez indukcyjność obciążenia. W przypadku pracy z obciążeniem o charakterze nieindukcyjnym układ taki może być problematyczny. Nawet niewielka upływność kondensatora może dawać dostatecznie duży prąd, który będzie załączał triak.
Przyjrzyjmy się teraz oprogramowaniu, które po stronie Arduino steruje opisanym powyżej układem. Oprogramowanie dostaje informacje o przejściu przez zero, następnie musi odczekać ustalony okres czasu i załączyć triak. W Europie częstotliwość napięcia w sieci wynosi 50 Hz, więc jeden okres to 20 ms. Jako że w sinusoidzie są dwa ekstrema i dwa przejścia przez zero w czasie jednego okresu czas, w jakim realizujemy nasz algorytm regulacji to połowa okresu - 10 ms. Tyle właśnie wynosi czas t3 na diagramie.
Nasz algorytm sterujący triakiem musi teraz czekać na przejście sinusa przez zero, odczekać określony czas w okresie 10 ms i wysłać impuls załączający triak. Jeśli poczekamy 5 ms, to do odbiornika dostarczymy równo połowę mocy.
Do sterowania układem wykorzystamy przerwanie. Wyzwalane ono będzie impulsem, informującym mikrokontroler o przejściu sygnału przez zero. Po detekcji zero układ musi odmierzyć określony w programie czas i wysłać impuls załączający triak. Oto jak jest to zrealizowane programowo:
Aby wykorzystać przerwanie, musimy najpierw je skonfigurować. W programie Arduino piszemy:
Code: c
Dzięki takiej konfiguracji na zboczu narastającym sygnału z detekcji przejścia przez zero uruchomimy funkcję “zero_crosss_int”, która reagować będzie odpowiednio. Przerwanie numer 1, z którego korzystamy znajduje się na pinie numer 3 modułu Arduino.
W funkcji "zero_cross_int", do której przeniesie nas przerwanie musimy zaprogramować oczekiwanie na załączenie triaka i jego wyzwolenie. Dodatkowo chcemy zaimplementować tam pewne funkcje, które pozwolą nam kontrolować nam jasność żarówki (czy moc na obciążeniu) w dyskretnych krokach.
Załóżmy ilość kroków regulatora na 128. Oznacza to, że każdy krok ma 10 ms / 128 = 75 µs (dokładnie 78 µs, ale trzymajmy się wartości 75 µs - omówimy to za chwilę). Czas oczekiwania na załączenie obliczany jest jako 75 x (od 1 do 128) µs. Liczby od 1 do 128 to nasze dyskretne kroki ustawiania mocy. Zadany poziom przekazujemy do funkcji poprzez zmienną "dimming":
int dimming = 128;
Code: c
Program w napisanym powyżej kodzie oblicza czas, jaki musi minąć od zera do wyzwolenia triaka (dimtime). Następnie odczekuje taki czas i wyzwala triaka impulsem o długości odpowiedniej, aby przeszedł on w stan przewodzenia. Finalnie napięcie na bramce triaka jest wyłączane, aby nie wyzwolić go przypadkiem w kolejnej części sinusoidy. To także częściowo tłumaczy dlaczego do obliczeń wykorzystujemy 75 a nie 78 mikrosekund - ten dodatkowy czas pozwala nam na odczekanie 10 µs z napięciem na triaku przy pewności, że wyłączy się on przy najbliższym przejściu przez zero.
Teraz musimy tylko w głównej pętli programu kontrolować wartość zmiennej dimming, która odpowiadać będzie za jasność naszej żarówki. Testowo możemy wykorzystać prosty algorytm, zaprezentowany poniżej. W pojedynczej pętli for zmienia on jasność w krokach co 1 od 5 do 128:
Code: c
Jeśli chcemy stworzyć troszkę bardziej zaawansowany kod, możemy do odmierzania czasu wykorzystać timer, zamiast programowej funkcji delay. Jego zasada działania jest bardzo podobna. Program czeka na przejście sygnału przez zero. Po jego wykryciu czeka od 0 do 9090 (10 µs na impuls dla triaka) mikrosekund, załącza napięcie na bramce triaka na 10 mikrosekund i je wyłącza. Triak pozostanie załączony przez cały czas, do następnego przejścia przez zero.
Przy napięciu w gniazdku o częstotliwości 50 Hz sygnał na przerwanie nadchodzi co 10 ms, czyli 10000 µs. Jako że nasz program ma pozwalać na regulację w 128 krokach, to jeden krok odpowiada 75 µs.
Cały opisany powyżej program prezentuje się następująco:
Code: c
Iterację w głównej pętli programu w teorii zacząć można od zera, nie od 5, ale zasadniczo z uwagi na to, że zależności czasowe w systemie nie są zbyt dokładne - np. przerwanie zajmuje pewien czas, aby się uruchomić etc. - użycie wartości równej 0 (w pełni załączony) może trochę namieszać w systemie. Podobnie sprawa ma się sprawa z wyłączeniem układu - 128 może być problematyczne, ale nie tak bardzo jak 0. Ustalenie tych wartości (tzn. odkąd dokąd realizowana jest regulacja) to kwestia eksperymentów w gotowym układzie.
Źródło: http://alfadex.com/2014/02/dimming-230v-ac-with-arduino-2/
Cool? Ranking DIY