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

[ATmega16][C] Matryca LED 8x8 Słaba jasność świecenia diod

mgiro 10 Lip 2010 12:50 9440 51
  • #1 8279605
    mgiro
    Poziom 22  
    Witam,

    Zbudowałem matryce LED 8x8. Schemat niżej:

    [ATmega16][C] Matryca LED 8x8 Słaba jasność świecenia diod

    Mam problem z jasnością świecenia diod. Przy malej częstotliwości jest ok, ale gdy zwiększę do 800Hz lub 1600Hz to jasność świecenia zmniejsza się praktycznie dwukrotnie.

    Zastosowałem diody LED 5mm czerwone JSL501HD (http://www.lispol.com/p/1126/Dioda%20LED%205mm%20czerwona) [ATmega16][C] Matryca LED 8x8 Słaba jasność świecenia diod

    Długość emitowanej fali : 700 nm
    Jasność : 10 mcd
    kąt świecenia : 60'
    Temp. pracy : -40' .... +80'
    If : 25mA
    Vf : 2.0V


    Zmieniłem rezystory R9...R16 na 100 omów. Później zmieniłem rejestr przesuwny na 74HC595. Efekt dalej ten sam.

    Ktoś miał podobny problem?? Co może być przyczyną takiego zachowania??
  • #2 8279718
    mirekk36
    Poziom 42  
    Po co ci takie duże częstotliwości odświeżania ??? to po pierwsze. Warto ustawić tylko ciut ponad to żeby nie było widać migotania nawet kątem oka.

    Po drugie rezystory 100R są duuuużo za duże dla takiego multipleksowanego wyświetlania, szczególnie, że masz tak słabiutkie diody 10mcd.

    Rejestry przesuwne nie mają nic wspólnego z jasnością tym bardziej, że po drodze i tak buforujesz to tranzystorami.

    Dobierz doświadczalnie rezystory na poziomie 22R albo i mniej jeśli będzie trzeba, tylko później nie dopuszczaj żeby wystąpiło wyświetlanie statyczne. Jeśli już dopracujesz sobie program do obsługi matrycy to wtedy po prostu włożysz te małe rezystorki i będzie ok ;)

    Dodano po 2 [minuty]:

    OOO matko dopiero teraz zobaczyłem, może zamiast zmniejszania rezystorów dla diod LED, zmniejsz najpierw i to mocno wartości rezystorów na bazach wszystkich tranzystorów. Masz tam 10K ??? albo 4,8K ????

    daj 2,2K max albo i 1K
  • #3 8279766
    mgiro
    Poziom 22  
    Przy mniejszej niż okolo 500Hz widać migotanie. Większa częstotliwość odświeżania jest zła??

    To dlaczego przy małej częstotliwości odświeżania diody świecą ok?? Przez diody płynie prąd około 22mA, z tego obliczyłem. To przy większej częstotliwości odświeżania prąd chyba płynie ten sam, tylko znacznie krócej.

    Rezystory na bazy dałem wg schematu. Dlaczego są złe??
  • #4 8280114
    gaskoin
    Poziom 38  
    mgiro napisał:

    Przez diody płynie prąd około 22mA, z tego obliczyłem. To przy większej częstotliwości odświeżania prąd chyba płynie ten sam, tylko znacznie krócej.


    nie zdążą się rozświetlić
  • #5 8280169
    mgiro
    Poziom 22  
    To czyli jak to pogodzić najprościej??
  • #6 8280227
    Mat_91
    Poziom 25  
    Zmniejszyć rezystory tak jak radzi mirekk36 i zmniejszyć częstotliwość. Pomoże.
  • #7 8280288
    janbernat
    Poziom 38  
    "nie zdążą się rozświetlić"
    # LED response times are typically in the range 10 ns to 100 ns.
    # LED efficiency peaks in the 10 mA to 30 mA range.
    # Typical thermal response times with LED chips are about 1 ms.
    Natomiast zasilacz z kondensatorem 100uF to może być mało przy większej częstotliwości.
    Po prostu zasilacz może "nie zdążyć" naładować kondensatora.
    No i montaż- indukcyjności doprowadzeń, pojemności pasożytnicze i inne paskudztwa.
    P.S.
    A rezystorki zmniejszyć- tak jak mirek radzi.
    Przy tym wypełnieniu to LED powinien wytrzymać ok. 100mA w impulsie.
    (Uzas-Uled)/Iled=(5-2)/100=30 [V, mA, Ohm]
  • #8 8280359
    mgiro
    Poziom 22  
    Rezystory R9...R16 zmniejszyłem na 47 omów oraz rezystory R1...R8 z 10k na 1k.

    Sprawdzałem częstotliwość, przy 700Hz nie ma migotania dopiero.

    Diody niestety nie chcą świecić jaśniej.

    Po tych zmianach powinno chociaż odrobinę się poprawić.
  • #9 8280432
    janbernat
    Poziom 38  
    A oscyloskop jakiś masz?
    Przy tych częstotliwościach i wartościach napięcia to nawet program zmieniający kartę dźwiękową na oscyloskop by się nadał.
  • #10 8280437
    mgiro
    Poziom 22  
    janbernat, zastosowałem kondensator 1000uF/25V. Niestety to tez nie pomogło ;/

    Teraz przy rezystorze 47 omów => (Uzas-Uled)/Iled=(5-2)/47=64 [V, Ohm, mA].

    64mA to już znaczny prąd.
  • #11 8280476
    janbernat
    Poziom 38  
    No to tego "oscyloskopu" poszukaj w sieci.
    P.S.
    [V, Ohm, mA].
    Zmieniłeś kolejność - to ma znaczenie.
    :D:D:D
  • #12 8280513
    mgiro
    Poziom 22  
    Zmniejszyłem rezystory z 47omów na 22 omy.

    U[V] = R[Ohm]*I[A]

    (Uzas-Uled)/R=(5-2)/22=136 [V, Ohm, mA].

    Diody świecą trochę lepiej, ale przy małej częstotliwości odświeżania świeciły około dwa razy jaśniej.

    Już rezystorów nie można zmienić na mniejsze(10 Ohm), bo prąd chyba będzie za duży(300mA).
  • #13 8280565
    janbernat
    Poziom 38  
    No, 22Ohm- to już trochę ryzykownie.
    Ale tylko trochę.
    A ten program już znalazłeś?
    No i bezwładność oka.
    W zasadzie jak tym sterujesz?
  • #14 8280601
    mgiro
    Poziom 22  
    Używam rejestru przesuwnego. Podaję na wejście układu 74HC595 impuls i przesuwam go osiem razy. Dzięki temu zapalają się kolumny od lewej do prawej. Za każdym razem podaję sekwencję na ośmio-bitowa na W1...W8 i dzięki temu zapalają się w odpowiednich wierszach diody.

    Jaki program miałem znaleźć???
  • #15 8280634
    janbernat
    Poziom 38  
    Oscyloskop na kartę dźwiękową.
  • #16 8280636
    szelus
    Poziom 34  
    Intuicja mi podpowiada, że problem leży w programie sterującym - faza ładowania danych dla kolejnej kolumny (do rejestrów szeregowych) trwa zbyt długo.
    Przy kilkuset Hz już dawno nie ma prawa nic migotać. Podejrzewam, że tam wcale nie ma tych 700Hz, tylko statyczne opóźnienie (faza "świecenia") ma 1/700 sekundy. Natomiast ładowanie danych, w czasie którego wyświetlacz pozostaje całkowicie wygaszony trwa znacznie więcej. Dlatego słabo świeci.
    Oczywiście, to wszystko wróżenie z fusów...
  • #17 8280656
    janbernat
    Poziom 38  
    szelus:
    Z ust mi to wyjąłeś.
    Ale ja tylko nieśmiało spytałem:
    "W zasadzie jak tym sterujesz?"
  • #18 8280680
    szelus
    Poziom 34  
    A jednak czytałem niedokładnie...
    mgiro napisał:
    Używam rejestru przesuwnego. Podaję na wejście układu 74HC595 impuls i przesuwam go osiem razy. Dzięki temu zapalają się kolumny od lewej do prawej. Za każdym razem podaję sekwencję na ośmio-bitowa na W1...W8 i dzięki temu zapalają się w odpowiednich wierszach diody.

    Jak kolumny? Na tym schemacie rejestr wybiera wiersze, a Wx kolumny.
  • #19 8280704
    mgiro
    Poziom 22  
    Tutaj kod programu:

    
    #define ROZMIAR_TAB 185
    #define ILOSC_KOLUMN 8
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include "dane.h"
    
    volatile uint8_t licznik = 0;
    volatile uint16_t licznik_czas = 0;
    volatile char licznik_zbocze=1;
    //uint8_t tablica[9] = {0b11111111, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000};
    //uint8_t tablica[3] = {0b11111111, 0b00000000, 0b00000000};
    //uint8_t tablica[9] = {0b11111111, 0b11111110, 0b11111101, 0b11111011, 0b11110111, 0b11101111, 0b11011111, 0b10111111, 0b01111111};
    //uint8_t tablica[8] = {0b01111100, 0b01111000, 0b01110010, 0b01100110, 0b01001110, 0b00011110, 0b00111110, 0b11111111};
    //uint8_t tablica[17] = {0b11111111, 0b10011110, 0b00001110, 0b01101110, 0b01101110, 0b01101110, 0b01100000, 0b01100001, 0b11111111, 0b01111100, 0b01111000, 0b01110010, 0b01100110, 0b01001110, 0b00011110, 0b00111110, 0b11111111};
    //uint8_t tablica[11] = {0b11111111, 0b01111111, 0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111, 0b10111111, 0b10111111};
    static uint8_t dana = 0;
    
    int main (void)
    {
    	
    	DDRA = 0x03; // Ustawienie bitu LED jako wyjścia
    	DDRD = 0xff; //	DDRD |= (1 << 0); // Ustawienie bitu LED jako wyjścia
    	DDRC |= (1 << 0); //	DDRC = 0x03;
    	TCCR1B |= (1 << WGM12); // Ustawia timer w tryb CTC
    	OCR1A = 22; // **15625** Ustawia wartość pożądaną na XXXHz dla preskalera 1024
    	TCCR1B |= ((1 << CS12) | (1 << CS10)); // Ustawia timer z preskalerem Fcpu/1024
    	TIMSK |= (1 << OCIE1A); // Zezwolenie na przerwania dla CTC
    	sei(); // Zezwolenie globalne na przerwania
    //	PORTC = ~0x03;
    	while(1)
    	{
    		
    	}
    }
    ISR(TIMER1_COMPA_vect)
    {
    
    	licznik_czas++;
    	if(licznik_czas > 2000) // odmierzanie czasu po ktorym jest przesuniecie w lewo wyswietlanego obrazu na matrycy
    	{
    		dana++;
    		if(dana>ROZMIAR_TAB) // zliczanie liczby przesuniec
    		{
    			dana=1;
    		}
    		licznik_czas=0;
    	}
    
    	if((licznik+dana)>ROZMIAR_TAB)
    	{
    		PORTD = napisy((licznik+dana)-ROZMIAR_TAB); // zapalanie odpowiednich wierszy
    	}
    	else
    	{
    		PORTD = napisy(licznik+dana); // zapalanie odpowiednich wierszy
    	}
    	
    	if(licznik<1)
    	{
    		PORTC = 0x01; // impuls na DS(nozka 14)
    	}
    	else
    	{
    		PORTC = 0x00;
    	}
    	if(licznik_zbocze)
    	{
    		PORTA = 0x01; // ST_CP(nozka 12)  oraz SH_CP(nozka 11)
    		licznik_zbocze = 0;
    
    	}
    	else
    	{
    		PORTA = 0x00; // zbocze narastajace na ST_CP  oraz SH_CP
    		licznik_zbocze=1;
    		licznik++;	
    		if(licznik > ILOSC_KOLUMN)
    		{
    			licznik = 0;		
    		}
    	}
    }
    


    Ogolnie nożkę 11 i 12 mam połączoną. Odpowiednie wiersze zapalam poprzez wczytanie z tablicy słowa 8-bitowego.

    Nozka 10 (MR) do VCC
    Nozka 13 (OE) do GND
  • #20 8281955
    janbernat
    Poziom 38  
    Jeszcze jak by był plik "dane.h" i częstotliwość jaka jest ustawiona w makefile to mógłbym to wgrać w AT32 i zmierzyć oscyloskopem.
  • #21 8282043
    mgiro
    Poziom 22  
    dane.h

    
    #include <avr/pgmspace.h>
    #include <inttypes.h>
    
    //prog_uint8_t tablica[17] PROGMEM = {0b11111111, 0b10011110, 0b00001110, 0b01101110, 0b01101110, 0b01101110, 0b01100000, 0b01100001, 0b11111111, 0b01111100, 0b01111000, 0b01110010, 0b01100110, 0b01001110, 0b00011110, 0b00111110, 0b11111111};
    //prog_uint8_t tablica[11] PROGMEM = {0b00100111, 0b01111111, 0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111, 0b01111111, 0b01111111};
    
    prog_uint8_t tablica[186] PROGMEM = {0b11111111, 0b10011110, 0b00001110, 0b01101110, 0b01101110, 0b01101110, 0b01100000, 0b01100001, 0b11111111,
    0b01111100, 0b01111000, 0b01110010, 0b01100110, 0b01001110, 0b00011110, 0b00111110, 0b11111111,
    0b00000001, 0b00000000, 0b11111110, 0b11111110, 0b11111110, 0b00000000, 0b00000001, 0b11111111,
    0b00000000, 0b00000000, 0b11101111, 0b11101111, 0b11000111, 0b00010000, 0b00111000, 0b11111111,
    0b10000000, 0b00000000, 0b01101111, 0b01101111, 0b01101111, 0b00000000, 0b10000000, 0b11111111,
    0b00000000, 0b00000000, 0b10111111, 0b11011111, 0b10111111, 0b00000000, 0b00000000, 0b11111111,
    0b11111111, 0b11111111,
    0b00000000, 0b00000000, 0b01110111, 0b01110111, 0b01110111, 0b00000111, 0b10001111, 0b11111111,
    0b00000000, 0b00000000, 0b01101111, 0b01101111, 0b01101111, 0b00000000, 0b10010000, 0b11111111,
    0b10000000, 0b00000000, 0b01101111, 0b01101111, 0b01101111, 0b00000000, 0b10000000, 0b11111111,
    0b10000001, 0b00000000, 0b01111110, 0b01111110, 0b01111110, 0b00011000, 0b10011001, 0b11111111,
    0b00011111, 0b00001111, 0b11100000, 0b11100000, 0b00001111, 0b00011111, 0b11111111, 0b11111111,
    0b01111111, 0b01111111, 0b00000000, 0b00000000, 0b01111111, 0b01111111, 0b11111111, 0b11111111,
    0b00000000, 0b00000000, 0b01101110, 0b01101110, 0b01101110, 0b01111110, 0b11111111, 0b11111111,
    0b00000000, 0b00000000, 0b11111110, 0b11111110, 0b11111110, 0b11111110, 0b11111111, 0b11111111,
    0b11111100, 0b11111100, 0b11111111, 0b11111111, 
    0b00011110, 0b00001110, 0b01101110, 0b01101110, 0b01101110, 0b01100000, 0b01110001, 0b11111111,
    0b10000001, 0b00000000, 0b01111010, 0b01110110, 0b01101110, 0b00000000, 0b10000001, 0b11111111,
    0b11011111, 0b10111111, 0b00000000, 0b00000000, 0b11111111, 0b11111111,
    0b10011110, 0b00001110, 0b01101110, 0b01101110, 0b01101110, 0b00000000, 0b10000001, 0b11111111,
    0b10011001, 0b00011000, 0b01111110, 0b01101110, 0b01101110, 0b00000000, 0b10010001, 0b11111111,
    0b01111111, 0b01111111, 0b01110000, 0b01100000, 0b00001111, 0b00011111, 0b11111111,
    0b10011110, 0b00001110, 0b01101110, 0b01101110, 0b01101110, 0b00000000, 0b10000001, 0b11111111,
    0b10011001, 0b00011000, 0b01111110, 0b01101110, 0b01101110, 0b00000000, 0b10010001, 0b11111111,
    0b11011111, 0b10111111, 0b00000000, 0b00000000, 0b11111111, 0b11111111};
    
    
    //prog_uint8_t tablica[11] PROGMEM = {0b11111111, 0b01111111, 0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111,0b01111111, 0b10111111, 0b10111111};
    
    uint8_t napisy(uint8_t kolumna)
    {
    	return pgm_read_byte(&tablica[kolumna]);
    }
    


    Częstotliwość kwarcu 16MHz.
  • #22 8282700
    janbernat
    Poziom 38  
    PA.0 340Hz
    PD.0 38 Hz wypełnenie ok.1/4
    PD.1 38Hz wypełnienie ok. 3/4 po chwili impulsy podwójne 2.8ms i 11.6ms
    PD.2 38Hz - PD.7 też 38Hz.
    Wypełnienie też się zmienia.

    ATmega32 16MHz.
    A- jeszcze PC.0- 38Hz impulsy 3.2ms
  • #23 8282878
    mgiro
    Poziom 22  
    to czyli chyba dobrze w programie jest??
  • #24 8283018
    janbernat
    Poziom 38  
    Program to się kompiluje bez ostrzeżeń- wgrywa i coś robi- i to wszystko co mogę na ten temat powiedzieć.
    A to zwykle jest 10% sukcesu.
    Bo co robi i jak- to jest dopiero wyzwanie.
    W C to jestem początkujący i Twojego programu nie zmieniałem.
    Co mnie niepokoi- impulsy z PD.x nieco "skaczą" względem impulsów z PC.0.
    Może obsługa przerwania jest zbyt długa.
  • #25 8283508
    mgiro
    Poziom 22  
    ok, spróbuje skrócić obsługę przerwania. Najważniejsze sa PA.0 oraz PC.0 (linia zegarowa, linia danych). PD.x steruje liniami wierszów.
  • #26 8283833
    Andrzej__S
    Poziom 28  
    Drobna uwaga co programu:
    mgiro napisał:

    
          if(licznik > ILOSC_KOLUMN)
    



    Jeśli kolumn jest 8, a indeksowane są od 0 to ostatnia kolumna ma indeks 7.
    Ty iterujesz licznik do 8 w związku z czym powstaje pewne opóźnienie pomiędzy wyświetlaniem ostatniej (licznik=7) kolumny i pierwszej (licznik=0) kolumny. To opóźnienie zapewne także ma wpływ na wypadkową jasność diod, bo przecież wypełnienie impulsów sterujących zmienia się.
    Być może to nie jedyna przyczyna, ale spróbuj zmienić znak > na >=.

    Poza tym (IMHO) lepiej jest na początku obsługi przerwania umieścić operacje na portach, a pod koniec skalkulować to, co ma być wyprowadzone na porty na początku następnego przerwania. Obliczenia przecież trwają różną ilość czasu w zależności od spełnionych aktualnie warunków. Jeśli umieszczamy obliczenia na początku, to szerokość impulsów sterujących może być niestabilna. Chociaż może przy 16MHz zegarze nie ma to aż tak dużego znaczenia.
  • #27 8284371
    mgiro
    Poziom 22  
    ok, poprawie to :)
  • #28 8284392
    janbernat
    Poziom 38  
    Fakt 340/38= 8,95 czyli 9 z dokładnością pomiaru częstotliwości.
  • #29 8284874
    Andrzej__S
    Poziom 28  
    mgiro napisał:

    ok, poprawie to


    Obawiam się, że to radykalnie nie pomoże. Różnica w wypełnieniu to tylko nieco ponad 10%.

    Zastanawia mnie jeszcze coś innego. Zasilasz to z 5V?
    Jaki to zasilacz?
    Jaka jest wydajność prądowa zasilacza (stabilizatora, transformatora)?
    Jakie jest faktyczne napięcie zasilające Twój układ?
    Tranzystory sterujące masz dokładnie takie jak na schemacie?

    mgiro napisał:

    Teraz przy rezystorze 47 omów => (Uzas-Uled)/Iled=(5-2)/47=64 [V, Ohm, mA].


    Myślę, że przy napięciu zasilającym 5V należy wziąć pod uwagę napięcia nasycenia tranzystorów sterujących, które mogą być w tym przypadku nie bez znaczenia - w obwodzie diody są dwa złącza CE - szczególnie przy większych prądach. Np. BC337 może mieć maks. napięcie nasycenia nawet 0.7V (według danych katalogowych). Przy większym prądzie zwiększa się też spadek na samej diodzie LED.

    Przy okazji, uważaj trochę na te rezystorki. Przy tych wartościach prąd może już przekraczać dopuszczalne wartości tranzystorów.
  • #30 8284971
    janbernat
    Poziom 38  
    BC337 ma 800mA max.
    A BC 307100mA- i te bym zmienił na BC327.
    Uce=0.7V jest przy 500mA.
    Ale faktycznie przy proponowanych 150mA mogą mieć 0.3- 0.4V.
REKLAMA