Mirley - Elektronika i Programowanie
projekty, programy... wszystko o elektronice
M
RSS FB TW G+
Cyfrowy Wyłącznik Wielokanałowy
Sierpień 11, 2016 Sterowniki
M008A
10.00
PLN
szczegóły...
Main thumb Projekt jest sterownikiem włącz/wyłącz, który potrafi sterować dziesięcioma urządzeniami za pomocą praktycznie dowolnych układów wykonawczych. Każde z wyjść może pracować w kilku trybach, umożliwiając sterowanie czasowe, cykliczne z ustalonym czasem pracy i przerwy, monostabilne podtrzymanie stanu na określony czas, bądź w końcu manualne włącz/wyłącz. Układ modelowy pracuje na stałe wmontowany w biurko i ma za zadanie głównie sterować pracą lamp, drukarki oraz wentylatora. Wyłącznik zbudowany jest w oparciu o popularny i tani mikrokontroler ATMega8 oraz garść elementów dyskretnych. Dwustronny montaż płytki umożliwia przykręcenie sterownika do panelu przedniego w dowolnej obudowie. Ze względu na uniwersalność wyjść na płytce nie umieszczono żadnych układów wykonawczych. W układzie przewidziano za to miejsce dla konwertera MAX485 co umożliwia komunikację wyłącznika z komputerem i sterowanie jego funkcjami za pomocą specjalnie do tego celu przygotowanej aplikacji. Pomimo iż wszystkie funkcje sterowania wyjściami realizowane są w sposób sprzętowy, konfiguracji trybów pracy każdego z wyjść i synchronizacji czasu na urządzeniu można dokonać jedynie z poziomu aplikacji.

Działanie:

Schemat ideowy wyłącznika został przedstawiony na rysunku 1. Sercem układu jest mikrokontroler U3 (ATMEGA8-PU), pracujący z rezonatorem kwarcowym X1 (16MHz). Kondensatory C5-C6 (22pF) zapewniają poprawną pracę rezonatora kwarcowego.
Kup Teraz! - Płytki, Elementy, uC …Pokaż Cennik Pokaż na Allegro
Rezystor R3 (10k) zapewnia poprawną polaryzację nóżki resetu podczas normalnej pracy mikrokontrolera, natomiast złącze PROG1 (AVRPROG) umożliwia programowanie bez wyjmowania U3 z podstawki.
Rysunek 1: Schemat Ideowy
Sterowanie stanami wyjść odbywa się za pomocą przycisków chwilowych SW1-SW10 (uSw 12mm), które zostały podłączone do pinów mikrokontrolera poprzez prosty dekoder zbudowany na diodach D11-D22 (1N4148). Dzięki temu do odczytu stanu 10 klawiszy wymagane są tylko 4 linie wejściowe U3. Na wyjściach zastosowano szeregowe połączenie rezystorów R5-R14 (100R) z odpowiadającymi im diodami D1-D10 (LED). Stanem aktywnym na wyjściach jest stan niski ale można to łatwo zmienić zmieniając polaryzację diod D1-D10. Taka konstrukcja wyjść pozwala w prosty sposób podłączyć układy wykonawcze w postaci optotriaków (między +5V a danym wyjściem). Złączami wyjściowymi są GP4 (NS25-W4), GP5 (NS25-W4) i GP6 (NS25-W2).
Napięcie zasilające, podłączone do złącza GP1 (NS25-W2), filtrowane jest za pomocą C2 (100uF/25V), C3 (100uF/25V) oraz C4 (100nF). Kondensatory te są jednocześnie krytyczne dla poprawnej pracy stabilizatora U1 (7805). Dodatkowe gniazdo GP2 (NS25-W2), stanowi wyjście napięcia zasilającego, które może się przydać do polaryzacji układów wykonawczych. Układ U2 (MAX485) to konwerter RS485, zapewniający odpowiednią translację standardu elektrycznego sygnałów między TTL (0-5V) a szyną RS485. Kondensator C1 (100nF) filtruje napięcie zasilania układu U2. Rezystor R2 (120R), montowany w przypadku gdy wyłącznik jest ostatnim urządzeniem na magistrali, zapewnia poprawną terminację magistrali. Rezystory R1 (510R) i R4 (510R) (opcjonalne) zapewniają polaryzację magistrali RS485 wyprowadzonej na złącze GP3 (NS25-W2).

Budowa:

Płytkę drukowaną (warstwa od strony druku) można pobrać tutaj. Jej odbicie lustrzane można znaleźć tutaj. Pomocą w montażu płytki od strony druku (od spodu) będzie rysunek dostępny tutaj, natomiast montowanie płytki od strony elementów (od góry) warto oprzeć o rysunek dostępny tutaj.
Kup Teraz! - Płytki, Elementy, uC …Pokaż Cennik Pokaż na Allegro
Budowa sterownika jest dość nietypowa jak na układy z płytką jednostronną - część komponentów lutowana jest od strony druku. W pierwszej kolejności jednak należy zająć się komponentami montowanymi klasycznie od strony elementów. Na początku lutujemy pięć zworek, pozostałe oznaczone miedzy wyprowadzeniami przycisków pomijamy, gdyż załatwią to same przyciski na późniejszym etapie montażu. Dalej montujemy wszystkie rezystory, diody (nie LED) i kondensatory ceramiczne, a następnie pozostałe komponenty. Pod układy U2 i U3 dobrze jest zastosować podstawki. Dla prostych zastosowań nie są wymagane komponenty U2, C1, R2, oraz GP3 - lutujemy je tylko wtedy gdy chcemy sterować układem z zewnątrz za pomocą komputera. Elementy R1 i R4 są dodane na wyrost, nie montujemy ich w typowych warunkach pracy.
Dalszy etap montażu jest bardziej skomplikowany i wymaga nieco wprawy. Wszystkie pola lutownicze od przycisków SW1-SW10 oraz diod D1-D10 należy obowiązkowo pokryć grubszą warstwą cyny. Lutowanie zaczynamy od przycisków, gdyż one ustalą potem wysokość montowania diod. Należy je tak przylutować aby wystawały nieco ponad przyciski, które będą docelowo na równi z obudową. Należy pamiętać aby wszystkie nóżki każdego z przycisków zostały dobrze przylutowane. Nie tylko ze względu na wytrzymałość mechaniczną ale także ze względu na fakt że wyprowadzenia przycisków zapewniają ciągłość połączeń na płytce.

Programowanie:

Program został napisany w dobrze znanym programie BASCOM AVR . Zajmuje on obecnie 58% dostępnej pamięci mikrokontrolera. Poniżej przedstawione są jedynie ciekawe fragmenty podstawowej wersji programu. Protokół komunikacyjny do przesyłania danych po RS485 Zostanie opisany w osobnym artykule.

Procedura odczytu klawiatury:
Buttons:
  Sw = Sw_port And &B00111001
  Sw.6 = Sw.0
  Shift Sw , Right , 3
 'Sw =     S0 | SCK | MISO | MOSI

  If Sw <> 15 And SwState = Sw Then
    If SwCounter < 1000 Then Incr SwCounter
    If SwCounter = 15 Then
      Select Case SwState
        Case &B00001001: SwChn = 4'Out0, Sw1, PC CH4 
        Case &B00001011: SwChn = 9'Out1, Sw2, PC CH9  
        Case &B00001010: SwChn = 8'Out2, Sw3, PC CH8
        Case &B00001101: SwChn = 3'Out3, Sw4, PC CH3
        Case &B00001100: SwChn = 2'Out4, Sw5, PC CH2
        Case &B00000011: SwChn = 7'Out5, Sw6, PC CH7
        Case &B00001110: SwChn = 6'Out6, Sw7, PC CH6
        Case &B00000101: SwChn = 1'Out7, Sw8, PC CH1 
        Case &B00000110: SwChn = 0'Out8, Sw9, PC CH0
        Case &B00000111: SwChn = 5'Out9, Sw10, PC CH5       
      End Select
      If ChnModes(SwChn+1) <> 1 Then
        Toggle OutState.SwChn
        CycleMinCnt(SwChn+1)=0'Clear cycle counters
        CycleSecCnt(SwChn+1)=0
        Set GlobFlags.1 'Set "Outs changed" flag
        Reset GlobFlags.0'Clears "Device reseted" flag
        Gosub UpdateOuts
      End If
    End If
    If SwCounter = 750 Then
      ChnModes(SwChn+1) = 0'Reset channel to manual mode after 3 sec.
      Set GlobFlags.1 'Set "Outs changed" flag
      SigOut=0
    End If
  Else
    SwState = Sw
    SwCounter = 0
  End If
