Jak mogę sterować wieloma diodami LED za pomocą zaledwie kilku pinów na mojej mikro?


10

Korzystam z Atmel ATtiny13, który ma 6-pinowe we / wy. Chciałbym kontrolować około 15 diod LED, ale nie jestem pewien, jak podłączyć wszystko. Bez jakiegokolwiek multipleksowania wydaje się, że byłbym w stanie kontrolować tylko 6 diod LED jednocześnie. Czy jestem ograniczony do zaledwie 6 diod LED z powodu wielkości mikrokontrolera?


Nie widziałem. Prawdopodobnie powielone: electronics.stackexchange.com/questions/9860/…
Daniel Grillo

3
Nie zapomnij porównać swoich opcji z kosztem zakupu nieco bardziej miniaturowego mikrokontrolera. Zwróć także uwagę na limity na port i całkowity prąd.
joeforker

Kiedy jakiś czas temu zacząłem pracować z mikrami, chciałbym, aby było to łatwe do znalezienia pytanie z jasnymi odpowiedziami. Udało mi się nauczyć o charlieplexowaniu i z powodzeniem go wdrożyć, ale chciałem tutaj odtworzyć to pytanie z doskonałą jakością odpowiedzi społeczności SE.
JYelton,

1
@joeforker Masz rację, koszt mikro z większą liczbą pinów był dość minimalny, biorąc pod uwagę, że mój projekt był jednorazowy. W pewnym momencie myślałem o użyciu mikro z około 20 pinami IO do wykonania zadania, ale jednym z moich celów był bardzo mały ślad na płytce drukowanej. Również niesamowity przymiotnik pinnier !
JYelton,

Odpowiedzi:


18

Istnieje kilka metod sterowania dużą liczbą diod LED z kilku pinów IO.

Najprostszym jest standardowe multipleksowanie wyświetlania wierszy / kolumn. Dzięki tej technice możesz sterować diodami LED za pomocą n pinów IO. Matematycznie cykl pracy wynosi:(n/2)2n

1minimum(unique row patterns, unique column patterns)

Oznacza to, że ta technika ma cykl pracy 100%, gdy wszystkie diody LED są zapalone (lub wszystkie rzędy lub wszystkie kolumny są identyczne) i cykl pracy gdy konieczne jest zaświecenie linii ukośnej (lub wszystkie rzędy są różne ). Masz gwarancję tylko 100% cyklu pracy przy zapalaniu każdej diody LED lub jednej diody LED (lub zerowych diod LED, ale tak naprawdę nie ma to większego znaczenia).1/n

Nieco bardziej złożony jest Charlieplexing . Dzięki tej technice możesz sterować diodami LED za pomocą n pinów IO. Za pomocą tej techniki można świecić tylko n - 1 diodami LED. Matematycznie cykl pracy wynosi:n2nnn1

1minimum simultaneous sets

1/n

Ostatnią metodą, o której wspomnę, jest użycie rejestru przesuwnego lub ekspandera we / wy. Za pomocą dwóch pinów (albo surowego interfejsu danych / zegara, I2C lub jednokierunkowego SPI) możesz sterować dowolnie dużą liczbą diod LED. Cykl pracy dla dowolnego wzoru wynosi 100%, ale szybkość aktualizacji jest odwrotnie proporcjonalna do liczby diod LED. To najdroższa metoda. W przypadku 15 diod LED prawdopodobnie taniej będzie po prostu uaktualnić do mikro z tyloma pinami IO.


+1 za wyjaśnienie nieco aspektów cyklu pracy. W drugim zdaniu o Charlieplexing miałeś na myśli „napędzaj n ^ 2-n diodami LED za pomocą n pinów IO?
JYelton

Charlieplexing można wykonać bardzo podobnie do multipleksowania, jeśli po prostu pominie się jedno światło z każdego rzędu. W rzeczywistości może być możliwe „odzyskanie” tego światła przez dodanie diody, jednak chyba, że ​​sterowniki kolumn są wyjściami stałoprądowymi, dopasowanie ich do jasności pozostałych może być trudne.
supercat

11

n×(n1)n

Przykład:

Sześć diod LED na 3 piny:

