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.

dsPIC33f - Jak znaleźć częstotliwość zegara dla timera2?

15 Lis 2015 13:21 849 9
  • #1 15 Lis 2015 13:21
    2250745
    Użytkownik usunął konto  
  • #2 15 Lis 2015 13:34
    el2010tmp
    Poziom 25  

    datasheet napisał:
    The FRC (Fast RC) internal oscillator runs at a nominal
    frequency of 7.37 MHz

    datasheet napisał:
    The secondary (LP) oscillator is designed for low power
    and uses a 32.768 kHz crystal or ceramic resonator

    0
  • Pomocny post
    #3 15 Lis 2015 14:00
    Marek_Skalski
    Moderator Projektowanie

    0. Źródło taktowania wybiera programista, czyli Ty. Domyślnie to jest FRC, czyli 7,37MHz z tolerancją 2%. Można to zmienić przez odpowiednią konfigurację (Configuration Bits), aby układ po resecie startował z zadaną prędkością, max 80MHz (40MIPSów).
    1. Zakładając, że ustawienia są domyślne i rdzeń jest taktowany zegarem FRCDIVN, to mamy nominalnie 7,37MHz, brak podziału wstępnego (1:1), a na końcu podział przez 2 (F_CY). Doze jest wyłączony i nie ma dodatkowego podziału. Vide Figure 9-1 w linkowanym dokumencie.
    2. Konfiguracja licznika T2 wskazuje na taktowanie z zegara systemowego, czyli F_T2 = F_P = 3,685MHz, a tym samym jednostka licznika odpowiada T = 271,37ns. Notka 3 na tym samym rysunku mówi dlaczego należy brać pod uwagę F_P.
    3. To daje czas trwania konwersji około N x T = 238,8us.

    Nie widząc inicjalizacji ADC, nie potrafię powiedzieć w jakim trybie pracuje i z jakim zegarem, a przez to nie wiem czy wynik jest sensowny.

    Dlaczego wybrałeś taki stary uC?

    2
  • #4 15 Lis 2015 16:27
    2250745
    Użytkownik usunął konto  
  • Pomocny post
    #5 15 Lis 2015 17:39
    Marek_Skalski
    Moderator Projektowanie

    Nic dziwnego, że trwa to tak długo.
    Skonfiguruj PLL na 80MHz i przełącz taktowanie rdzenia na FRC+PLL.
    ADC jest taktowany z zegara uC, ale wymusiłeś podział przez wartość niedozwoloną.
    Do AD1CON3<7:0>, czyli ADCS<7:0> wpisałeś 0xFF, a maksymalna dozwolona to 0x3F (1:64). Wpisz ADCS = 0x00; i będzie ~64 razy szybciej.
    Dochodzi jeszcze kwestia czasu samplowania, tutaj SAMC<4:0> = 0x10, to zależy od źródła sygnału. Im większa rezystancja, tym dłużej trzeba czekać. Można to poprawić SAMC<4:0> <= 0x02; stosując odpowiedni układ na wejściu, np. wtórnik napięciowy.
    1us jest możliwa, jeżeli zrobisz tak jak napisałem.

    1
  • #6 17 Lis 2015 21:53
    2250745
    Użytkownik usunął konto  
  • Pomocny post
    #7 17 Lis 2015 23:03
    Marek_Skalski
    Moderator Projektowanie

    0. Źródło taktowania ADC wybierasz bitem ADxCON3<15>, czyli ADRC. Ciebie interesuje ADRC = 0, wartość domyślna.
    1. Jeżeli źródłem taktowania jest FRC+PLL o częstotliwości rzędu 80MHz i zliczasz 0x370 cykli, to według mnie czas konwersji wynosi ~11us, a nie ~7us.
    2. Zminimalizuj czas samplowania. ADCS = 0 oraz SAMC = 0.
    3. Wyzwalaj konwersję automatycznie (SSRC = 7) lub z licznika T3 lub T5. Programowe wyzwalanie konwersji trwa pewnie kilkanaście cykli, poza tym w docelowym układzie pewnie też będzie automatyczne.
    4. Mierz czas dla kilkunastu lub kilkudziesięciu konwersji. Użyj DMA do transmisji danych między ADC a pamięcią i w przerwaniu od zakończonego transferu DMA mierz czas dla całej grupy. Narzut wynikający z dodatkowych operacji takich jak np. start lub odczyt wartości licznika, będzie znacznie mniej wpływał na wynik końcowy.
    5. Pokaż cały program, a przynajmniej całe funkcje. Pojedyncze linie wyrwane z programu nie są wcale oczywiste. Pamiętasz o __builtin_write_OSCCONH(0x01); i __builtin_write_OSCCONL(0x01); czy FRC+PLL jest tylko zdefiniowane w formie konfiguracji, jak to wkleiłeś w poście powyżej?
    6. Sprawdziłeś rzeczywistą częstotliwość zegara, np. generując prostokąt o zadanej częstotliwości na jednym z wyjść OC?

    0
  • #8 18 Lis 2015 00:47
    2250745
    Użytkownik usunął konto  
  • #9 18 Lis 2015 20:35
    Marek_Skalski
    Moderator Projektowanie

    1. Nic dziwnego, że wynik jest identyczny. ADC jest pędzony z tego samego źródła co rdzeń i T2. Zmiana częstotliwości taktowania skutkuje zmianą dla wszystkich układów, więc ze względu na pracę synchroniczną, czasy powinny się zgadzać.
    2. Tutaj już poprawić nie można.
    3. Tutaj chyba też ;) Nie wiem jaki jest cel Twojej pracy, ale zazwyczaj jak ktoś używa szybkiego przetwornika, to w celu realizacji deterministycznych i stabilnych czasowo pomiarów. Ręczne wyzwalanie szybkiego przetwornika nie brzmi dobrze i ociera się o akademicką fantastykę naukową. Ale to tylko mój punkt widzenia.
    4. Spróbuj nawet bez DMA, ale z automatycznym wyzwalaniem. Możesz też próbować od drugiej strony: zmniejszaj czas między kolejnymi impulsami wyzwalającymi konwersję, aż układ przestanie się wyrabiać - możesz też wystawiać jakiś sygnał na zewnątrz.
    5. A ja startuję tylko z FRC, a do tego jestem ortodoksyjny i wolę wiedzieć, że wszystko poszło dobrze. Czasami coś nie pójdzie, jak kwarc jest uszkodzony, nie jest podłączony, albo brak rezystora równoległego, czy kondensator jest niewłaściwy. Ten kod jest dla 140MHz.

    Kod: C
    Zaloguj się, aby zobaczyć kod
    Zobacz też jak wygląda rzeczywisty kod po kompilacji: Window->Debugging->Disassembly
    Ile instrukcji/cykli dolicza T2 do rzeczywistego czasu konwersji?
    6. Prawdopodobnie masz prosty oscyloskop, tylko o tym nie wiesz: http://mikrokontrolery.blogspot.nl/2011/04/darmowy-oscyloskop-i-analizator.html

    Pozdrawiam,
    Marek

    0
  • #10 04 Gru 2015 00:11
    2250745
    Użytkownik usunął konto  
  Szukaj w 5mln produktów