Return
Procedura obsługi klawiatury wywoływana jest co 4ms. Na samym początku do zmiennej Sw wpisywany jest stan portu z odpowiednią maską bitową. Kilka kolejnych operacji sprawia że stan klawiatury znajduje się w czterech najmłodszych bitach zmiennej Sw. Pierwsza instrukcja warunkowa sprawdza czy cokolwiek zostało naciśnięte na klawiaturze, a kolejna odpowiedzialna jest za likwidację drgań styków. Klawisze reagują po około 60ms (15 cykli), bez powtarzania akcji po długim trzymaniu klawisza za co odpowiada blokada zwiększania wartości licznika SwCounter (If SwCounter < 1000) . W dalszej kolejności sprawdzane jest stan zmiennej Sw i w zależności od jej wartości do zmiennej SwChn wpisywany jest aktualny numer kanału, który został naciśnięty (numeracja według aplikacji). Dalej sprawdzany jest tryb pracy aktualnie wybranego wyjścia - ChnModes. Jeśli nie jesteśmy w trybie 1 (sterowanie godzinowe od-do) to zmień stan wyjścia na przeciwny, zresetuj liczniki pomocnicze CycleSecCnt oraz CycleMinCnt i uaktualnij wyjścia. W trybie 1 wyjścia zależą tylko od czasu, nic nie da zmiana stanu manualnie. W tym samym miejscu następuje też ustawienie flagi "Outs changed" na 1 oraz reset flagi "Device reseted", co przy pierwszym odczycie danych przez aplikację zgłosi konieczność odczytu stanów z urządzenia.

W dalszej części procedury sprawdzane jest czy SwCounter = 750. Zmienna ta może mieć taką wartość w przypadku przytrzymania jednego z klawiszy przez czas około 3 sekundy. Zaowocuje to przejściem danego kanału do manualnego trybu pracy (tryb 0). Dzięki temu można wyłączyć sterowanie czasowe i dowolną inną funkcjonalność ustawioną na danym wyjściu za pomocą aplikacji i przejść do podstawowej funkcji on/off. Podczas resetu trybu zostaje ustawiony stan niski na wyjściu SigOut (obecnie Portd.3) na czas ok. 60ms. Jest to dodatkowa funkcjonalność dająca informację o resecie. Do tego wyjścia można podłączyć Buzzer lub dodatkową diodę LED.
Kup Teraz! - Płytki, Elementy, uC …Pokaż Cennik Pokaż na Allegro
Obsługa przerwania Timera0:
Timer0Int:
   Timer0 = 6
   Set F4ms
   Incr DivCnt
   If DivCnt = 250 Then
     DivCnt = 0
     Set F1s
     Incr CurrSec
     For nt = 1 To 10
       Incr CycleSecCnt(nt)
     Next nt
     If CurrSec = 60 Then
       CurrSec = 0
       Incr CurrTime
       For nt = 1 To 10
         Incr CycleMinCnt(nt)
       Next nt
       If CurrTime = 1440 Then CurrTime=0
     End If
   End If
Return
Timer skonfigurowany jest do zgłaszania przerwań co 4ms. Odpowiednie zmienne/dzielniki dają dodatkowe podziały częstotliwości, umożliwiając taktowanie co 1s. Procedura obsługi przerwania zajmuje się też liczeniem aktualnego czasu. Nie ma tutaj zwykłego licznika minut i godzin - aktualny czas, dostępny w zmiennej CurrTime wyrażony jest w minutach. Timer obsługuje też dwa zestawy liczników cyklicznych CycleSecCnt i CycleMinCnt (po jednym dla każdego kanału). Liczniki te inkrementowane są odpowiednio co 1s i 1m a resetowane niezależnie dla każdego z wyjść.

Procedura automatycznego sterowania stanami wyjść:
ControlsOuts:
  TmpOutState=OutState
  For n = 0 to 9
    Select Case ChnModes(n+1)
      Case 0:'Manual mode
       'Do nothing
      Case 1:'From TintA to TintB
        If TintA(n+1) <= TintB(n+1) Then
          If CurrTime >= TintA(n+1) and CurrTime < TintB(n+1) Then Set OutState.n Else Reset OutState.n
        Else
          If CurrTime >= TintA(n+1) or CurrTime < TintB(n+1) Then Set OutState.n Else Reset OutState.n
        End If
      Case 2:'Works TintA minutes and after that waits TintB minutes. Time = 0 gives infinite delay
        If OutState.n = 1 Then Hw=TintA(n+1) Else Hw=TintB(n+1)
        If CycleMinCnt(n+1) >= Hw Then
          CycleMinCnt(n+1)=0
          If Hw > 0 Then Toggle OutState.n
        End If
      Case 3:'Works TintA seconds and after that waits TintB seconds. Time = 0 gives infinite delay
        If OutState.n = 1 Then Hw=TintA(n+1) Else Hw=TintB(n+1)
        If CycleSecCnt(n+1) >= Hw Then
          CycleSecCnt(n+1)=0
          If Hw > 0 Then Toggle OutState.n
        End If
    End Select
  Next n
  If TmpOutState <> OutState Then
    Set GlobFlags.1 'Set "Outs changed" flag
    Gosub UpdateOuts
  End If
