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ę?
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ę?