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

Sterownik fazowo grupowy sterowanie IR NEC na TINY13 AVR ASM źródło

bobeer 18 Lip 2012 23:23 4660 0
  • Temat sterowania napięciem sieciowym za pomocą triaka jest jednym z tych, które zapewne nigdy się nie skończą puki istnieć będzie sieć energetyczna oraz potrzeba włączania i regulacji napięcia odbiorników do niej podłączonych. Najbardziej znaną i najprostszą metodą regulacji mocy dostarczonej do odbiornika jest załączanie triaka sterującego w odpowiedniej fazie podczas trwania każdego półokresu napięcia zmiennego. Można również włączać i wyłączać triak w odpowiednich proporcjach czasowych analogicznie jak dla PWM, w drugim przypadku dla uzyskania rozdzielczości 8bit potrzebne jest 256 półokresów napięcia co przekłada się na czas jednego cyklu regulacji równy 256/100 sekundy. Drugi sposób nie nadaje się do regulacji jasności żarówek z powodu widocznego migania z częstotliwością jw. Poniżej opisany regulator docelowo służył do sterowania obciążenia rezystancjynego (grzałki) o mocy 600W, mimo to w programie sterującym zostały zaimplementowane obydwa sposoby regulacji, umożliwiając równoczesną regulację fazy załączenia triaka oraz proporcje czasu wł/wył czyli jak się zwykło nazywać regulację grupową.
    Głównym celem projektu było sprawdzenie możliwości małego mikrokontrolera ATTINY13 oraz trochę większego programisty ;) - Napisanie zwartego programu który będzie zawierał wszystkie zaplanowane wcześniej funkcje (regulacja fazowa +-, regulacja grupowa +-, zapamiętywanie i odtwarzanie ustawień z 10 pamięci itp.). Drugi cel to próba miniaturyzacji, oraz użycia jak najmniejszej niezbędnej do prawidłowego działania ilości elementów.
    Słów kilka o programie. Do „komunikacji” z urządzeniem używany jest dowolny pilot w standardzie NECa. W związku z tym procesor posiada program umożliwiający odbioru ramek z pilota, oraz sprawdzania ich poprawności (zawsze pierwszy bajt danych jest negatywem drugiego). Na samym wstępie należy wywołać program przypisujący funkcje poszczególnym klawiszom pilota IR. Na schemacie jest zaznaczony przycisk zwierający do masy (lub +VCC) port procesora i włączający program konfiguracyjny (możliwe do tego celu jest również użycie portu reset, jednak nie ma większego sensu zużywanie dodatkowego wyprowadzenia procesora). Przejście w tryb programowania klawiszy jest sygnalizowany miganiem diody led oraz 5 beepami z buzera. Po tym należy kolejno wcisnąć 16 klawiszy o znaczeniach opisanych poniżej (programowanie od 16 do 1):

    16-zarezerwowane dla dodatkowych funkcji w innych wersji programu
    15- M - Pamięć, przycisk umożliwiający zapisanie ustawień do pamięci eeprom
    14- Regulacja grupowa +
    13- Regulacja grupowa -
    12-Regulacja fazowa +
    11-Regulacja fazowa -
    10-1 – Przyciski wyboru ustawień z pamięci eeprom (numer wybranej pamięci)
    Wyjście z programowania jest możliwe w każdej chwili przez procedure identyczną z wejściową.

    W celu zapisania ustalonych mocy pod wybrany klawisz, najpierw należy nacisnąć przycisk M.




    Dodatkowo program w 5 sekund po naciśnięciu jakiegokolwiek klawisza zapisuje do eeprom aktualne parametry mocy oraz wartość OSCCAL które przywracane są po powrocie napięcia zasilania. Przyciśnięcie klawiszy pilota jest sygnalizowane sygnałem z buzera, odpowiednio do funkcji jaką pełni (np. przycisk pamięć sygnalizowana jest dwoma beepami, zapis do pamięci 3xbeep itp.). Osiągnięcie granicy (moc minimalna/maksymalna) również jest sygnalizowana akustycznie. Odebranie poprawnej ramki z pilota jest sygnalizowane zaświeceniem na krótko diody led która domyślnie wskazuje poziom mocy (dla regulatora fazowego). Czas świecenia diody jest proporcjonalny do mocy. Moc maksymalna dioda świeci, ½ mocy = ½ wypełnianie świecenia diody. Moc wyłączona dioda tylko błyska z częstotliwością dwa razy mniejszą niż podczas pracy z mocą >0. Dodatkowo w każdym cyklu PWM led na porcie diody jest wysyłane kilkanaście ramek danych z programu uarttx z prędkością 9600b/s.
    W tym miejscu chcę wspomnieć o procedurze automatycznego strojenia generatora zegara procesora. Jak widać na schemacie procesor otrzymuje informacje o początku każdego półokresu napięcia na porcie PCINT3 (współdzielony z przyciskiem setup). Przerwanie tego portu jest ustawione na aktywację zboczem narastającym oraz opadającym co w konsekwencji powoduje wywołanie przerwania przy każdym początku/końcu połówki napięcia. Pewnym mankamentem jest fakt nie idealnej symetryczności tak zbudowanego wykrywacza przejścia przez zero napięcia sieci (zasilanie procesora ~4V= detekcja zera na poziomie +2V wzgledem masy / N). W praktyce nie wynikły większe trudności z tym związane, jednak program obliczający czasy do strojenia oscylatora wykorzystuje tylko jeden półokres w każdym cyklu, w innym razie różniące się pomiary czasu (czas między przerwaniami pcint) miałyby wpływ na stabilność strojenia. Strojenie generatora polega na korygowaniu wartości OSCCAL zależnie od wartości timera TCNT0 który to jest zerowany wraz z jego preskalerem z każdym wywołaniem przerwania PCINT. Jeżeli zliczeń jest mniej niż stała 'tuneval1' OSCCAL jest inkremetnowany, analogicznie dekrementowany jeśli TCNT0> 'tuneval2'. Po dostrojeniu wartość OSCCAL utrzymuje się na poziomie wartości 50dec co odpowiada częstotliwości zegara procesora około 7MHz.
    Konsekwencją automatycznego strojenia, oraz stabilnej częstotliwości jest praca w szerokim zakresie temperatur, oraz brak widocznego (nawet minimalnego migotania) podczas sterowania fazowego żarówki. Timer TCNT0 jest równocześnie wykorzystywany jako czasomierz do odmierzania czasu podania impulsu załączającego triak. Jako użyteczne dla pewnego załączenia triaka dla każdej połówki napięcia ustaliłem wartości czasów opóźnienia 20-210, jednak mogą one się różnić w zależności od czułości triaka oraz wartości/typu obciążenia. Odpowiednia wartość opóźnienia ładowana jest do rejestru OCR0A, co powoduje wywołanie programu obsługi przerwania sterującego triakiem w ustalonych odstępach czasu od wywołania przerwania PCINT (przejścia przez zero napięcia sieci).
    Tutaj wspomnę o pierwszej wersji regulatora, gdzie triak był sterowany przez optotriak MOC3022 co wymagało generowania impulsów o długości minimum 120us skutkiem czego przerwanie triaka było uruchamiane dwa razy w każdej połówce, pierwszy raz żeby podać prąd na optotriak, następnie aby go wyłączyć. (W wersji z optotriakiem zasilacz beztransformatorowy dostarczał max 10mA prądu {kondenstator szeregowy 330nF} co wymuszało racjonalne dozowanie prądu, w przypadku optotriaka, aby go pewnie załączyć potrzeba min 10mA, i nieopatrzne pozostawienie go „pod wpływem prądu sterującego” na dłuższy czas skutkowało by zbyt dużym spadkiem napięcia zasilającego i niestabilnym działaniem systemu). Docelowo udało się pozbyć optotriaka i sterować triak BT136 z użyciem tylko wzmacniacza prądowego, za to impulsami o znacznie krótszym czasie (~1us). Niestety nie zmieniło to faktu, iż triak sterujący 0.6kW obciążenie nadal potrzebował tak dużo prądu, iż koniecznym stało się wymienienie kondensatora zasilacza na 1uF. Co ciekawe przy 100W żarówce triak pobierał znacznie mniej mocy sterującej. (Dla wyjaśnienia tego zjawiska musiałbym użyć oscyloskopu, co zapewne jeszcze uczynię, tymczasem może znajdzie się ktoś chętny wyjaśnienia tego fenomenu :) ? ). Na zakończenie omawiania programów wykonywanych w przerwaniach wspomnę o przerwaniu OVF0 które jest wywoływane w przypadku „przewinięcia” TCNT0. W programie tym jest ustawiana dodatkowa flaga bit w rejestrze r31. Bit ten jest wykorzystywany w „programie strojeniowym”. Drugą funkcją tego podprogramu jest rozpoznawanie zaniku przerwań PCINT wywołanych wciśnięciem przycisku sprzętowego, oraz skok do programu 'setup'.
    Jak można zauważyć wszystkie funkcje związane z obsługą sterowania triaka i odmierzania czasów wykonują się w przerwaniach, są na tyle krótkie, że nie wpływają praktycznie na pracę programu odpowiedzialnego za odbiór ramek z pilota IR, dodatkowo pozostaje mnóstwo czasu procesora na wykonywanie czasowo mniej krytycznych funkcji programu. Właściwie program główny większość swojego czasu spędza na pustej pętli oczekując stanu niskiego na wejściu portu podłączonego do odbiornika podczerwieni. Żeby w programie głównym nie było całkiem nudno, synchronicznie do wyświetlania poziomu mocy na LED, na tymże porcie są dostępne szeregowo transmitowane dane o wartości mocy oraz OSCCAL. Transmisja trwa bardzo krótko i nie wpływa na czytelność PWM diody LED.

    Ponieważ omawianie ze szczegółami całości programu zajeło by sporo miejsca, na zakończenie przybliżę nieco program odbierający dane z pilota IR. Program zaczyna się od pętli oczekującej stanu wysokiego na porcie. Po nadejściu stanu wysokiego jego długość jest mierzona, i na tej podstawie ustalane jest, czy interpretować ramkę jako dane, czy tylko jako repcode (impuls oznaczający trzymanie przycisku). Dodatkowo ustawiany jest odpowiedni bit w rejestrze R18 który przez cały czas służy jako rejestr stanu programu odbioru IR zawierając informacje na temat poprawności danych, rodzaju błędu odbioru itp. Po zakończeniu impulsu startującego ramkę program przechodzi do kolejnego etapu w którym są mierzone czasy między impulsami. Na podstawie odległości są interpretowane bity 0 lub 1.( Zainteresowanych szczegółami standardu odsyłam do dokumentacji transmisji pilotów w standardzie NEC) Każda pełna ramka kodu zawiera 32bity danych które są wpychane za pomocą ROL w rejestry R8-R11. Następnie są porównywane pierwszy i drugi bajt odebranych danych. W przypadku prawidłowej transmisji bajty te są wzajemnie uzupełnieniem (operacja EOR daje 255 , oczywiście tak prosty test nie wyklucza możliwości błędu kolejnych nie testowanych bajtów). Dla ułatwienia przyjmujemy, że ramka która przeszła ten test pozytywnie jest uznawana za bezbłędną i można ustawić flagę poprawnego odbioru w R18.
    Cały program obsługujący regulator udało się napisać bez używania dodatkowego ram-u. Wszystkie operacje na pamięci przebiegają w obrębie 32 rejestrów ogólnego przeznaczenia. Praktycznie cały ram jest dostępny na potrzeby stosu który nie powinien zająć więcej niż 16 bajtów. Zawdzięczamy to min. nie używaniu rozkazów PUSH POP. W pamięci ROM pozostaje 10% miejsca na rozbudowę do kolejnej wersji, która będzie miała możliwość sterowania niezależnie dwu triaków (pozostaje do tego celu przerwanie OCR0B).

    Schemat przedstawia część sprzętową urządzenia która jest tak prosta i standardowa, iż praktycznie nie ma o czym mówić :) . Należy jedynie pamiętać o ograniczonej wydajności zasilacza w takim rozwiązaniu, i nie czerpaniu zbyt dużych prądów np. zmniejszając rezystor sterujący diodę LED. Urządzenie zrealizowałem tymczasowo na płytce uniwersalnej, jednak tym razem daruje sobie zamieszczania jej zdjęć.

    Zamieszczam za to źródło programu, który mam nadzieje będzie pomocny osobom zaczynającym przygodę z programowaniem w ASM. Mam nadzieję, że nie będę musiał czytać więcej na forum, że komuś żarówka przygasa na czas odbioru ramki z pilota IR ;)



    Sterownik fazowo grupowy sterowanie IR NEC na TINY13 AVR ASM źródło


    Fajne! Ranking DIY
  • Elmark