Skocz do zawartości

STM32F4-Discovery PWM + DMA błędnie generuje sygnał.


seba881

Pomocna odpowiedź

Witam.

Próbuję zrobić sobie sterowanie diodami WS2815, sterowanie chcę zrobić na bazie funkcji:

HAL_TIM_PWM_Start_DMA(&htim2, TIM_CHANNEL_1, test, 7);

tutaj akurat uprościłem do maksimum dla testu, wysyłam do niej:

uint32_t test[] = { 30, 90, 80, 99, 40,30,0};

Wcześniej próbowałem od razu wysyłać co potrzeba, ale sygnał PWM zachowywał się jakby losowo poza pewnymi momentami.

I teraz mam dwa przypadki ustawienia w cube mx i wychodzą mi dwa różne oscylogramy, z czego tylko pierwszy wygląda na prawidłowy (chodzi o wysyłaną wartość 40). Jedyna różnica to, że ma większy prescaler, niestety taki nie załatwia mi sprawy:

Przypadek 1

PWM1.thumb.png.52057d8aa4b79e9df948fec793250a78.png

Przypadek 2

PWM2.thumb.png.fafc1b13c71b138112d6ddf301f43ba9.png

pwm.thumb.png.f240456b203dfb649f774aa9fd7601ae.png

Macie jakiś pomysł dlaczego tak się dzieje? Nie jest za mała wartość, bo wartość 30 generuje ok. 

Zauważyłem, że tak jakby brak wyraźnego sygnału niskiego w pojedyńczym wypełnieniu powoduje powtórzenie poprzedniego sygnału.

Edytowano przez seba881
Link do komentarza
Share on other sites

Widzę używasz Timera2, który gdzie może być jest 32 bitowy.

Jaki sprzęt ?

Trudno ocenić oscylogramy, bo widać działkę 4uS, częstotliwość 4...HZ?

Dziwnie wygląda twoje sprawdzanie, bo jakby co 1 zliczenie, przy takich czasach (4uS) to nie ma różnicy, czy jeden impuls jest zafałszowany. Podaj więcej szczegółów, wrzuć projekt, schemat. można będzie pomyśleć. Częstotliwość proca, jaki procek... 

Póki co polecam książkę kursu FORBOT'a rozdział 8.5.4 zmiana częstotliwości sygnału PWM

Może DMA z Cashem koliduje (jeżeli procesor ma Cash).

 

Link do komentarza
Share on other sites

(edytowany)

Używałem i Timer1 i Timer2.

Mikrokontroler  STM32F407 VGT6.

Częstotliwość mikrokontrolera 168MHz, częstotliwość timera 84MHz.

Projekt: nóżka PA15 podpięta do oscyloskopu. 

Cytat

Dziwnie wygląda twoje sprawdzanie, bo jakby co 1 zliczenie, przy takich czasach (4uS) to nie ma różnicy, czy jeden impuls jest zafałszowany. 

Chyba nie rozumiem, co 1s wysyłam w kółko to samo, w jednym i w drugim oscylogramie ta sama tablica.

Co do cache to ma ART, więc chyba nie jest to typowy cache.

 

Edytowano przez seba881
Link do komentarza
Share on other sites

(edytowany)

Spróbuj zrobić to co robisz najpierw bez DMA, wpisując mu wartości na "piechotę", jak zadziała wtedy kombinuj z DMA.

PWM.thumb.jpg.3b64a1252b339e8fbc622c1eeb62b7b3.jpg

Z oscylogramu nie można zobaczyć podstawy czasu , nie wiadomo z jaką częstotliwością działa PWM. Z kolei na dole jest chyba 4Hz 

Z dobrych wieści - tak wygląda rozdział 15 kursu FORBOT'a:

WS2812B.thumb.jpg.1dc55ec62e9511f351506b67a2836fef.jpg

Edytowano przez virtualny
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

Z obliczeń powinno być 3,6us na jeden impuls i to się zgadza z oscylogramem. Więc 5*3,6us= 18us.

Ale dla prescalera = 0 i counter period 200, występuje też taka sytuacja. Mniej więcej gdy szerokość pojedyńczego impulsu przekracza 96%, to zaczyna się kopiować na następne impulsy.

 

Edytowano przez seba881
Link do komentarza
Share on other sites

(edytowany)

Czyli nie zgadza się jeden impuls o długości 4 milionowych części sekundy - jaki to ma sens? Jeżeli podświetlasz, to zmieni się PWM 4 milionowe sekundy później niż zaprogramowałeś. I po tych 4 milionowych częściach sekundy będzie już impuls jaki wysłałeś. To co robisz wg mnie nie ma sensu. To może być kwestia pojemności pasożytniczych czy w ogóle pojemności... 

