Skocz do zawartości
kauczuk79

Multipleksowanie wyświetlaczy 7-segmentowych i ekspander PCF8574

Pomocna odpowiedź

Napisano (edytowany)

Witam wszystkich forumowiczów.

Jest to mój pierwszy post na forum i jednocześnie pierwszy "większy" projekt na Arduino. Jestem dosyć początkujący, jeżeli chodzi o teoretyczne aspekty elektroniki i prosiłbym o sprawdzenie mojego schematu.

Mam problem z multipleksowaniem wyświetlaczy 7-segmentowych o wspólnej anodzie. Cyfry na nich są wyświetlane ale widoczna jest na nich "poświata" liczby, która znajduje się po prawej stronie. Sterowanie pojedynczą liczbą odbywa się za pomocą ekspandera PCF8574 (na schemacie zaznaczone jako A, B, C...), a o tym na który wyświetlacz ona trafi zajmują się 3 rejestry przesuwne 74HC595 (D1...D24 na schemacie). Poniżej załączam schemat.

schemat.thumb.PNG.99127b88ccca5c8748991f8f5047e21e.PNG

A na zdjęciu poniżej jak to wygląda na wyświetlaczach:

IMG_20190126_184259.thumb.jpg.e27cd0758731aafddfbbc27b93fa8779.jpg

Myślałem, że to wina braku kondensatorów przy rejestrach przesuwnych (na początku ich nie było), ale pomimo dodania ich problem nadal występuje. Widać to dobrze na pojedynczym wyświetlaczu w centrum kadru , gdzie powinno być 1, a prześwituje również 2 znajdujące się po prawej stronie. Wyświetlacz ten (również nie wiem czemu) świeci dużo jaśniej niż pozostałe, ale możliwe, że jest innego typu/producenta (wnioskuję po innym ułożeniu pinów). Wspomniany kondensator znajduję się na przy pinie Vcc, a więc możliwie blisko tak jak wskazuje na to dokumentacja układu. Poniżej zdjęcie jego położenia (pierwszy układ to ekspander, dalej 3 rejestry).

IMG_20190126_184521.thumb.jpg.6f0bf9e1d81678526b8c5d8ccfbc277d.jpg

Całość sterowana jest przez Arduino Uno i jedna z moich hipotez jest taka, że zapis stanu wyjściach ekspandera PCF8574 trwa za długo. Cyfry, które mają zostać wyświetlone, przychodzą z portu szeregowego i są typu string. Napis ten konwertowany jest na tablicę liczb w postaci binarnej, np. 0 to 0b11111100 (czyli 0b[a][c][d][e][f][g][dp]). Każda cyfra jest zanegowana, tak aby na ekspanderze był stan niski, jeśli segment ma zostać zapalony. Poniżej kod, który jest odpowiedzialny za wyświetlanie liczb:

//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

void loop() {
  //...
  String stringForDisplay = "181181181123450000";
  byte len;
  byte* bytes = stringToSegment(stringForDisplay, len); 
  /*
  Zmienna len jest referencją, zwraca długość tablicy. 
  Tablica wyjściowa może mieć mniejszą długość, jeśli w napisie
  wystąpi kropka - jest ona dodawana do poprzedniej cyfry.
  */
  unsigned long i = 1;
  for (byte index = 0; index < len; index++) {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, i >> 16);
    shiftOut(dataPin, clockPin, MSBFIRST, i >> 8);
    shiftOut(dataPin, clockPin, MSBFIRST, i);
    displayDataLines.write8(bytes[index]);
    digitalWrite(latchPin, HIGH);
    i = i << 1;
  }
  delete bytes;
  //...
}

Każdą sugestię mogę sprawdzić, ponieważ układ aktualnie zmontowany jest na płytce "edukacyjnej".

Edytowano przez kauczuk79

Udostępnij ten post


Link to post
Share on other sites

@kauczuk79 próbowałeś jakoś mierzyć (np. analizatorem stanów lub oscyloskopem) jak często w praktyce odświeżasz wyświetlacze i ogólnie z jaką prędkością działa ten układ?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Treker Niestety nie mam dostępu do takich sprzętów, ale Twoja odpowiedź dała mi do myślenia, żeby ograniczyć programowo ilość odświeżeń. Do tej pory aktualizacja następowała w każdym przebiegu pętli loop i niepotrzebnie marnowała "zasoby", teraz robię to co 250ms. Dzięki za podpowiedź.

