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

[ATXMEGA] Jak zredukować jitter timerów w ATXMEGA przy generowaniu impulsu dla ADC?

lisboa 12 Mar 2015 18:05 1590 6
REKLAMA
  • #1 14523292
    lisboa
    Poziom 8  
    Posty: 5
    Witam,

    Mam problem, z którym nie mogę sobie od dłuższego czasu poradzić.



    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pierwszy przebieg (zółty) jest to generowany PWM za pomocą pierwszego Timera TCF0. Częstotliwość jest stała ok. 1 kHz. W przerwaniu od porównania CCA następuje start drugiego Timera TCD0, w którego przerwaniu generowany jest impuls dla zewnętrznego przetwornika ADC - sygnał CS.

    Problem tkwi w tym, że impuls drga (jitter) i nie jest możliwe dokładne próbkowanie. Próbowałem już wszystkiego. W pętli while w chwili obecnej nie ma żadnego kodu. Drobną poprawę obserwuję przy zmianie poziomu przerwania z LO na HI. Czy możliwe jest całkowite wyeliminowanie jittera?

    Zegar jest zewnętrzny na kwarcu.

    Pozdrawiam serdecznie

    Kris
    Załączniki:
    • 01.mp4 (4.01 MB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • Pomocny post
    #2 14523419
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Tego jitteru w żaden programowy sposób nie wyeliminujesz. Jego powodem jest to, że wejście w ISR trwa nie zawsze tyle samo - XMEGA wykonuje instrukcje w ciągu 1, 2 lub 3 taktów, a ISR nie przerywa instrukcji, lecz CPU musi ją najpierw dokończyć. Więc w zależności od wykonywanej instrukcji już masz jitter 0-2 taktów. Do tego, jeśli MCU wykonuje inne przerwanie, o takim samym lub wyższym priorytecie, to twoje ISR musi najpierw poczekać na jego zakończenie - tu oczekiwanie zależy od tego jak napisany jest program i jakie masz inne funkcje ISR. Dlatego też, żeby jitteru się pozbyć należy wykorzystąć sprzęt - drugi timer wyzwalać nie z przerwania, tylko przez event system, podobnie impuls wyzwalający zewnętrzny przetwornik też może być generowany poprzez wyprowadzenie na pin IO kanału event system lub dzięki timerowi. Ponieważ routing sygnału przez event system jest przewidywalny (opóźnienie dwóch taktów CPU, stałe), zniknie jitter.
  • REKLAMA
  • #3 14524510
    lisboa
    Poziom 8  
    Posty: 5
    tmf napisał:
    drugi timer wyzwalać nie z przerwania, tylko przez event system, podobnie impuls wyzwalający zewnętrzny przetwornik też może być generowany poprzez wyprowadzenie na pin IO kanału event system lub dzięki timerowi..


    Wiem oczywiście (z Twojej książki :) ) jak łączyć timery za pomocą systemu zdarzeń ale nie wiem jak go wyzwolić, tak żeby drugi timer mógł zliczać z dużą rozdzielczością.

    Wyprowadzenie z event system na pin IO może odbywać się w ATXMEGA256A3BU tylko na pinie 4 i 7 a ja mam już gotowy układ i sygnał dla ADC na pin 0.

    Pozdrawiam i dzięki za pomoc.

    Kris
  • REKLAMA
  • #4 14525128
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    To zależy jakiej XMEGA używasz - niektóre mają timer z trybem one shot (E5) i wtedy sprawa jest prosta - timer zaczyna zliczanie po wyzwoleniu. Inne mają możliwość obsługi komend - np. restart, można dzięki temu zrealizować funklcjonalność one shot. Tego typu przykłady znajdziesz w książce "AVR. Układy peryferyjne" - zobacz na przykłady generowania impulsów synchronizacji dla TV, czy przykłady związane z komunikacją z VS1003B i dekodowaniem mp3.
  • REKLAMA
  • #5 14526194
    lisboa
    Poziom 8  
    Posty: 5
    Tak, to działa bardzo dobrze. Wyzwalam i restartuje drugi timer poprzez event system. Dzięki rejestrom PER i CCA mogę kontrolować rozdzielczość i szerokość impulsu sygnału CS (w moim przypadku 3uS). W przerwaniu od drugiego timera, poprzez SPI, wysyłam tylko dane z akwizycji przetwornika. Jitteru oczywiście nie ma.

    Pozdrawiam
    Kris

    P.s Tomasz, czekam na książkę o SAM3 lub lepiej o SAM4... 8-)
  • Pomocny post
    #6 14526230
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Proces odbioru danych też można sobie zautomatyzować - połącz DMA z SPI, wyzwalaj transfer eventem z drugiego kanału timera - dzięki czemu MCU sam odczyta przetwornik po zadanym czasie od wyzwolenia konwersji i umieści dane we wskazanym miejscu pamięci. Oczywiście to już tylko bajer :)
    O SAM powiadasz? Przed nami jeszcze kilka innych ciekawych tematów :)
  • #7 14548708
    lisboa
    Poziom 8  
    Posty: 5
    I tak już znowu mam ;) DMA + SPI. Chociaż w moich urządzeniach procesor nie działa "na rzęsach" w pętli while liczy i obsługuje tylko podstawowe parametry, cokolwiek to znaczy. W nowych projektach potrzebuje DSP( dla direct sampling), więc naturalną potrzebą jest Cortex M4, który obliczenia wspiera. Posługuje się przetwornikami 18-bitowymi (operacje 32 bitowe).

    Dużo się nauczyłem, dzięki Twoim książką (to bezcenne), ATXMEGA jest zbliżony do Cortex M4(jeśli chodzi o peryferia) z rodziny SAM, Kolejną książkę (nisza) kupuje w ciemno.

    Kris.

Podsumowanie tematu

✨ W dyskusji poruszono problem jitteru w impulsach generowanych przez timery w mikrokontrolerach ATXMEGA, co wpływa na dokładność próbkowania ADC. Użytkownik zauważył, że jitter wynika z niejednolitego czasu wykonywania ISR oraz z potencjalnych opóźnień związanych z innymi przerwaniami. Proponowane rozwiązania obejmują wykorzystanie systemu zdarzeń do wyzwalania drugiego timera, co pozwala na eliminację jitteru dzięki przewidywalnemu opóźnieniu. Użytkownik z powodzeniem zaimplementował system zdarzeń, co poprawiło jakość impulsów dla ADC. Dodatkowo, zasugerowano automatyzację odbioru danych za pomocą DMA w połączeniu z SPI, co zwiększa efektywność przetwarzania. W kontekście przyszłych projektów, użytkownik rozważa zastosowanie procesorów Cortex M4 dla bardziej zaawansowanych obliczeń.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA