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

[mega16][bascom] Sterowanie 25 LED - programowy PWM

gray77 13 Mar 2011 20:02 14752 66
Najlepsze odpowiedzi

Jak zrealizować sterowanie 25 diodami LED z płynnym rozjaśnianiem i wygaszaniem przy możliwie małej liczbie pinów mikrokontrolera AVR/Bascom?

Najprościej zrobisz to na dedykowanym sterowniku LED z regulacją jasności, np. z rodziny MBI, bo takie układy obsługują wiele kanałów i pozwalają ustawiać jasność każdej diody niezależnie przy sterowaniu z dowolnego mikrokontrolera [#9273280][#9273337] Jeśli chcesz zostać przy AVR/Bascom, da się zrobić programowy PWM z tablicą jasności i przełączaniem kanałów; pokazano działający przykład na 8 kanałach i zaznaczono, że 25 kanałów będzie trudniejsze, ale możliwe po zmianie częstotliwości zegara i przerwań [#9291922] W praktyce można też wykorzystać jeden programowy PWM, a resztę efektu uzyskać przez przełączanie, która dioda jest aktualnie sterowana, zamiast robić osobny PWM na każdą z nich [#9280610][#9280821] Do samego załączania LED-ów proponowano tranzystory do sterowania anodami/katodami, a dla większej liczby wyjść wspomniano też o układach typu ULN2008; bez dodatkowych układów przy pełnej statycznej kontroli z małą liczbą pinów robi się to bardzo niewygodne [#9279811][#9287568]
Wygenerowane przez model językowy.
REKLAMA
  • #1 9273041
    gray77
    Poziom 12  
    Posty: 107
    Pomógł: 6
    Ocena: 1
    Witam.
    Chciałbym zrobić sterowanie 25 ledami. Powiedzmy, ze ma to być linijka ledow podświetlająca podjazd do garażu. Będzie ona załączana dwoma czujnikami. W momencie wykrycia obiektu, ma się ona zaświecać z tej strony co obiekt, powoli rozjaśniając kolejna diodę. Po upływie określonego czasu powoli ma wygaszać kolejne ledy. Będzie to coś podobnego jak w moim innym temacie klik, z tym ze nie chce mieć zajętych wszystkich nor uC, bo będę ich jeszcze potrzebował.

    Dużo czytałem i szukałem rozwiązań. Mógłbym zastosować parę TDA8444 (10 x ADC) ale nie mam pojęcia jak nim sterować przez I2C. Nie znalazłem żadnych przykładów. No i czy da się na tej kości lub na innej (jakiej?) zrobić tak, by każda dioda po kolei się rozjaśniała i pozostawała zaświecona i na odwrót? Np. wysyłam sygnał PWM (0-max świecenia) na led1, po osiągnięciu max świeci led1 i procedura powtarza się dla led2 - led25.
    Moze jakiś ekspander portów (tylko jak przekazywać PWM na poszczególne linie)?
    Chce jak najmniej lini uC zając, przekazując wykonanie "efektu" układom podrzędnym.
    Jak to rozwiązać? Jak tym sterować?

    I proszę nie krytykować, ze brak schematów, jakiegokolwiek kodu.... Kod stworze gdy będę wiedział jak i czym sterować ledy.
  • REKLAMA
  • #2 9273280
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Najlepsze wyjście to sterowanie np z rodziny MBI. Może tym się zainteresuj. Obslugują do 16 diod i dla kazdej mozna ustawić jasnośc.
  • #3 9273311
    gray77
    Poziom 12  
    Posty: 107
    Pomógł: 6
    Ocena: 1
    Nigdy nie miałem z nimi do czynienia. Zacząłem przygodę niedawno z AVRami i Bascomem. Chyba nie będę potrafił się przesiąść na inna platformę. Wolałbym kontynuować AVRy bo mam je w domu już.
  • #4 9273337
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    To nie procesory a układy peryferyjne. Sterujesz nimi za pomocą dowolnego procka.

    mbi5030 zajrzyj do noty katalogowej.
  • #5 9273753
    gray77
    Poziom 12  
    Posty: 107
    Pomógł: 6
    Ocena: 1
    tadzik85 napisał:
    mbi5030 zajrzyj do noty katalogowej.
    To może być albo na pewno jest zbyt skomplikowane dla mnie.

    Najlepsza opcja byłoby wysłać PWM na dana nogę i potem zatrzasnąć jak będzie max. Wtedy znów PWM na kolejna nogę i zatrzask, itd... Oczywiście peryferyjny układ sterowany przez uC.
  • #6 9273870
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    albo podlaczysz wszystkie diody do procka albo wykorzystasz układ wspomniany przeze mnie inaczej szkoda zachodu
  • #7 9274918
    SylwekK
    Poziom 32  
    Posty: 2764
    Pomógł: 82
    Ocena: 2762
    Wydaje mi się, że spokojnie można spróbować multipleksowo zasilać diody z programowym PWM powiedzmy 4-o bitowym - dla LED wystarczy, a i sam program nie powinien być skomplikowany. Wybieranie multipleksowe to prosta sprawa. Zrobić tablicę jasności dla każdego leda, i tylko wpisywać tam dane w dowolnej konfiguracji pozostanie.
  • REKLAMA
  • #8 9274948
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    Tak a f przemiatania nie będzie wcale mała co?
  • REKLAMA
  • #9 9275022
    SylwekK
    Poziom 32  
    Posty: 2764
    Pomógł: 82
    Ocena: 2762
    No faktycznie z multiplexem to nie zadziała tylko na pojedynczych pinach... cóż, głośno się zastanawiałem :) wtedy szybciej ewentualne błędy wychodzą i nowe pomysły wskakują...
  • Pomocny post
    #10 9279811
    Konto nie istnieje
    Konto nie istnieje  
  • #11 9280476
    gray77
    Poziom 12  
    Posty: 107
    Pomógł: 6
    Ocena: 1
    gustaw66 napisał:
    gray77 a może spróbować w ten sposób...

    Tak i ten sposób powinien być dobry. Teraz muszę posiedzieć nad kodem i popróbować czy spełni moje oczekiwania.

    Dzięki.
  • REKLAMA
  • #12 9280484
    SylwekK
    Poziom 32  
    Posty: 2764
    Pomógł: 82
    Ocena: 2762
    Na takim rozwiązaniu tablica PWM powinna bez problemu chodzić...
  • #13 9280570
    gray77
    Poziom 12  
    Posty: 107
    Pomógł: 6
    Ocena: 1
    Jednak po głębszym zastanowieniu, pierwsza LED będzie działać wedle tego schematu. Po dojściu na max świecenia np 5-tej LED, gdy cykl się będzie powtarzał dla kolejnej LED, wcześniejsze 5 również zgasną i będą się rozświetlać w miarę zwiększania wypełnienia PWM.
  • #14 9280610
    SylwekK
    Poziom 32  
    Posty: 2764
    Pomógł: 82
    Ocena: 2762
    Będzie ok. Dla każdej diody robisz zmienną (tablica) i cyklicznie w zależności od wartości tej zmiennej zmieniasz sobie wartości tych zmiennych. Innymi słowy to tak jak by zrobić programowy pwm dla każdej diody ale aby procesor wyrobił to wystarczy jeden (tak... jeden) pwm, bo w danym momencie tylko jedna dioda się rozświetla, a pozostałe po rozświetleniu dostają już full napięcie. Przemyśl to ;) Co innego jak byś chciał sobie migać wszystkimi w jednym czasie - wtedy dla każdej bez indywidualnego pwm się nie obejdzie.
  • #15 9280645
    Konto nie istnieje
    Konto nie istnieje  
  • #16 9280671
    gray77
    Poziom 12  
    Posty: 107
    Pomógł: 6
    Ocena: 1
    SylwekK napisał:
    Będzie ok. Dla każdej diody robisz zmienną (tablica) i cyklicznie w zależności od wartości tej zmiennej zmieniasz sobie wartości tych zmiennych. Innymi słowy to tak jak by zrobić programowy pwm dla każdej diody ale aby procesor wyrobił to wystarczy jeden (tak... jeden) pwm, bo w danym momencie tylko jedna dioda się rozświetla, a pozostałe po rozświetleniu dostają już full napięcie. Przemyśl to ;) Co innego jak byś chciał sobie migać wszystkimi w jednym czasie - wtedy dla każdej bez indywidualnego pwm się nie obejdzie.


    Cos mi się widzi, ze to jest wyższa szkoła jazdy jak dla mnie. Nie wiem czy sobie poradzę tak jak piszesz. Na tablicach jeszcze nic nigdy nie robiłem. Mam już kod na programowy PWM i chyba przy nim zostanę. Minus tego jest taki, ze zajmuje prawie wszystkie nogi uC.

    Edit:

    gustaw66 sposób drugi. Cos a'la efekt knight rider, tylko płynne rozjaśnianie i wygaszanie. Oczywiście jak się rozświetlą, to będą się świecić przez 5 min i dopiero potem zaczną się po kolei wygaszać.


    b1 - led1 -------------------------------------- led25 - b2

    b1 - bariera 1
    b2 - bariera 2

    Jeśli b1 wykryje ruch, płynnie rozświetli od led1 do led25, poświeci 5 minut i wygasi od led1 do led25.

    Jeśli b2 wykryje ruch, płynnie rozświetli od led25 do led1, poświeci 5 minut i wygasi od led25 do led1.
  • #17 9280738
    Konto nie istnieje
    Konto nie istnieje  
  • #18 9280780
    gray77
    Poziom 12  
    Posty: 107
    Pomógł: 6
    Ocena: 1
    gustaw66 napisał:
    Tylko nie wiem, czy bym sobie poradził z takim kodem ?
    Może ktoś mądrzejszy wypowiedziałby się czy tok rozumowania jest słuszny.


    Ja sobie na pewno z tym nie poradzę. Zastosuje program z odpowiednio szybka zmiana stanu każdej końcówki uC. To chyba będzie najszybszy sposób, tym bardziej, ze zalążek kodu już powstał.
  • #19 9280821
    tadzik85
    Poziom 38  
    Posty: 3404
    Pomógł: 415
    Ocena: 16
    ale wy kombinujecie aż za bardzo. przecież wystarczy programowy PWN w którym parametrem jest również port mikroprocka i żadne multipleksowanie konieczne nie jest
  • #20 9280862
    gray77
    Poziom 12  
    Posty: 107
    Pomógł: 6
    Ocena: 1
    tadzik85 napisał:
    ale wy kombinujecie aż za bardzo. przecież wystarczy programowy PWN w którym parametrem jest również port mikroprocka i żadne multipleksowanie konieczne nie jest

    Wtedy robimy PWM na powiedzmy porcie a6 i gdy dojdzie do max ustawiamy tam po prostu "1" a PWM przechodzi na kolejna nogę... To by znacznie zmniejszyło i uprościło program...

    Czy mógłbyś wrzucić kawałeczek kodu odpowiedzialnego właśnie za to zadanie?
  • #21 9281043
    SylwekK
    Poziom 32  
    Posty: 2764
    Pomógł: 82
    Ocena: 2762
    O tym mówię przecież, tylko zastosowanie dodatkowej tablicy bardzo uprości indeksowanie portów i ułatwi kierowanie kierunkiem zapalania...
  • #22 9281189
    Konto nie istnieje
    Konto nie istnieje  
  • #23 9281218
    gray77
    Poziom 12  
    Posty: 107
    Pomógł: 6
    Ocena: 1
    gustaw66 napisał:
    Jak to jest z tym PWM ? Nigdzie nie doczytałem, że pwm jest dostępny na dowolnej końcówce ?

    Bo nie jest.
    Sprzętowy jest na kilku końcówkach (zależnie od uC) tylko.
    Z tego co wiem, to programowo można zrobić go na praktycznie każdej nodze uC. Trzeba odpowiednio szybko zmieniać jej stan.
  • #24 9287415
    gray77
    Poziom 12  
    Posty: 107
    Pomógł: 6
    Ocena: 1
    Witam ponownie.
    Prace nad projektem postępują. Niestety nie udało się zrealizować zamierzeń, ale sterowanie będzie tak: po wykryciu obiektu przez czujnik, będą się zapalać kolejne ledy, po upływie jakiegoś czasu wszystkie będą płynnie wygaszone przez wyjście PWM, które będzie sterowało anodami wszystkich led poprzez tranzystor.

    Mam pytanie dla znawców tematu. Czy tranzystory NPN (BC547) widoczne na schemacie da się zastąpić jakimś układem scalonym?

    [mega16][bascom] Sterowanie 25 LED - programowy PWM

    Jak widać będzie ich musiało być 25 a znacznie by uprościło sprawę zastosowanie scalaka. Wiadomo, że będzie on musiał wysterować 8 ledów.
  • #25 9287555
    Konto nie istnieje
    Konto nie istnieje  
  • #26 9287568
    SylwekK
    Poziom 32  
    Posty: 2764
    Pomógł: 82
    Ocena: 2762
    Użyj kilku ULN2008 (jeden ma 8 wyjść ). Jak będę miał chwilkę to może Ci skrobnę ten programik na wygaszanie ale chwilowo mam troszkę urwanie głowy...
  • Pomocny post
    #27 9291922
    SylwekK
    Poziom 32  
    Posty: 2764
    Pomógł: 82
    Ocena: 2762
    Pobawiłem się dziś chwilkę programowym PWM. Jest to rozwiązanie na 8 kanałów - 25 może być ciężko pociągnąć ale oczywiście możesz próbować rozbudować program i zmienić częstotliwość zegara czy wywołania przerwań.

    Pierwszy to demonstracja tworzenia w zasadzie dowolnie biegnącego światła - dane umieszczamy w liniach Data (wartości od 0 zgaszone do 8 max zapalone).

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Drugi to już dokładnie efekt o jaki Ci chodziło tyle, że na 8 kanałów zaprogramowany w pętlach For...Next. Zwiększyłem tylko rozdzielczość PWM w zakresie 0-128. Analogicznie do tego rozwiązania można zrobić tylko jeden pwm i przemieszczać się między portami wtedy już nie ma problemu, żeby ten efekt dla 25 kanałów zrobić ale to już zadanie dla Ciebie - ciasto wyrobione Ty go upiecz ;)

    Kod: text
    Zaloguj się, aby zobaczyć kod


    :idea: Zwróć uwagę w jak prosty sposób przypisywany jest PWM do dowolnego portu.


    ...i jeszcze schemacik do demonstracji programów...

    [mega16][bascom] Sterowanie 25 LED - programowy PWM

    Pozdrawiam


    EDIT: Te programy to wstępny zarys większej całości sterownika, który właśnie opracowuję (ale nie LED, itp.) więc gdy dostosowywałem parametry to wyszła mała zmiana (wcześniej nie zwróciłem na to uwagi) - zmniejszyłem rozdzielczość ze 128 poziomów do 64. Przy tym zegarze i preskalerze PWM działa o wiele płynniej dla 8 kanałów. Wcześniej potrafiło gubić wartości... Zresztą do diod LED to i tak aż nadto :)
  • #28 9303762
    gray77
    Poziom 12  
    Posty: 107
    Pomógł: 6
    Ocena: 1
    Słuchajcie. Wszystko powoli się kreuje i nabiera kształtów ale napotkałem dziwne zjawisko, którego nie umiem wytłumaczyć.

    Przy deklarowaniu portów na początku programu mam tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    i wszystko byłoby ok, gdyby nie w miejscu gdziezadziała czujnik:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    ustawiam PWM na 0 by włączyć katody ledów i potem, gdy program przechodzi do ustawiania "1" na kolejnych pinach portu A równocześnie zostaje ustawiona "1" na pinie 2 i 3 portu C. Kolejność powinna być: port A 0-7 potem port C 0-7.

    Co jest nie tak?

    EDIT: Sprawdziłem na drugiej atmedze, by mieć pewność, że pierwsza nie jest uwalona i obie zachowują się identycznie.
  • #29 9304193
    SylwekK
    Poziom 32  
    Posty: 2764
    Pomógł: 82
    Ocena: 2762
    Nie analizowałem tego wszystkiego ale czy ten drugi listing to przypadkiem nie jest to coś co się wykonuje w przerwaniu ?? Jeśli tak to przede wszystkim nie może być tam dwóch "return". Bascom zinterpretuje tylko pierwszy ret jako powrót z przerwania i może stąd jest problem...
  • #30 9304774
    gray77
    Poziom 12  
    Posty: 107
    Pomógł: 6
    Ocena: 1
    SylwekK napisał:
    Nie analizowałem tego wszystkiego ale czy ten drugi listing to przypadkiem nie jest to coś co się wykonuje w przerwaniu ?? Jeśli tak to przede wszystkim nie może być tam dwóch "return". Bascom zinterpretuje tylko pierwszy ret jako powrót z przerwania i może stąd jest problem...

    Nie, to nie jest przerwanie. To jest tylko podprogram dla czujnika pierwszego.

    W przerwaniu mam tylko jeden return na samym końcu (nie ma więcej pomiędzy nazwa przerwania i powrotem) i tam tylko wykonuje sie zwiększanie flag. Nie ma tam nic więcej a tym bardziej zadnych waitow.

Podsumowanie tematu

✨ W dyskusji poruszono temat sterowania 25 diodami LED za pomocą mikrokontrolera AVR, z wykorzystaniem programowego PWM. Użytkownik planuje stworzyć linijkę LED do podświetlania podjazdu, która będzie aktywowana przez czujniki ruchu. W odpowiedziach zasugerowano różne metody, w tym użycie układów MBI do regulacji jasności diod oraz multipleksowanie sygnałów. Użytkownik rozważał również zastosowanie tranzystorów do wzmocnienia sygnału oraz rejestrów przesuwnych, takich jak 74HC595, do sterowania większą liczbą diod. W końcu zdecydowano się na prostsze podejście z programowym PWM, które zajmuje mniej pinów mikrokontrolera. Użytkownik napotkał problemy z wykrywaniem sygnałów z czujników PIR, które zostały rozwiązane przez zastosowanie tranzystorów. Projekt przeszedł przez różne etapy, a użytkownik planuje dalsze ulepszenia i prezentację finalnego efektu.
Wygenerowane przez model językowy.
REKLAMA