Return
Działanie procedury zależy od kilku tablic przechowujących parametry wyjść. Tablica ChnModes przechowuje tryby pracy każdego z wyjść, dalej dwie tablice TintA oraz TintB to interwały czasowe wyrażone w minutach lub sekundach i wreszcie dwa liczniki cykliczne o których była mowa w procedurze obsługi przerwania timera 0. Na chwilę obecną istnieją 4 tryby pracy każdego z kanałów. Jak nietrudno zauważyć procedura sterowania wyjść wykonuje pętle po wszystkich kanałach, sprawdzając w jakim trybie jest dane wyjście i wykonując odpowiednie operacje w zależności od tego. W trybie 0 nie ma co robić bo stan wyjść zależy tylko od przycisku na klawiaturze albo przycisku w aplikacji - nie ma sterowania czasowego. Tryb 1 jest podstawowym sterownikiem godzinowym, przed jego uruchomieniem wymagana jest konfiguracja czasów TintA i TintB, które oznaczają po prostu godziny między którymi działa wyjście. Warunek TintA(n+1) <= TintB(n+1) jest sprawdzany aby umożliwić pracę gdy TintB > TintA czyli np.: od 23:45 do 0:34, gdzie wartości czasu w minutach są odwrócone. W obu przypadkach czasy A i B porównywane są z czasem aktualnym CurrTime, który też musi zostać ustawiony przez aplikację.

Tryb 2 umożliwia pracę cykliczną wyjścia przez czas TintA z przerwą TintB (oba czasy w minutach). Na początku sprawdzany jest stan wyjścia i w zależności od niego do zmiennej pomocniczej Hw ładowany jest czas pracy, bądź przerwy. Wartość Hw porównywana jest z wartością licznika cyklicznego CycleMinCnt i kiedy zostanie odliczony odpowiedni czas, stan wyjścia zmieni się na przeciwny a licznik cykliczny zostanie wyzerowany. Dodatkowy warunek Hw > 0 przed zmianą portu wprowadza dodatkową funkcjonalność, a mianowicie wprowadza pracę monostabilną, gdyż wartość TintA(B) = 0 traktowana jest jako nieskończoność. W efekcie jeśli TintB = 0 to wyjście w stanie stabilnym jest wyłączone. Warunek Hw > 0 nie jest spełniony, więc stan się nie zmienia na przeciwny a resetowany jest licznik cykliczny, co daje nieskończony czas. Ręczna zmiana stanu tak skonfigurowanego wyjścia powoduje że pozostaje ono aktywne na czas TintA, po czym wraca do stanu nieaktywnego. Odwrotna sytuacja jest gdy drugi z czasów jest 0. Wyjście jest zawsze włączone a ręczna ingerencja pozwala go wyłączyć na czas TintB. Tryb 3 działa analogicznie ale interwały czasowe TintA i TintB wyrażone są w sekundach.

Procedura uaktualniania wyjść:
UpdateOuts:
  Ot0=not OutState.4
  Ot1=not OutState.9
  Ot2=not OutState.8
  Ot3=not OutState.3
  Ot4=not OutState.2
  Ot5=not OutState.7
  Ot6=not OutState.6
  Ot7=not OutState.1
  Ot8=not OutState.0
  Ot9=not OutState.5
Return
Procedura mapuje stany wyjść zapisane w zmiennej OutState do odpowiednich pinów procesora, odwracając przy okazji stan. Stanem aktywnym dla pinów mikrokontrolera jest w tym wypadku 0 logiczne, natomiast w programie stan aktywny danego kanału rozumiemy intuicyjnie jako 1 logiczne. Procedura ta jest wygodnym miejscem aby odwrócić logikę wyjść gdyby schemat elektryczny układu uległ zmianie.

Ustawienia Fusebitów:

Wersje Oprogramowanie uC:

  • 0.80 - Wszystko działa poprawnie. Jest to pierwsza wersja która w ogóle zawiera informacje na temat aktualnej wersji :). Aplikacja będzie mogła sprawdzić czy nie ma nowej wersji oprogramowania dla uC na stronie i ewentualnie wyświetlić zmiany.
  • 0.95 - Dodano dwie flagi poprawiające wydajność komunikacji. Przy okazji odczytu czasu urządzenie odsyła teraz dwie informacje: Czy zostało zresetowane i brak mu konfiguracji oraz czy stany portów uległy zmianie i trzeba je odczytać w celu aktualizacji w aplikacji. Zmniejsza to trzykrotnie ruch na magistrali przez rezygnacje z cyklicznego czytania stanów, które się nie zmieniły.

Obsługa:

Wyłącznik po zaprogramowaniu mikrokontrolera nie wymaga żadnych dodatkowych czynności i od razu powinien pracować poprawnie. Każdy z kanałów startuje w trybie 0 co oznacza brak sterowania czasowego. Z poziomu klawiatury na urządzeniu można zmienić stan każdego z wyjść na przeciwny. Po uruchomieniu aplikacji na komputerze zegar na urządzeniu zostanie automatycznie zaktualizowany i będzie można dokonać niezbędnych ustawień. Każdy z kanałów można włączyć jeden z 4 trybów pracy:
  • 0: tryb manualny - umożliwia sterowanie ręczne danego kanału, z poziomu klawiatury lub z poziomu aplikacji.
  • 1: tryb czasowy, od A do B - pozwala na zaprogramowanie danego wyjścia w cyklu dobowym. Wyjście będzie aktywne od godziny A do godziny B, każdego dnia. W tym trybie przyciski sterowania ręcznego nie działają.
  • 2: tryb cykliczny, praca przez A, przerwa B - wyjście działa w trybie cyklicznym, jest aktywne przez czas A, po czym następuje przerwa B. Oba przedziały czasu można ustawić w granicach od 0 do 34 godziny z precyzją 1 minuty. W tym trybie przyciski sterowania ręcznego pozwalają zmienić stan wyjścia na przeciwny, jednorazowo skracając tym samym czas aktualnie odliczanej przerwy bądź pracy. Ustawienie któregokolwiek z czasów na 0 daje nieskończony odstęp czasu, co oznacza to że wyjście ma jeden stan stabilny (praca monostabilna).
  • 3: tryb cykliczny, praca przez A, przerwa B - działa tak samo jak tryb 2, z tym że oba przedziały czasu można ustawić w granicach od 0 do 34 minuty z precyzją 1 sekundy.
Sterowanie wyjściami odbywa się sprzętowo, co oznacza że do poprawnej pracy urządzenia nie ma konieczności ciągłej pracy aplikacji sterującej. Klawiatura urządzenia pozwala w ograniczony sposób sterować jego funkcjami, zmieniając stan na przeciwny w większości trybów pracy danego wyjścia. Przytrzymanie klawisza na urządzeniu przez czas dłuższy niż 3 sekundy powoduje reset jego trybu pracy (przechodzi do trybu manualnego). Jest to przydatne gdy wyjście zostało skonfigurowane w trybie 1 gdzie zmiana stanu na przeciwny nie jest możliwa.

Opis działania aplikacji zostanie przedstawiony w osobnym artykule.

Zdjęcia Projektu:

Wykaz Elementów:

Elementy Wyłącznika:

Załączniki:

Projekt Płytki:
AB AB AB Płytka (strona druku,termotransfer) 38.7 kB
AB AB AB Płytka (strona druku,odbicie lustrzane) 39.0 kB
AB AB AB Płytka (strona druku, kilka płytek na stronie, termotransfer) 162.1 kB
AB AB AB Montowanie (strona elementów) 72.7 kB
AB AB AB Montowanie (strona druku) 73.5 kB
AB AB AB Warstwa Opisowa (strona elementów) 93.6 kB
AB AB AB Warstwa Opisowa (strona druku) 93.8 kB
AB AB AB Soldermaska (strona druku) 68.9 kB
Dokumentacja:
AB AB AB Schemat Ideowy 186.5 kB
AB AB AB Lista Elementów 1.0 kB
AB AB AB Lista Montażowa 1.2 kB
Programowanie:
AB AB AB Kod Źródłowy (BASCOM-AVR) 12.3 kB
AB AB AB Kod Źródłowy (BASCOM-AVR) (Uproszczony) 4.4 kB
AB AB AB Program wynikowy (BIN BASCOM-AVR) (Uproszczony) 1.3 kB
AB AB AB Program wynikowy (BIN BASCOM-AVR) 4.6 kB
AB AB AB Program wynikowy (HEX) 13.0 kB
AB AB AB Program wynikowy (HEX) (Uproszczony) 3.8 kB
AB AB AB Ustawienia Fusebitów (burn-o-mat) 12.1 kB
Pozostałe:
AB AB AB Plik Wierceń 20.2 kB

Pytania i Komentarze:

comments powered by Disqus


Lipiec 19, 2018
Zasilacz do wzmacniaczy już opisany ...
Więcej …
Czerwiec 20, 2018
Moduł wykonawczy już opisany...
Więcej …
Więcej nowinek …

mirley.net
Polecane Strony