@marek1707 Twoja podpowiedź rozwiązała całkowicie moje problemy. Dzięki wielkie!

Zastanawia mnie jeszcze, czy prąd płynący przez 74HC595 nie jest za duży i czy nie lepiej byłoby użyć na jego wyjściach tranzystorów.

Udostępnij ten post


Link to post
Share on other sites

Od razu założyłem, że pokazany schemat to tylko część całości, że pominąłeś właśnie drivery. Przy multipleksowaniu 1:24 jakie zaprezentowałeś nie masz szans uzyskać sensownej jasności ze scalaczków serii HC czy ekspandera. To wszystko są układy logiczne, przeznaczone do produkowania sygnałów cyfrowych, sterowania co najwyżej diodką LED lub bazą tranzystora. Oczywiście, że powienieneś użyć buforów między tym co masz a wyświetlczem. I to zarówno po stronie anod (24 x pnp) jak i katod (8 x npn). To nie muszą być tranzystory, możesz użyć jakichś wielobitowych wzmacniaczy, ale coś musisz tam wstawić. Już statycznie masz problem: opornik 470R i czerwony segment wyświetlacza LED pobiorą z 5V prąd ok. 6mA co jeszcze jest do przeżycia dla ekspandera, ale przecież sumy całej cyfry (8x6mA=48mA) oczekujesz z wyjścia biednego 74HC595. Jak myślisz co on zrobi gdy każesz mu zapalić pełną ósemkę z kropką? Brawo: zmniejszy napięcie na wyjściu a więc i prąd LEDa. Zatem nawet statycznie nie dostaniesz z takiego wyjścia prądu 6mA na segment a przy multipleksowaniu 1:24 średni prąd spada przecież 24 razy. Twoje (no dobra, wyświetlacza) segmenty świecą zatem jakby były zasilane średnim prądem powiedzmy 4mA/24=160uA a jest jeszcze jeden nieprzyjemny efekt. "Mięki" driver anod powoduje, że jasność cyfry zmienia się w zależności od liczby zapalonych w niej segmentów. Tak więc.. kaszana na całej linii. Każda ze stron drivera - a szczególnie ta od strony wspólnych elektrod (tutaj: anod) powinna być bardzo wydajna. Tak bardzo, by napięcie na niej nie przysiadało w zależności od prądu. Ta od strony segmentów (tutaj: ekspander) jest mniej krytyczna, bo zawsze zapala tylko jeden segment albo nic, więc jeśli będzie słabsza to generalnie wszystko na raz przysiądzie.

Moja propozycja testu: zatrzymaj swoje multipleksowanie (teraz możesz to zrobić z uwagi na beznadziejne sterowanie, w przypadku porządnego drivera absolutnie nie wolno tego robić bo LEDy spalisz w ułamku sekundy), załącz tylko jeden wyświetlacz na stałe i przez przeładowanie ekspandera zapalaj na nim co 2 sekundy kolejną cyfrę mierząc jednocześnie napięcie na aktywym wyjściu HC595. Jeżeli jest stałe w okolicach 5V, masz jakiegoś mocarza z kosmosu niespełniającego danych katalogowych - możesz spać spokojnie a ja powinienem wejść pod stół albo odpuścić na jakiś czas radzenie innym. Natomiast jeśli jest sporo mniejsze a na dodatek przysiada przy cyfrach typu 6, 8 czy 9, to masz przed sobą przykład nieprzemyślanego projektu...

Jak już tak bawiłeś się samodzielnie w rejestry szeregowe i drutowanie pola multipleksowanego to na Twoim miejscu użyłbym jakiejś kości przeznaczonej specjalnie do tego celu. Choćby popularny MAX7219 jest "od nowości" wydajnym driverem matrycy LED 8x8 więc bezboleśnie podłączasz do niego 8 cyfr 7-segmentowych z kropkami. Trzy takie układy same przemiatają pole 24 cyfr a Ty tylko wysyłasz po SPI co ma się gdzie świecić i tylko wtedy gdy coś zmieniasz. W międzyczasie całe wyświetlanie robi się samo:

https://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf

https://allegro.pl/oferta/sterownik-wyswietlacza-led-max7219-cng-dip24-7473863359

