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

Konfiguracja ADC i DMA w ATXMEGA 128A3U dla 4Msps - porady

czarusgg 29 Lis 2018 21:51 630 2
REKLAMA
  • #1 17594449
    czarusgg
    Poziom 12  
    Witam wszystkich!

    Jestem w trakcie czytania (po raz nasty) książki autorstwa Tomasza Francuza pt. "AVR. Układy peryferyjne".
    W książce tej tmfr opisując ADC pisze, że ATXMEGA 128A3U może taktować swój ADC z maksymalną częstotliwością 2MHz. Przy próbkowaniu potokowym mamy odczyt próbki w każdym takcie ADC. Przy założeniu, że rdzeń chodzi z częstotliwością 32MHz wynika, że na każde 16 taktów zegara systemowego wypada gotowość przetwarzania jednego potoku z ADC.

    DMA konfigurujemy na transakcję 4 bajtową ze zwiększaniem źródła o 2 (zbieramy młodsze bajty wyników ADC) i wyzwalamy transakcję przy każdej gotowości kanału 3 z przetwornika (wtedy kanały 0, 1 i 2 mają juz gotowe wyniki) ADC. W ten sposób zbieramy próbki do bufora .

    Naszła mnie taka oto myśl, że Można wszystko wstępnie skonfigurować tak jak to opisałem dla obu przetworników i dwóch kanałów DMA.

    ADCA -> DMA0
    ADCB -> DMA1

    Wystartować ciągłą konwersję w ADCA, odczekać 8 instrukcji "nop" i wystartować ciągła konwersję w ADCB. Gdy wszystkie kanały obu przetworników próbkują ten sam sygnał, to chyba powinniśmy uzyskać realną częstotliwość próbkowania 4Msps?

    Teraz pytanie, które mnie nurtuje.

    Czy DMA da radę?

    Coś mi się kołacze po głowie, że na transfer 1 bajtu DMA potrzebuje 4 cykli zegara CLK.

    Policzmy:

    Gotowość w ADC co 64 takty.

    ADCA zgłosi transfer po 64 taktach, DMA potrzebuje 16 taktów.
    8 taktów po rozpoczęciu transmisji zgłosi transfer drugi przetwornik, jego odbiór zostanie opóźniony o 8 taktów.

    Czyli drugi transfer DMA gdy się skończy miną już 24 takty zegara i pierwsza próbka z ADCB zostanie zniszczona :(.

    Dodatkowe przemyślenie: Ale po 8 taktach od zgłoszenia gotowości ADCB rozpocznie się transfer i pierwszy wynik ADCB.CH0 będzie przeniesiony do bufora w ciągu kolejnych 8 taktów. Czyli na styk! dokładnie wtedy skończy się próbkowanie w ADCB.CH0. Nie mniej jednak wygląda na to, ze DMA będzie chciało 100% wyłączności nad magistralami. To znaczy, że trzeba usypiać procesor i budzić się po zapełnieniu buforów! To chyba mogłoby się udać?

    Czy mam rację?
  • REKLAMA
  • #2 17597429
    tmf
    VIP Zasłużony dla elektroda
    Tak, zapewne się to uda. DMA na transfer potrzebuje około 5 taktów. Oczywiście to zależy jaka instrukcja jest wykonywana. Nie trzeba usypiać procka, jeśli instrukacja nie odwołuje się do RAM to nie ma konfliktu magistral i CPU działa równolegle do DMA.
    Tego typu koncepcje fajnie jest testować w symulatorze w Atmel Studio - prześledzisz wszystko z dokładnością do taktu, tak jak by to wyglądało w fizycznym procesorze.
    Oczywiście pozostaje pytanie - co z tego, że tyle sampli zbierzesz, skoro trzeba mieć jeszcze czas je przetworzyć? No chyba, że chcesz samplować max szybko do bufora, a potem to obrabiać.
    Jako ciekawostka - bo rozumiem, że temat jest hobbystyczny, wersję AU (z USB) możesz spokojnie przetaktować do 48 MHz, poniekąd część zegarów związanych z USB w tym procesorze ma taką częstotliwość), co da ci 50% mocy więcej. Podkreślam, że to propozycja do zabawy, nic więcej.
    BTW, wyzwalania musisz zrobić całkowicie sprzętowo, nie możesz liczyć że różnica wytworzona przez NOPy długo się utrzyma. No chyba, że w 100% przemyślisz kolejność instrukcji, co jest raczej bez sensu ze względu na niewygodę takiego programowania.
  • #3 17598177
    czarusgg
    Poziom 12  
    Dziękuję za odpowiedź tmf.

    NOPy są mi potrzebne tylko na początku by wytworzyć przesunięcie 1/2 okresu ADC pomiędzy przetwornikami. Chodzi o to by pomiędzy przetwarzaniami potoków ADCA wstrzelić się z potokami ADCB i faktycznie podwoić częstotliwość.

    Sprzętowo koniec przetwarzania w ADCA.CH3 ma wyzwolić transfer w DMA0, koniec ADCB.CH3 ma wyzwolić transfer w DMA1.

    Koniec przetwarzania w ADCB.CH3 ma także inkrementować timer (za pomocą zdarzenia), który po odliczeniu odpowiedniej ilości zebranych próbek zatrzyma ich zbieranie w procedurze obsługi przerwania OVERFLOW i uruchomi wizualizację na LCD.

    Natomiast przed tym całym galimatiasem chcę wykorzystywać komparator by robił za triger.

    Innym słowy chcę zbudować wizualizator przebiegu napięcia, bo oscyloskopem nie śmiem tego nazwać :)
REKLAMA