Jesteś mi w stanie wytłumaczyć po co ci jest potrzebne tak dokładne wypełnienie z takim czasem 4 milionowych części sekundy?

2. Zrób najpierw bez DMA i zobacz czy zadziała.

edit:

3. Albo jeszcze inaczej - zrób to co robisz z impulsem o długości 100  uS  (a nie 4) i zobacz czy działa

Edytowano przez virtualny
  • Nie zgadzam się! 1
Link do komentarza
Share on other sites

Bez DMA mi to działało, tylko nie mam pojęcia jak ma to zadziałać na dłuższą metę bez DMA zapychając mikrokontroler. Nie rozumiem Twojego toku rozumowania. Z jakimi czasami mamy doczynienia w WS2815? Zero lub jedynka logiczna trwa 1,25us, z czego tylko 300-800ns jest stanem wysokim.

Mam już program działający sterujący WS2815, niestety muszę użyć tranzystora podnoszącego do 12v, co mi da kolejne opóźnienie, co mogę zniwelować nieco powiększeniem szerokości sygnałów. Dlatego szukam dlaczego w niektórych sytuacjach występuje błąd i powtórzenie szerokiego impulsu. 

Łatwiej problem znaleźć na 7 wartościach, niż na 4320 impulsów pwm.

 

 

Link do komentarza
Share on other sites

Mówimy o 2 różnych rzeczach Ty o PWM 250 kHz a ja o transmisji.

Puść PWM 50% i będziesz miał transmisję, po jaką cholerę ci 99% wypełnienie - czy zdajesz sobie sprawę jakie wielkości czasowe wchodzą w grę przy 99% wypełnieniu 250kHz PWM ? I co Jak będzie 98% zamiast 99% to pójdziesz z reklamacją do producenta? Tu w grę wchodzą NANO sekundy !!! I piko farady pojemności. I zakłócenia EMI.

Jeżeli używasz PWM do podświetlenia (back light) LCD wystarczy ci 1kHz spokojnie - jaki sens ma transmisja z 99% wypełnieniem? Że chcesz ją zakłócać?

  • Nie zgadzam się! 1
Link do komentarza
Share on other sites

Cały czas mam wrażenie, ze odpowiadasz na swoje pytania, nie na moje. Generujesz wywody o niczym, zaśmiecając ten wątek. Proszę już się nie udzielaj, może inna osoba czytająca ze zrozumieniem odpowie na moje pytania.

 

 

Link do komentarza
Share on other sites

(edytowany)

@seba881 Przeczytaj końcówkę tej części kursu: https://forbot.pl/blog/kurs-stm32l4-diody-rgb-ws2812b-liczniki-quiz-id49890 Możliwe że jest to dokładnie ten sam problem.

Edit: W najnowsze wersji HAL-a może być konieczne wywołanie HAL_TIM_DMABurst_WriteStop przed HAL_TIM_DMABurst_MultiWriteStart, było o tym w komentarzach pod kursem (

).

Edytowano przez Elvis
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Oto przykład próby pomocy dla hmm.. "fachowców z forum"
1. 
https://forbot.pl/forum/topic/24952-stm32h755-stm32cubeide-nie-generuje-kodu/#comment-212612

Nie dość że się nie zna, to jeszcze musi wytworzyć legendę, że specjaliści z ST się pomylili, a nie on. I cube nie generuje kodu. Tymczasem cube generuje kod - sprawdziłem. Nawet zero podziękowania.

2. 
https://forbot.pl/forum/topic/25097-stm32h755zi-nietypowe-zachowanie-sie-silnika-krokowego-sterowanego-przez-tmc5160/#comment-214175

Pytanie do wróżbity - "Dlaczego nie działa?", bez schematu, opisu itd. Brak reakcji, oczywiście nawet bez podziękowania.

3. Ten wątek
Oto kolejny fachowiec, co to wszystko wie tylko mu nie działa. 
Transmisja z 99% wypełnienia się nie składa ojej. A jak będziesz chciał całą sekundę transmitować, to dokleisz external RAM na kilakset kilobajtów tablicy danych?
Tłumaczysz i się obrusza - Już nawet bez prostej matematyki - zero zrozumienia i wyobraźni. Podziękowania ? Żart.

Nie ma sensu pomagać takim fachowcom, skoro oni sami wiedzą najlepiej.
Tym optymistycznym akcentem kończę moje próby pomocy specom od embedded.

Link do komentarza
Share on other sites

@Elvis Wielkie dzięki! Faktycznie widziałem ten artykuł wcześniej i nie doczytałem do końca, też przez zauważone problemy właśnie. Mój błąd, trzeba od dechy do dechy czytać.

 

 

 

Link do komentarza
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ę »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.