https://allegro.pl/oferta/wyswietlacz-led-8x7-segmentowy-max7219-arduino-dem-7702259799

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Rozważałem układ MAX7219 ale nie byłem pewien, czy będzie działał z wyświetlaczami o wspólnej anodzie (które akurat już posiadałem). Widziałem różne artykuły na ten temat (np. ten), ale nadal nie byłem pewien, czy jest to możliwe. Dlatego mój wybór padł na 74HC595 plus PCF8574.

Udostępnij ten post


Link to post
Share on other sites

W temacie driverów jest tak, że tranzystor wsysający prąd z układu do masy będzie zawsze lepszy niż tranzystor wpychający prąd z plusa zasilania do układu. Z kolei driver wyświetlacza jest wysoce niesymetryczny: to co steruje wspólnymi elekrodami wyświetlaczy zapala całe cyfry więc musi przeżywać sumę prądów wszystkich segmentów na jednym drucie. Druga strona ma łatwiej, bo przez każde wyjście płynie prąd tylko jednego segmentu. Łącząc te dwa fakty wypływa prosty wniosek: o wiele łatwiej zrobić wyświetlacz multipleksowany ze wspólna katodą. Wtedy duże prądy całych cyfr płyną do masy przez tranzystory npn lub NMOS a segmenty są sterowane "od góry" przez zawsze słabsze pnp lub PMOS. Dokładnie taka konstrukcja została użyta w MAX7219 - tam driver wspólnych katod ma wydajność 320mA i wsysa prąd od masy a driver segmentów może wypuszczać z plusa zasilania 8 razy mniej: 40mA. Rozwiązanie odwrotne byłoby dziwne i drogie z punktu widzenia konstrukcji scalaka. Pewnych rzeczy (tutaj: fizyki półprzewodników) nie przeskoczysz.

Jeżeli już chciałeś pójść po kosztach, to trzeba było przede wszystkim wziąć wyświetlacze w ze wspólną katodą bo tak naprawdę nie ma dobrych driverów od plusa. Wysokoprądowe wyjścia open-collector mają np. rejestry przesuwające od Texasa:

https://www.tme.eu/pl/details/tpic6b595n/rejestry-przesuwne/texas-instruments/

Coś takiego możesz podłączyć wprost do katody i cieszyć się prądem maksymalnym 0.5A bez żadnych dodatkowych tranzystorów. Dajesz takie trzy w szereg i masz załączanie 24 cyfr.Acha, przy okazji: nie musisz za każdym razem przeładowywać 24 bitów po SPI. Wystarczy, że po włączeniu zasilania wyzerujesz wszystkie rejestry HC595, potem na początku skanowania do pierwszego wpiszesz jedną jedynkę (to tylko 1 impuls zegara) a potem będziesz tę jedynkę "popychał" za każdym razem gdy zmieniasz wyświetlacz.

Wracając do projektu, mając dobre sterowanie katod wystarczyło wtedy 8 tranzystorów pnp na wyjściu ekspandera i miałbyś dowolnie dobry driver segmentów.

Teraz to nie wiem co planujesz. Jak wynik eksperymentów z pomiarem napięcia na wyjściu HC595? Możesz przy okazji, wstanie statycznym zmierzyć napięcie na oporniku szeregowym 470R, to da pojęcie o rzeczywiście płynącym prądzie segmentu.Ile katalogowo mA potrzebują te Twoje wyświetlacze do sensownej jasności? Przy multipleksowaniu 1:24, do utrzymania jasności katalogowej musisz zapewnić prąd tak z 8-12 razy większy.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@marek1707 Spowolniłem wyświetlanie każdej cyfry i zmierzyłem napięcie. Nie wiem czy zrobiłem to dobrze (jedna końcówka do wyjście 74HC595, druga w masę) i wyszło mi 4.52V przy wyświetlonej cyfrze 0 (bez kropki).

Co do wyświetlaczy to takie akurat miałem i chciałem najpierw wypróbować to rozwiązanie. Trudno na nich znaleźć jakieś oznaczenia, więc nie wiem też ile katalogowo pobierają prądu aby sensownie świecić (edit: Widać, że pojedynczy świeci mocniej dla tego samego prądu co pozostałe).

