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.

PIC18F46K80 - Jak uruchomić źródło prądowe CTMU? PIC18f46k80 lub podobny

szymonjg 20 Lis 2014 19:14 1740 6
  • #1 20 Lis 2014 19:14
    szymonjg
    Poziom 15  

    Układ jest bajecznie prosty. Mikrokontroler PIC18F46K80 zasilany 3.3V z przejściówki USART<->USB lub z ICD2Clone przez ICSP. Schemat powinien wyjaśnić wszystko.
    PIC18F46K80 - Jak uruchomić źródło prądowe CTMU? PIC18f46k80 lub podobny

    Kod programu:

    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod




    Wynik obserwacji jest taki, że procesor na pewno działa bo wysyła mi właściwe dane USARTem. ADC również reaguje na zwarcie pinu RA0 do masy. Jest również reakcja na ustawienie bitu CTMUCONHbits.IDISSEN bo wtedy wynik pomiaru też jest bliski zeru jak przy zwarciu. Jeśli pin RA0 jest nie podłączony wtedy pomiar jest nie stabilny, ale oscyluje raczej w górnych granicach skali. Nie działa natomiast źródło prądowe. Wg dokumentacji, po ustawieniu parametrów źródła, uruchomieniu modułu CTMU i ustawieniu jednego ze "zbocz" powinien płynąć prąd do modułu ADC i podłączonego do niego pinu. U mnie natomiast nic takiego się nie dzieje. W teorii płynący prąd powinien mieć wartość około 90uA. Wartość ta z powodzeniem powinna dać się zmierzyć miernikiem uniwersalnym na zakresie do 2mA. U mnie natomiast miernik niewzruszenie wskazuje "0", a mam taki trochę lepszy niż takie za 15zł, tak że można mu zaufać. Podłączenie go do ADC też jest właściwe bo mam reakcje w postaci pomiarów ADC. Opornik 82k również ściąga mi pomiar adc do 0 pomimo, że przy takim prądzie powinno odłożyć się na nim dużo większe napięcie niż 3,3V.

    Męczę się z tym już od kilku dni i powoli tracę wiarę, że mi się uda. Sprawdzałem połączenia, czytałem dokumentację szukałem po forach i nic. Jesteście moją ostatnią nadzieją. Jak ktoś przerabiał już ten temat na tym lub na innym pic'u 18 lub pic'u 24 z modułem CTMU, i wie co robię nie tak albo czego nie robię, a powinienem robić aby tylko uruchomić to źródło prądowe to był bym wdzięczny.

    Dziękuję za jakiekolwiek zainteresowanie jednak prosił bym o merytoryczne odpowiedzi by nie zaśmiecać zbędnie forum. Kwestia, czy lepsze są PICi czy AVRy czy inne uC, itp. to dla mnie kwestia gustu i temat na zupełnie inny wątek.

    0 6
  • #2 20 Lis 2014 21:13
    dondu
    Moderator Mikrokontrolery Projektowanie

    Nie znalazłem błędu, ale mogłem coś przeoczyć.

    Ja często wykorzystuję algorytmy ustawiania zawarte w dokumentacji. Zawsze pokazują właściwą drogę, a czasami istotne kolejności wykonywania czynności. W dokumentcji jest punkt: 18.3 CTMU Module Initialization

    Próbowałeś przykład kalibracji zawarty w dokumentacji?: 18.4 Calibrating the CTMU Module

    0
  • #3 20 Lis 2014 22:38
    szymonjg
    Poziom 15  

    Oczywiście wcześniej studiowałem te kody bo bez tego nawet bym nie ruszył tego zagadnienia.
    Najbardziej spodobał mi się ten do pomiaru temperatury przy użyciu wewnętrznej diody bo jest najprostszy.

    Kod: c
    Zaloguj się, aby zobaczyć kod
    // Initialize CTMU
    CTMUICON = 0x03;
    CTMUCONHbits.CTMUEN = 1;
    CTMUCONLbits.EDG1STAT = 1;
    // Initialize ADC
    ADCON0 = 0x75; // Enable ADC and connect to Internal diode
    ADCON1 = 0x00;
    ADCON2 = 0xBE; //Right Justified
    ADCON0bits.GO = 1; // Start conversion
    while(ADCON0bits.G0);
    Temp = ADRES; // Read ADC results (inversely proportional to temperature)[/syntax]

    Robiłem to samo tylko zmieniałem kanał ADC na AN0 po uprzednim ustawieniu tego pinu na wejście i na analogowy i dalej zero.


    Idąc za Twoją radą, teraz skopiowałem żywcem ten kod na inicjalizację i kalibrację prądową tego modułu.
    Wyszło coś takiego:
    Kod: c_loadrunner
    Zaloguj się, aby zobaczyć kod


    Dolutowałem goldpiny do pinu RA2/AN2 i masy aby tam podłączyć kable i nie dłubać za dużo przy tym kodzie bo w nim właśnie ten kanał jest ustawiony. Ustawiłem breakpoint na linijce:
    Vread = ADRES; //Get the value from the A/D (dziewiąta od końca)

    i odczytuję dane z pomiaru ADC przy użyciu ICD2 w trybie debugera.
    Oto odczyty w systemie dziesiętnym i skali 12-bitowej:
    od 0 do 10 - Przy pinie zwartym do masy
    4095 - Przy pinie podłączonym do VCC
    od 1500 do 1700 przy odłączonych kablach
    od 2800 do 3000 przy podłączonych ale rozwartych kablach
    od 100 do 200 przy podłączonym rezystorze 81k pomiędzy pinem a masą.

    Kable może nie są jakieś wyszukane bo to około jednego metra dwóch żył taśmy AWG28 zakończonych z jednej strony gniazdem goldpin a z drugiej krokodylkami. Ale skoro jest reakcja na podłączenie pinu do masy i do VCC to czyli podłączenie jest dobre. A jeśli pin nie jest do niczego podłączony i dostawał by prąd od CTMU to pomiary też powinny być po pierwsze stabilniejsze a po drugie oscylujące w górnej granicy skali nawet przy podłączonym oporniku bo przestawiłem wartość rejestru CTMUICON = 0b11; co powinno dać prąd bazowy x100 czyli około 55uA. Zresztą jak oryginalnie było CTMUICON = 0x01; to też nie działało tak jak powinno a przynajmniej tak mi się wydaje.

    0
  • #4 20 Lis 2014 23:31
    94075
    Użytkownik usunął konto  
  • #5 21 Lis 2014 00:42
    szymonjg
    Poziom 15  

    Słuszna uwaga. Ale z tego rysunku nie wynika czy od pinu odłączany jest tylko kondensator samplujący czy kondensator wraz ze źródłem prądowym CTMU.

    Tak czy inaczej źródło prądowe na pewno mi nie działa tak jak powinno.
    Bo jeśli prąd z CTMU odłączał by się razem z kondensatorem, to powinno mieć to wpływ na wynik pomiaru ADC i nie mógł on być bliski zeru, nawet przy zwarciu pinu AN0 do masy.
    Jeśli natomiast odłącza się tylko kondensator a prąd zostaje przy pinie to powinien on już dać się zmierzyć miernikiem.
    Poza tym wracając do kodu z pierwszego postu to pomiar trwa tam dosyć krótko w porównaniu z wstawionym delay'em. Przez ten "zmarnowany" czas, prąd chyba też powinien wydostawać się z pinu bo moduł CTMU ciągle jest włączony i ciągle aktywne jest tylko jedno ze zbocz.
    Tak właśnie je ustawiam w rejestrze CTMUCONL i tak one pozostają, bo teraz właśnie, dla pewności sprawdziłem usartem czy nic mi tych stanów nie przestawia automatycznie po dokonaniu pomiaru ADC lub po delay'u.

    0
  • #6 22 Lis 2014 10:51
    dondu
    Moderator Mikrokontrolery Projektowanie

    Gdy już znajdziesz przyczyną opiszą ją proszę.

    0
  • #7 22 Lis 2014 21:42
    szymonjg
    Poziom 15  

    Ma się rozumieć, że opiszę. Trochę chorowałem. Trochę nie miałem motywacji, albo i chęci by się za to wziąć. Dzisiaj w końcu mi się udało.

    Przyczyna była banalna. W listingu z pierwszego postu jest:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    a powinno być:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Takie moje przyzwyczajenie, że poszczególne bity w rejestrach ustawiam używając liczb binarnych, a w dokumentacji używają liczb szesnastkowych. Oczywiście świadomy jestem różnicy pomiędzy tymi systemami, ale tu nie zwróciłem na to uwagi i po skopiowaniu wartości z dokumentacji beztrosko dopisałem jedynkę i tyle.
    Efekt był taki, że źródło prądowe działało jednak wartość prądu była zbyt mała bym go zauważył przy użyciu konwencjonalnego multimetru lub innych, dostępnych mi narzędzi.
    Co ciekawe w drugim listingu trzeciego postu tego błędu nie ma bo poprawiłem go dopieszczając post, jednak nie wiedząc czemu nie wniosłem tej poprawki do swojego programu. Może byłem zmęczony, albo późno już było ale... nie ważne.

    Reasumując: Aby uruchomić źródło prądowe CTMU w mikrokontrolerze PIC18F46K80 lub podobnym należy:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Czyli po pierwsze ustawić bity konfiguracyjne. W MPLAB 8.X można zrobić to w kodzie (tak jak w listingu z pierwszego postu) lub w okienku Configure->Configuration Bits...

    Następnie:
    1. Pin z którego zbieramy prąd ustawiamy jako wejście.
    2. Dla pewności możemy wyzerować wartości rejestrów CTMUCONH i CTMUCONL
    3. Włączamy moduł CTMU
    4. Ustawiamy "mnożnik" prądu (3- x100, 2- x10, 1- x1, 0- x0;
    5. Kalibrujemy wartość nominalną (od -31 czyli -62%, do 31 czyli +62%)
    6. Wybieramy kanał ADC pinu z którego chcemy pobierać prąd. Sam moduł ADC w tym przypadku nie musi być ani włączony, ani skonfigurowany.
    7. Aktywujemy status jednego ze zbocz w rejestrze CTMUCONL.
    8. Dla pewności zerujemy status drugiego ze zbocz, jeśli nie zrobiliśmy tego zerując wcześniej cały rejestr CTMUCONL.
    I tyle w sumie wystarczy aby z pinu płynął prąd o ustalonej wartości.

    Jak można przeczytać w dokumentacji źródło prądowe działa jeśli tylko jedno ze zbocz jest aktywne, więc żeby wyłączyć prąd należy:
    -albo aktywować drugie zbocze (CTMUCONLbits.EDG2STAT = 1; )
    -albo dezaktywować to pierwsze (CTMUCONLbits.EDG1STAT = 0; )
    -albo ustawić "mnożnik" na 0 (CTMUICONbits.IRNG=0; )
    -albo wyłączyć CTMU (CTMUCONHbits.CTMUEN=0; )
    -albo odłączyć zasilanie od uC, albo spalić procesor. itd. itp.

    Poniżej jeszcze efekt działania powyższego kodu i maksymalna wartość prądu jaką możemy wyciągnąć z CTMU w omawianym procesorze.
    PIC18F46K80 - Jak uruchomić źródło prądowe CTMU? PIC18f46k80 lub podobny

    Dziękuję wszystkim zainteresowanym i w sumie jak ode mnie to tyle.
    Temat uważam za zamknięty, chyba że ktoś jeszcze miał by coś na temat w tym temacie do napisania.

    0