PINS        LEDS
0 1 2   1 2 3 4 5 6
0 0 0   0 0 0 0 0 0
0 1 Z   1 0 0 0 0 0
1 0 Z   0 1 0 0 0 0
Z 0 1   0 0 1 0 0 0
Z 1 0   0 0 0 1 0 0
0 Z 1   0 0 0 0 1 0
1 Z 0   0 0 0 0 0 1
0 0 1   0 0 1 0 1 0
0 1 0   1 0 0 1 0 0
0 1 1   1 0 0 0 1 0
1 0 0   0 1 0 0 0 1
1 0 1   0 1 1 0 0 0
1 1 0   0 0 0 1 0 1
1 1 1   0 0 0 0 0 0

Schemat Charlieplexing z 3 pinami wyjściowymi


Dziękujemy za zestaw danych pinów wyjściowych, a także za pomocny schemat.
JYelton

1
Innym sposobem rysowania schematu jest siatka NxN, ale tylko napędzanie kolumn i zamiana pierwotnej przekątnej na skróty między rzędami.
supercat,

oznacza, że ​​nie mogę włączyć wszystkich jednocześnie? Czy to oznacza, że ​​jeśli chcę je wszystkie włączyć jednocześnie, muszę wykonać pleksowanie czasu na tyle, aby oszukać oczy?
MaNyYaCk

@MaNyYaCk Tak. Masz rację.
Daniel Grillo,

8

Bez multipleksowania (napęd bezpośredni) jesteś ograniczony do 6 diod LED.

Dzięki charlieplexingowi możesz sterować n * (n-1) diodami LED z n pinów.

Za pomocą ekspanderów we / wy lub rejestrów przesuwnych można sterować praktycznie nieograniczoną liczbą diod LED.
Przykład: 8-bitowy ekspander we / wy MCP23008 I2C


Czy możesz opracować, czym byłyby moduły rozszerzeń we / wy?
JYelton,

3
Ekspander we / wy to zewnętrzny układ zawierający piny i rejestry we / wy. Do komunikacji z nimi można użyć standardowej magistrali komunikacyjnej, takiej jak I2C lub SPI.
mjh2007

+1 Możesz sterować wieloma diodami LED za pomocą TLC TLC594 ( focus.ti.com/lit/ds/symlink/tlc5940.pdf ), ale w przypadku wielu zadań może to być przesada. search.digikey.com/scripts/DkSearch/…
kenny

Dzięki - powinienem zaprojektować projekt, który wykorzystuje ekspandery we / wy, aby wymusić naukę o ich użyciu.
JYelton,


2

Oto przykład charlieplexowania, który zbudowałem.

Jest to symulator wiązki latarni morskiej i wykorzystuje serię 12 diod LED oznaczonych jako 4 GPIO do zamiatania wiązki światła wokół dysku. Tutaj jest film .

Projekt jest oparty na PIC, używam PIC12f683, który jest również 8-pinowym uP i można go uznać za porównywalny z 8-pinowymi AVR.

Intensywność diody LED jest sterowana przez przerwanie, które zapewnia 32-stopniowy PWM przy około 60 Hz. Tylko dwie diody LED mogą świecić jednocześnie, co daje 50% cła na każdą diodę, ponieważ to było wszystko, czego potrzebowałem. Daje również dobry kompromis częstotliwości odświeżania PWM w stosunku do rozdzielczości.

Kodowanie użycia charlieplexowania jako właściwie całkiem proste, jeśli trzymasz się „klasycznej” metody zapalania tylko jednej diody LED w dowolnym momencie z bardzo dużą częstotliwością odświeżania. Wymagane PORT i TRIS (rejestry specyficzne dla zdjęć) najpierw opracowuję na papierze, a następnie przechowuję wyniki w tablicy statycznej. Aby zapalić LED x, PIC musi po prostu sprawdzić wartość na indeksie tablicy [x] i zapisać je bezpośrednio do PORTU (z odrobiną maskowania, aby zachować stan innych pinów nieużywanych w charliplexie)

Mój projekt ma tylko 12 diod LED, a nie 15 lub maksymalnie 20, na które pozwala 5 GPIO, ponieważ chciałem zachować jedną zapasową GPIO na przyszły rozwój.

W każdym razie ... Pomyślałem, że może być przydatny przykład działania podobny do twojego żądania.

Pełny kod źródłowy i schematy są dostępne na moim blogu.


0

Inną opcją byłoby użycie diod LED Neopixel. Mają wbudowany kontrolny układ scalony i potrzebujesz tylko jednego styku do sterowania tyloma diodami LED, ile chcesz. Oczywiście wtedy potrzebujesz odpowiedniego oddzielnego źródła zasilania LED.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.