Jeśli chodzi o układ MAX7219 to bez problemu można go kupić, ale wyświetlacze to już jest jakaś egzotyka, a przynajmniej na Allegro. Kompletny brak oznaczeń czy wspólna jest anoda czy katoda. Na aukcjach z oznaczeniami przeważają o wspólnej anodzie, a wspólna katoda jak już jest to pojedyncze w dziwacznej cenie (rzędu 4+ zł za jedną cyfrę).

Wpadł mi w oczy jeszcze układ TM1637, obsługuje wspólną anodę i do 6 cyfr, ale też trudno go znaleźć, są jedynie gotowe zestawy z wyświetlaczami.

Edytowano przez kauczuk79
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

To przestań szukać w śmietniku, umyj ręce i idź do lepszej dzielnicy. W ogóle oglądanie i próby porównywania elementów bez podanych podstawowych parametrów (a już choćby nazw) to jak kupowanie kota w worku: czasem zdarzy się może i żywy, ale w większości przypadków dostaniesz wypchane truchło. No i jeszcze: nic za darmo. Jeżeli szukasz po taniości, to to właśnie dostaniesz. Nie oczekuj wtedy wysokiej jakości, trzymania parametrów czy małych rozrzutów. Przykładowo: nawet słabszy wyświetlacz dobrej firmy o niezbyt wygórowanej jasności, ale gwarantowanej powiedzmy w zakresie 2.5-3mcd będzie droższy niż podejrzany 3-9mcd. W tym pierwszym projektujesz driver na co prawda trochę większy prąd, ale każdy taki sam, podłączasz i każda cyfra jest kropka w kropkę (to chyba z rosyjskiego?) taka jak sąsiadka. W tym drugim kupujesz (trochę taniej, hurra) 16 wyświetlaczy z tego może połowa świeci fajnie, kilka jakoś słabiej a w dwóch paru segmentów prawie nie widać. Co robisz? Kupujesz kolejnych 8 i z nich wybierasz 4 brakujące? To jest właśnie "taniość". Im słabiej (lub wcale) przetestowane struktury LED i pakowane w plastik w gorszych warunkach tym produkt jest tańszy, to tu są główne oszczędności.

Zmień swoje przywyczajenia grzebania w kontenerze aukcji i zaczynaj od miejsc, które coś gwarantują, pierwsze z brzegu:

https://botland.com.pl/pl/706-wyswietlacze-segmentowe-i-matryce-led?ekran-typ*=segmentowy-led

https://www.tme.eu/pl/katalog/wyswietlacze-led-pojedyncze_112918/

Wybierasz po kolorze, jasności, liczbie cyfr, polaryzacji a przy ponad pół tysiącu dostępnych od ręki typów w końcu coś znajdziesz. I co ważne: takie planowanie zaczynasz przed rozpoczęciem jakichkolwiek prac projektowych. Szacujesz co Ci potrzebne, jakie paramtery musi spełniać i tego szukasz. Nie ma (wymyśliłeś coś nierealizowalnego) lub za drogie? Spuszczasz z tonu, przełączasz się na niższy poziom i przeprojektowujesz elektronikę lub zmieniasz założenia, ale to wszystko robisz bezkosztowo (nie licząc swojego czasu, no ale to hobby - akurat czasu pożera dowolne ilości). W zasadzie gdy masz gotowy, narysowany i policzony  schemat i przystępujesz do zakupów a potem montażu to wszystko już powinno być wiadomo. Im dalej w projekcie natkniesz się na pułapkę tym nawrót i jej ominięcie będzie droższe.

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Akurat wybór na Botland jest bardzo skromny - pojedyncze i podwójne wyświetlacze są innego typu jak np. potrójne i poczwórne. Dodatkowo w innych kolorach. I weź tu coś dobierz jak potrzebujesz 5 cyfr (u mnie np. potrzeba 3x3 + 2x5) w tym samym kolorze o tej samej jasności i jeszcze o wspólnej katodzie w sklepie, który ma łącznie tylko 22 różne wyświetlacze.

Zakupiłem 3xMAX7219 i jak sprawdzą się z aktualnymi wyświetlaczami to dobrze, nie chcę brnąć w koszty jak mam już wyświetlacze (no name, ale świecą wszystkie równo oprócz tego pojedynczego). Jeśli nie zadziała, to na TME jest duży wybór więc może się coś znajdzie tego samego typu w różnych rozmiarach. Jak nie, to złożę z samych pojedynczych, też jest dobra opcja bo na TME 10+ zawsze jest taniej niż np. 2 sztuki. A do tego może trafią się nawet bursztynowe, które były by wizualnie idealne.

