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

STM32F411 Odbiornik DMX512 - Zakończenie odbioru paczki.

toch88 15 Sty 2017 10:54 1173 17
  • #1 15 Sty 2017 10:54
    toch88
    Poziom 10  

    Witam

    Pracuje obecnie nad projektem odbiornika sygnały DMX512. Sprawa wygląda następująco:
    -Sygnał danych czytany jest z urządzenia zwane Kwamatik USB2DMX, obsługiwane przez program Q Light Controller. „Po drodze” do uC trafia jeszcze na driver RS485 a potem na PIN RX UART1 oraz PIN PB9 skonfigurowanego jako wejścia dla Timera 11 pracującego w trypie Input Capture.
    Póki co pętla główna umieszczona została w SysTicku skonfigurowanego na 2MHz co też może być błędem, pewnie lepiej to umieścić w pętli głównej (zostawię sobie to na później).
    -Napisałem maszynę stanu która przechodzi poprzez etapy rozpoznawania sekwencji początkowej ramki danych przesyłanych z DMX.
    Etapy wyglądają następująco:
    -Stan 0 {INIT}: Konfigurowanie,
    Timer 11 skonfigurowany w trybie InputCapture,
    UART1 skonfigurowane jest tylko przerwanie związane z odbiorem danych.
    -Stan 1 {BREAKE_CHECK}: Sprawdzanie czy wystąpił dostatecznie długi sygnał BREAK : 88us do 176 us jeżeli tak to zmieni stan na 2. Sygnał ten jest mierzony w przerwaniu Timera 11, który przechwytuje, zdarzenie wystąpienia zbocza narastającego lub opadającego. Programowo sprawdzana jest poziom logiczny impulsu mierzonego. W przypadku BRAKE sprawdzane jest czy wystąpiło przerwanie wyzwolone zmianą poziomu logicznego, a następnie czy poziom logiczny po zmianie jest 0, w kolejnym przerwaniu zachowywany jest pomiar czasu, jeżeli spełni on kryteria to następują zmiana stanu.

    -Stan 2 {AFTER_BREAKE_CHECK} Sprawdzenie czy wystąpił dostatecznie długi sygnał MARK AFTER BREAK. 8us do 1 s (w tym konkretnym przypadku nadajnika nigdy nie był dłuższy niż 50000us). Podobnie jak w przypadku stanu BREAK następuje tutaj wyzwolenia przerwania spowodowanego zmiana stanu logicznego na wejściu Timera 11 i programowe sprawdzenie jego poziomu (czy po wystąpieniu zbocza poziom logiczny wynosi 1). Jeżeli impuls dodatni spełnia kryteria to zmień stan na READ, uruchom przerwanie UART1
    STAN 3 {READ} Wczytuje kolejnych 512 bajtów do bufora channelData gdy zmienna pomocnicza counter zliczająca ilość odczytanych bitów osiągnie wartość >512 następuje jej reset oraz zgłoszenie odebrania całego pakietu. Automat ponawia cykl. (od stanu 1)
    Tak mniej więcej to wygląda teraz:

    STM32F411 Odbiornik DMX512 - Zakończenie odbioru paczki.
    STM32F411 Odbiornik DMX512 - Zakończenie odbioru paczki.




    STM32F411 Odbiornik DMX512 - Zakończenie odbioru paczki.

    Zgoła tak wygląda mój odczyt sygnału DMX512, jednakże jest tutaj parę mankamentów które chciałbym rozwikłać. Zgodnie z tym co możemy zaobserwować na oscyloskopie:
    Nie wiem dlaczego po w przerwaniu gdy counter osiągnie wartość zgodnie z kodem powinien zmienić swój stan oraz przejść do stanu szukania sygnału BREAKE (Stan1), jednak się tak nie dzieje.

    STM32F411 Odbiornik DMX512 - Zakończenie odbioru paczki.

    Do tego jestem pewien że faktycznie ostatni bajt odczytywany jest poprawnie co można zobaczyć:

    STM32F411 Odbiornik DMX512 - Zakończenie odbioru paczki.

    STM32F411 Odbiornik DMX512 - Zakończenie odbioru paczki.

    PROGRAM:
    sygnały widoczne na oscyloskopie to:
    Żółty PA10 (wejście do UART_RX) PB9(wejście Timmer11),
    Jasny niebieski: STAN 1 PD12,
    Różowy STAN2 PD13,
    Ciemny niebieski PD14 Stan 3 READ

    Pętla Główna:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Konfiguracje:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 17
  • #2 15 Sty 2017 14:45
    2675900
    Użytkownik usunął konto  
  • #3 15 Sty 2017 15:20
    toch88
    Poziom 10  

    No tam nie ma zbyt wiele wyłączane włączane są przerwania, zmiana stanu automatu moora. Zmieniałem to już na 100, rożnicy nie przyniosło, Bardziej zastanawiam się na tym teraz czy lepiej może by było zastosować jakieś sprzętowe kolejkowanie, ale chyb w tym przypadku będę musiał zrezygnować z przyjętego sposobu tworzenia programu tj. maszyny stanów.
    Dodano po 22 [minuty]:
    Dobra znalazłem SysTick był ok. Problem ze złym warunkiem

    Kod: c
    Zaloguj się, aby zobaczyć kod


    zamiast
    Kod: c
    Zaloguj się, aby zobaczyć kod


    STM32F411 Odbiornik DMX512 - Zakończenie odbioru paczki.

    Dziękuje za zainteresowanie tematem. Pozdrawiam

    0
  • #4 15 Sty 2017 17:26
    2675900
    Użytkownik usunął konto  
  • #5 15 Sty 2017 17:34
    Freddie Chopin
    Specjalista - Mikrokontrolery

    No właśnie, w końcu DMX512 to zwykły UART działający na 250kbps w formacie 8N2 i tyle.

    0
  • #6 15 Sty 2017 18:13
    toch88
    Poziom 10  

    Z tego co wiem należy poprawnie rozpoznać początek ramki danych, w innym przypadku ma powrócić do "szukania" impulsu BREAK.
    Sygnał BREAK w stosunku do ramki danych jest dłuższy, stąd użycie Timerów, w taki sposób aby go wyznaczyć.
    W ostatecznej wersji będzie on sterował kilkoma silnikami BLDC małej mocy w układzie otwartym, chciałbym aby był on jednak synchronizowany i w jakiś sposób odporny na przekłamania.

    Opierałem się na nocie aplikacyjnej:
    http://www.emcu.it/STM32/Lighting-Control-usi...er%20Manuals-STMicroelectronics.Manuals_4.pdf
    .
    Sprawdzę czy da się jeszcze waszym sposobem.

    0
  • #7 15 Sty 2017 18:16
    2675900
    Użytkownik usunął konto  
  • #8 15 Sty 2017 18:22
    toch88
    Poziom 10  

    Jak mówiłem posiłkowałem się tym co ktoś już kiedyś zrobił, spójrz na Link. Skoro można to zrobić Uartem to dobrze zaraz sprawdzę.

    0
  • #9 15 Sty 2017 18:27
    2675900
    Użytkownik usunął konto  
  • #10 15 Sty 2017 18:31
    Freddie Chopin
    Specjalista - Mikrokontrolery
  • #11 15 Sty 2017 18:39
    2675900
    Użytkownik usunął konto  
  • #12 15 Sty 2017 18:44
    BlueDraco
    Specjalista - Mikrokontrolery

    Zieew. Odbiór DMX512 na STM32 był pokazany w Elektronice Praktycznej z lipca 2015. Cały kod to jakieś marne 120 linii.

    0
  • #13 15 Sty 2017 18:48
    toch88
    Poziom 10  

    Pamiętam że kiedyś czytałem o takim podejściu w Elektronice Praktycznej : http://ep.com.pl/files/11145.pdf.. Jednak zdecydowałem się pójść taką drogą rozpoznawania danych. W przypadku gdy w standardzie zgodnie z BREAK powinien wynosić pomiedzy 88us a 176us to muszę w jakiś sposób to pomierzyć. Jeszcze wypadałoby sprawdzić parę rzeczy np czy cała ramka mieści się w czasie 1 s itp. Może to są rzeczy nieistotne, ale chciałbym zrobić to zgodnie z standardem, a to już jakiś start.

    0
  • #14 15 Sty 2017 19:05
    BlueDraco
    Specjalista - Mikrokontrolery

    Ale to chyba nie problem dołożyć wyzwalanie timera one-shot do przerwania UART i w automacie w przerwaniu UART sprawdzać, czy timer nie "zadzwonił"?
    Mam taki kod komercyjny dla innego Cortexa, ma jakieś 150 linii bo nie używa przyspieszającej pracę programisty SPL ani HAL (wtedy miałby pewnie zaledwie 400 linii).

    0
  • #15 15 Sty 2017 19:14
    toch88
    Poziom 10  

    Mówisz o One-pulse mode? a to nie jest tylko dla output?
    Pokombinuje jutro, to i tak koniec końców będę musiał sprawdzić długość BREAK oraz MARK_AFTER_BREAK.
    Więc czy użyje Timera w taki modzie czy w takim ma to jakieś znaczenie?

    To na razie pierwsza próba podejścia do tematu, dzięki za sugestie.

    0
  • #16 15 Sty 2017 19:28
    2675900
    Użytkownik usunął konto  
  • #17 15 Sty 2017 19:44
    toch88
    Poziom 10  

    czyli to sprawdzanie długości znaków początkowych to jest "sztuka dla sztuki", jeżeli BREAK byłby na tyle krótki że nie byłby zinterpretowany jako FRAME ERROR to zostałby odczytany jako zwykły bajt w UARTcie prawdopodobnie o wartośći równiej 0, co w konsekwencji mogło by spowodować wysterowanie (albo raczej brak) konkretnego kanału wartością 0. Zatem w moim przypadku pompka by się wyłączyła. do tego przesunięcie pozostałych kanałów w buforze.

    Jak już posiłkowałem się tabelą w dokumencie http://www.emcu.it/STM32/Lighting-Control-usi...r%20Manuals-STMicroelectronics.Manuals_4.pdf..

    BREAKE jest 88us do - Typowy 176us nie ważne.

    0
  • #18 15 Sty 2017 19:57
    2675900
    Użytkownik usunął konto