Elektroda.pl
Elektroda.pl
X
Mitronik
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32F103][C]Sprzętowe sterowanie LED WS2812 na STM32 plus 3xNAND

ex-or 06 Lut 2018 00:28 3906 43
  • #31 06 Lut 2018 00:28
    3099750
    Użytkownik usunął konto  
  • Mitronik
  • #32 06 Lut 2018 02:12
    simw
    Poziom 20  

    Jeden prosty test właściwie wszystko uzasadnił.

    Zejście z napięciem od 5 przez 4.5 do 4.2 przygasiło znacznie diody, zatem wszystko wskazuje, że diody nie są zasilane ze źródeł prądowych. To jest podstawowy wniosek i to kluczowy.

    Spadek napięcia, o ok 10%, już znacznie wpłynął na główną cechę układu, tj świecenie diód, zmienił się punk pracy wszystkich diód, zmniejszył się prąd, zatem spadło napięcie na diodach i również poziom jasności.
    Napięcie zasilania spadło, a na układzie sterującym diodę także spadło, hura diody się nie grzeją, ale na boga również "nie świecą".

    Zaoszczędziliśmy trochę mocy odkładającej się układzie sterującym diody, ale diody świecą słabiej, wiec do kitu z taką metodą, to samo zrobimy PWM i to jest bezsens tej całej Twojej metody z obniżaniem napięcia i to jeszcze z diodą Shotkyego.

    To jest to samo co z lodówką, niektórym się wydaje jak otworzą drzwiczki to będzie chłodniej w kuchni.

    Ty zrobiłeś to samo. Obniżyłeś napięcie na diodach i mniej świecą (co wykazałem m.in. pomiarami i pomiarem jasności "na oko") zarazem zmniejszyłeś moc strat na nieźródłach i wydaje Ci się, że oszczędzasz diody.

    Twoje wyliczenia 1.8, 3.2 nie mają w tym przypadku żadnego sensu, tym bardziej mityczne led characteristics z niby noty katalogowej, co to wymusza 50us do resetu.

    Porównaj to teraz do undervoltingu w prockach.
    Po to się to robi, obniża napięcie, żeby wydzielała się mniejsza moc PRZY TAKIEJ SAMEJ CZĘSTOTLIWOŚCI (czytaj wydajności).
    Twój underwolting również zmniejszył częstotliwość, co w kontekście utraty wydajności jest po prostu BEZ SENSU, bo mogłeś obniżyć zegar w biosie, bez dodatkowego babrania się.

    Dodano po 4 [minuty]:

    AnicoZ napisał:
    BlueDraco napisał:
    kiedy zasilanie ma 5V, a LED 3.2 V. Zdaniem kol. simw nie da się zgadnąć. No to może niech kol. simw uzasadni, w jaki sposób mogłaby to być jakaś inna wartość niż 1.8 V

    Led każdego koloru mają taki sam spadek napięcia?
    Ledy różnych producentów mają taki sam spadek napięcia?


    To akurat jest w nocie:
    https://cdn-shop.adafruit.com/datasheets/WS2812.pdf
    tzw. led chatacteristics.

    Teoretycznie te diody pobierają w sumie 168 mW. Moje pomiary wykazały 125 mW dla całego układu.
    Nota notą, a Chińczycy po swojemu.

  • #33 15 Kwi 2018 21:53
    ex-or
    Poziom 17  

    Temat się trochę przeleżał, w międzyczasie zajmowałem się czymś innym, ale teraz znów wróciłem do tych świecidełek i chciałem coś jeszcze dopisać.
    Na samym początku chciałem podziękować wszystkim wypowiadającym sie w temacie. Wszystkie wypowiedzi są dla mnie cenne, także te nieprzychylne :-). Dziękuję jeszcze raz.
    Chciałem się także wytłumaczyć z zastosowania UCY7400. A więc zrobiłem to trochę dla jaj ale przede wszystkim dlatego, że innego, bardziej odpowiedniego układu wtedy nie miałem. W zasadzie do samych testów układ jest wystarczający, do zastosowania "produkcyjnie" nie bardzo, ale też nikogo do stosowania TTL nie namawiałem :-)
    Teraz do testów zaopatrzyłem się w 74HCT00 i nowy pasek ledowy i od razu pojawił się zgrzyt: nowe WS2812B mają pozmieniane niektóre parametry, w tym czas resetu, który został znacznie wydłużony. Tutaj jest jakiś komunikat na ten temat: Link. Ponadto zauważyłem dosyć dziwne zachowanie diod, mianowicie po pewnym czasie świecenia na "full" niektóre diody zaczynają tracić kolory.
    [STM32F103][C]Sprzętowe sterowanie LED WS2812 na STM32 plus 3xNAND
    Widać, że jedna dioda świeci na czerwono, inna na żółto. Przy wysterowaniu paska kolorem tylko zielonym lub niebieskim dioda "czerwona" w ogóle nie świeci, żółta świeci na zielono, a nie świeci na niebiesko (albo na odwrót). W trakcie świecenia taśmy efekt ten pojawia się w coraz większej ilości diod. Po całkowitym wyłączeniu paska po pewnym czasie diody się "regenerują". Widać też na fotce, że na poszczególnych diodach kolor biały ma różny odcień. Trochę rozczarowujące :-/

    Główną przyczyną odkopania tematu są niewielkie zmiany w programie. Zamknąłem kod w bardziej zdatnych do użycia funkcjach i dodałem trochę komentarzy mogących pomóc w przeniesieniu na inny zestaw peryferiów. Wprowadziłem także niewielką modyfikację w wygenerowanego sygnału "zera", który jest teraz zanegowany, dzięki czemu można się pozbyć jednej bramki. Część hardwareowa wygląda w tej wersji tak:

    [STM32F103][C]Sprzętowe sterowanie LED WS2812 na STM32 plus 3xNAND

    W załączeniu kody źródłowe (częściowo: oprócz main.c pliki wygenerowane przez CubeMX zostały pominięte). I jeszcze filmik z działania.


    Link

  • Mitronik
  • #34 16 Kwi 2018 08:42
    simw
    Poziom 20  

    Szacun :) Fajnie to wyszło. Tym razem biblioteka wydaje się bardziej przejrzysta i super, że jest wersja na taki budżetowy procesor. Teraz tylko trzeba się przez to przegryźć, ale powinno być łatwiej. Dzięki :)

    Dodano po 10 [godziny] 24 [minuty]:

    ex-or napisał:

    Teraz do testów zaopatrzyłem się w 74HCT00 i nowy pasek ledowy i od razu pojawił się zgrzyt: nowe WS2812B mają pozmieniane niektóre parametry, w tym czas resetu, który został znacznie wydłużony. Tutaj jest jakiś komunikat na ten temat: Link.


    Temat jest znany już dawna. Wg, również i moich, testów dostępne były diody z czasem resetu ok 9 us oraz 35 us. Prawdopodobnie masz te drugie. A może jeszcze jakiś nowy twór pojawił się na rynku. Dobrze byłoby dograć tę bibliotekę, by czas resetu był parametrem. Teraz jest 9 czy 35 us, a kiedyś będzie tak jak nota podaje więcej niż 50 us

    ex-or napisał:

    Ponadto zauważyłem dosyć dziwne zachowanie diod, mianowicie po pewnym czasie świecenia na "full" niektóre diody zaczynają tracić kolory.
    [STM32F103][C]Sprzętowe sterowanie LED WS2812 na STM32 plus 3xNAND
    Widać, że jedna dioda świeci na czerwono, inna na żółto. Przy wysterowaniu paska kolorem tylko zielonym lub niebieskim dioda "czerwona" w ogóle nie świeci, żółta świeci na zielono, a nie świeci na niebiesko (albo na odwrót). W trakcie świecenia taśmy efekt ten pojawia się w coraz większej ilości diod. Po całkowitym wyłączeniu paska po pewnym czasie diody się "regenerują". Widać też na fotce, że na poszczególnych diodach kolor biały ma różny odcień. Trochę rozczarowujące :-/


    Jeśli dam radę to spróbuję potestować Twoją bibliotekę, aczkolwiek spróbuj jeszcze zmienić nastawienie :) i załóż, że jednak gdzieś w kodzie jest błąd i przy sterowaniu pełna wartością na kolor, 255, dochodzi do "jakiegoś przepełnienia" - tak bym to prostacko spróbował napisać :). Sam często łapię się na tym, że deklaruję zmienne uint8_t, a pomimo tego ostatecznie potrzebny jest większy zakres.
    Oczywiście to tylko przykład, próba wyjaśnienia problemu, samo "regenerowanie diod" nie brzmi przekonująco :) Kolor żółty wskazuje, że wartość pwm dla niebieskiego daje 0, dla czerwonego oczywiście "traci się" niebieski i zielony - odpowiednie diody przestają świecić, być może z powodu właśnie błędu w kodzie, a nie uszkodzenia.

  • #35 19 Kwi 2018 13:30
    ex-or
    Poziom 17  

    simw napisał:
    Temat jest znany już dawna. Wg, również i moich, testów dostępne były diody z czasem resetu ok 9 us oraz 35 us. Prawdopodobnie masz te drugie. A może jeszcze jakiś nowy twór pojawił się na rynku.


    "Moje" diody resetują się przy czasie powyżej 200µs, więc to jeszcze coś nowszego.

    simw napisał:
    Dobrze byłoby dograć tę bibliotekę, by czas resetu był parametrem. Teraz jest 9 czy 35 us, a kiedyś będzie tak jak nota podaje więcej niż 50 us


    Sprawę resetu zostawiłem userowi żeby już nie komplikować.
    Poza tym w F103 jest z tym mały problemik, mianowicie flaga BSY nie generuje żadnego przerwania (a przynajmniej RM na ten temat milczy). Oczywiście można pokombinować np. w przerwaniu DMA transmision complete aktywować przerwanie SP TX buffer empty (czy jak ona się tam nazywa, nie chce mi sie zaglądać do RM, wiadomo o co chodzi). W przerwaniu TX w pętli czekać na flagę BSY co jest idiotyczne ale czemu nie jakby nadać przerwaniu mały priorytet. Albo nie przejmować się flagą BSY i w przerwaniu TX ustawić czas resetu powiększony o czas transmisji jednego bajta czyli ~10µs.

    simw napisał:
    Jeśli dam radę to spróbuję potestować Twoją bibliotekę, aczkolwiek spróbuj jeszcze zmienić nastawienie :) i załóż, że jednak gdzieś w kodzie jest błąd i przy sterowaniu pełna wartością na kolor, 255, dochodzi do "jakiegoś przepełnienia" - tak bym to prostacko spróbował napisać :). Sam często łapię się na tym, że deklaruję zmienne uint8_t, a pomimo tego ostatecznie potrzebny jest większy zakres.


    Nie sądzę, że to sprawa kodu ale jeszcze przy okazji potestuję taśmę na innym kodzie.

    simw napisał:
    Oczywiście to tylko przykład, próba wyjaśnienia problemu, samo "regenerowanie diod" nie brzmi przekonująco :) Kolor żółty wskazuje, że wartość pwm dla niebieskiego daje 0, dla czerwonego oczywiście "traci się" niebieski i zielony - odpowiednie diody przestają świecić, być może z powodu właśnie błędu w kodzie, a nie uszkodzenia.


    A dla mnie wydaje się to kluczem do problemu. W nagrzanych diodkach coś zachodzi, pytanie tylko co? Czy czip w diodzie przestaje prawidłowo funkcjonować? Złącza (luty?) zwiększają oporność? Tę drugą hipotezę próbowałem zweryfikować przelutowując diodę, ale skończyło się na jej upaleniu więc sprawa pozostaje nadal otwarta.

  • #36 23 Sty 2019 20:10
    kamil007
    Poziom 12  

    Witam zainteresowanych tematem.
    Czy ktoś może mi wytłumaczyć tak troszkę łopatologicznie, krok po kroku, jak działają te dwa liczniki?

    ex-or napisał:

    // TIM3 jest masterem dla TIM4
    TIM3->CR1 = 0;
    //CNT_EN jako TRGO
    TIM3->CR2 = TIM_CR2_MMS_0;
    //Trigger mode, wyzwalanie przez T1FP1
    TIM3->SMCR = TIM_SMCR_TS_0 | TIM_SMCR_TS_2 | TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1;
    //Włączenie synchronizacji z timerem podległym
    TIM3->SMCR |= TIM_SMCR_MSM;
    TIM3->PSC = 17; //jeden tick==375ns
    TIM3->ARR = 1;
    TIM3->CCR4 = 0;
    //Kanał 1 jest wejściem
    TIM3->CCMR1 = TIM_CCMR1_CC1S_0;
    //PWM 1 na kanale 4
    TIM3->CCMR2 = TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1;
    //Aktywowanie wejścia (kanał 1) i wyjścia (kanał 4)
    TIM3->CCER = TIM_CCER_CC1E | TIM_CCER_CC4E;
    //One pulse mode, downcounting
    TIM3->CR1 = TIM_CR1_OPM | TIM_CR1_DIR;

    //timer 4
    TIM4->CR1 = 0;
    //Trigger mode z wyzwalaniem przez ITR2 (TIM3)
    TIM4->SMCR = TIM_SMCR_TS_1;
    TIM4->SMCR |= TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1;
    //jeden tick timera 375ns
    TIM4->PSC = 17;
    TIM4->ARR = 2;
    TIM4->CCR4 = 1;
    //PWM 1 na kanale 4
    TIM4->CCMR2 = TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1;
    //Aktywowanie wyjścia kanału 4
    TIM4->CCER = TIM_CCER_CC4E;
    //One pulse mode, downcounting
    TIM4->CR1 = TIM_CR1_OPM | TIM_CR1_DIR;
    }[/syntax]


    Już bez ustawień samych rejestrów. Tylko samo działanie. Bo jakoś sam nie mogę załapać ;-/.
    Licznik TIM3 jest wyzwalany zegarem SPI, w trybie One pulse mode, downcounting.
    Czyli zlicza jedną pętlę? Kolejne takie samo zbocze zegara SPI, powoduje znów wyzwolenie licznika?
    Zlicza w dół od rejestru ARR do zera, ( lub do wartości rejestru CNT)?

    Jedziemy, Pierwszy licznik zostaje wyzwolony, ARR=1 czyli co się dzieje?

  • #37 23 Sty 2019 23:08
    ex-or
    Poziom 17  

    Ojej, nie tykałem tego kodu od roku ale spróbuję sobie przypomnieć ;-)

    kamil007 napisał:
    Licznik TIM3 jest wyzwalany zegarem SPI, w trybie One pulse mode, downcounting.
    Czyli zlicza jedną pętlę?

    Tak
    kamil007 napisał:
    Kolejne takie samo zbocze zegara SPI, powoduje znów wyzwolenie licznika?

    Tak
    kamil007 napisał:
    Zlicza w dół od rejestru ARR do zera, ( lub do wartości rejestru CNT)?

    Do zera.
    kamil007 napisał:
    Jedziemy, Pierwszy licznik zostaje wyzwolony, ARR=1 czyli co się dzieje?

    TIM3 wyzwala TIM4, ponieważ jest włączona synchronizacja oba liczniki startują jednocześnie. To wprowadza niewielkie opóźnienie w stosunku do SCK ale jest bez znaczenia. TIM3 liczy (rejestr CNT): 1-0-1-stop, TIM4 2-1-0-1-stop. W trybie PWM 1 wyjście jest LOW tak długo jak CNT>CCRx w przeciwnym razie jest HIGH czyli TIM3 wygeneruje przebieg LOW-HIGH-LOW-stop a TIM4 LOW-HIGH-HIGH-LOW-stop. Jeden tick timerów to 375ns (albo mniej przy taktowaniu 52MHz). Który z tych dwóch przebiegów zostanie wysłany do LEDów zależy od stanu MOSI SPI i jest realizowane przez zewnętrzne bramki.

  • #38 23 Sty 2019 23:56
    kamil007
    Poziom 12  

    Yeees , yeeees o to mi chodziło ;-) ale ... ;-)

    ex-or napisał:
    TIM3 liczy (rejestr CNT): 1-0-1-stop, TIM4 2-1-0-1-stop. W trybie PWM 1 wyjście jest LOW tak długo jak CNT>CCRx w przeciwnym razie jest HIGH czyli TIM3 wygeneruje przebieg LOW-HIGH-LOW-stop a TIM4 LOW-HIGH-HIGH-LOW-stop.

    TIM3 Rejestr porównania TIM3->CCR4 = 0;
    Czyli:
    CNT 1>0 LOW
    CNT 0 =0 HIGH (bo nie jest większe?)
    CNT 1>0 LOW
    STOP // ten timer łapię, chyba ;-)
    ------------------
    TIM4->ARR = 2;
    TIM4 Rejestr porównania TIM4->CCR4 = 1;
    czyli:
    CNT 2>1 LOW
    CNT 1=1 HIGH
    CNT 0<1 HIGH
    CNT 1=1 ???? Tu napisałeś LOW. Czemu? Przecież w drugim takcie jest ta sama sytuacja i jest HIGH ???
    Czy tu nie powinno być 2-1-0-2?

  • #39 24 Sty 2019 08:09
    BlueDraco
    Specjalista - Mikrokontrolery

    Tak sobie zaczynam myśleć, że na STM32G0 i STM32L5 chyba dałoby się to zrobić bez kodowania 1 na 3 i bez zewnętrznych bramek... Trzeba się będzie przymierzyć.

    A odgrzebując kwestię poziomów logicznych: Przy częstotliwości 800 kHz potrzebnej dla WS2812, skutecznym sposobem podbicia poziomu wyjściowego jest postawienie wyjścia w tryb OD i podpięcie do +5 V rezystora 1.5k. Jedyny warunek - wybrane wyjście SPI musi być typu "FT", czyli 5V-tolerant. W praktyce taka protezka działa dobrze gdzieś do ok. 2 MHz.

  • #40 24 Sty 2019 08:42
    ex-or
    Poziom 17  

    kamil007 napisał:
    CNT 1=1 ???? Tu napisałeś LOW. Czemu? Przecież w drugim takcie jest ta sama sytuacja i jest HIGH ???
    Czy tu nie powinno być 2-1-0-2?

    Moja pomyłka, oczywiście powinno być 2-1-0-2

  • #41 25 Sty 2019 10:56
    kamil007
    Poziom 12  

    Hmm nie do końca rozumiem w takim razie jak działają te bramki.
    Tak ustawione timery "produkują sygnał" , który zaczyna się od stanu niskiego, przez te 370ns. Te diody wymagają aby 0, lub 1 zaczynało się od stanu wysokiego. Jak to działa fizycznie? ;-)

  • #42 25 Sty 2019 11:13
    ex-or
    Poziom 17  

    kamil007 napisał:
    Tak ustawione timery "produkują sygnał" , który zaczyna się od stanu niskiego, przez te 370ns.
    Ta część przebiegu z punktu widzenia LEDów jest końcówką poprzedniego bitu, albo w ogóle "nie istnieje", jeśli to pierwszy bit od początku transmisji. Dla LEDów bit zaczyna się od zbocza narastającego, kończy zboczem narastającym następnego bitu. Albo następuje reset, jeśli to był ostatni wysłany bit w ciągu.

  • #43 25 Sty 2019 14:59
    kamil007
    Poziom 12  

    Dzięki wielki za szczegółowe wytłumaczenie wszystkiego.
    Troszkę dostałem zaćmy :-) i zacząłem liczyć takty timerów , "sklejać" ze sobą przebiegi PWM, i mi nie wychodził czas, a przecież długość całego impulsu ustawia Zegar SPI.

  • #44 28 Sty 2019 09:27
    ex-or
    Poziom 17  

    BlueDraco napisał:
    A odgrzebując kwestię poziomów logicznych: Przy częstotliwości 800 kHz potrzebnej dla WS2812, skutecznym sposobem podbicia poziomu wyjściowego jest postawienie wyjścia w tryb OD i podpięcie do +5 V rezystora 1.5k. Jedyny warunek - wybrane wyjście SPI musi być typu "FT", czyli 5V-tolerant. W praktyce taka protezka działa dobrze gdzieś do ok. 2 MHz.

    Tu jest jakaś dyskusja na ten temat: https://www.elektroda.pl/rtvforum/viewtopic.php?p=16904452#16904452