Projekt jest na razie na płytce doświadczalnej i z rzeczy które mam akurat w swoim "śmietniku" z zestawów startowych Arduino, nie mam jeszcze takiej wiedzy żeby zaprojektować coś i będzie to od razu działać. Zanim zrobię coś co działa to poprzedzają to różne testy właśnie na tej płytce.

Udostępnij ten post


Link to post
Share on other sites

Robiąc jedno duże pole wyświetlaczy nigdy nie składaj tego z różnych typów, nawet jeśli są jednego producenta i mają podobne oznaczenia, jasności itp. Od razu zdecyduj się np. na wszystkie pojedyncze i takie wstaw. Ciułanie z poczwórnych, podwójnych i pojedynczych jest właśnie taką pozorną oszczędnością. Różne typy robione są w różnym czasie z różnych partii struktur LED i mała szansa, by świeciły tak samo. I to nie tylko chodzi o jasność, ale także o kolor. Przecież LEDy też mają swoje tolerancje barwy a żywica do zalewania segmentów nie jest zawsze taka sama. Co więcej, nawet wyświetlacze robione pół roku później mogą być lekko inne niż ich starsi bracia tego samego typu. Dlatego kupuj od razu tyle ile potrzebujesz w jednym strzale, w jednym sklepie, jednego typu i najlepiej z jednej dostawy.

MAX 7219 jest do wspólnych katod a jeśli dobrze zrozumiałem masz anody. Będziesz wszystko odwracał tranzystorami czy jak? Czy raczej myślałeś już o zakupach nowych wyświetlaczy i drugim podejściu? Co to będzie? pokazujesz jakieś kursy walut, temperatury w 5 pokojach  czy vintage'owa gra typu Lądowanie na Księżycu?

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

MAX7219 ma piny segmentów oraz piny katod które podświetlają konkretne cyfry. Jest kilka tutoriali (np. ten), na których dane wysyłane są odwrotnie - segmenty do rejestrów odpowiedzialnych za znaki (katody), a z pinów oznaczonych jako segmenty robione są anody. Chcę przetestować takie rozwiązanie. Nawet jeśli jasność nie będzie powalająca a będzie lepsza niż obecnie to mi nie będzie przeszkadzać.

Projekt bedzie takim wstępem do budowy domowego symulatora lotu na bazie Arduino komunikującego się przez port szeregowy z Microsoft Flight Simulator X i wyświetlającego dane na temat lotu. Jako pierwszy chcę zbudować panel autopilota (wzorowany na tym z Boeinga 737) i wyświetlacze będą wyświetlać zadaną prędkość, kurs, wysokosc itp. Do tego jakieś przełączniki, diody, enkodery żeby te parametry móc zmieniać. Ale główny cel to nauczyć się czegoś z elektroniki 😉

Udostępnij ten post


Link to post
Share on other sites

To rzeźba, nie wchodziłbym w to. Takie "haki" są dobre dla domorosłych majsterkowiczów. Podłączając odwrotnie wyświetlacze nie tylko nie wykorzystujesz prądów wyjściowych scalaka (zapłaciłeś za nie), ale narażasz się na to że cyfry będą świeciły różnie w zależności od liczby zapalonych segmentów. Popatrz: MAX steruje jasnością wyświetlaczy poprzez regulację prądów segmentów. Nie ma tu oporników, są za to źródła prądowe. Masz tam ustawianie 100% prądu jednym opornikiem "master" a potem programowe przyciemnianie w 16 krokach. Teraz jeśli do wyjść segmentów podłączysz wspólne katody to prąd będzie regulowany/ograniczany "na całą cyfrę" a nie na jeden segment jak było w zamyśle projektantów tego chipu. To nie jest symetryczne. Teraz to  cyfra będzie musiała podzielić przyznaną jej i stabilizowaną sumę prądu na zapalone w niej segmenty. Jeśli ustawisz opornikiem powiedzmy Imax=10mA to przy jedynce każdy segment dostanie 5mA a przy ósemce tylko 1.25mA. A prąd przekłada się w LEDach w zasadzie liniowo na jasność.W normalnym podłączeniu wspólnych katod, przez każdy zapalony segment będzie płynąć ustawione 10mA i wtedy taka regulacja ma sens. Widzisz różnicę?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »

×