LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

[PRZYKŁADY] Nowe peryferia w mikrokontrolerach Microchipa, czyli jak ponownie polubić 8-bitowce [1]

Częstotliwość przepełniania się licznika- akumulatora wylicza się z zależności:

gdzie:

NCO Clock Frequency – częstotliwość wejściowa

Increment Value – wartość dodawana do akumulatora

n=20 długość licznika akumulatora

Im wartość zapisana do Increment Value będzie większa, tym licznik będzie się szybciej przepełniał i częstotliwość FOVERFLOW będzie większa.

Na rysunku 7 pokazano przykład zliczania z dodawaniem wartości 2000hex przy każdym narastającym zboczu przebiegu wejściowego. 20-bitowy licznik-akumulator przepełni się po 8 cyklach (okresach) przebiegu wejściowego. Wybierając kombinację częstotliwości wejściowej i zawartości rejestru NCOxINCL można precyzyjnie dobrać generowaną częstotliwość.

 

Rys. 7. Przykład zliczania NCO z dodawaniem wartości stałej 2000hex

 

Przepełnienie licznika powoduje zmianę stanu przerzutnika D. Na jego wyjściu Q jest sygnał prostokątny o wypełnieniu 50% i częstotliwości równej połowie częstotliwości przepełnień licznika. Zapisując bit NxPOL można zmieniać polaryzację sygnału wyjściowego. Przez selektor wyjściowy jest on podawany na wyprowadzenie NCOx, ale jest tez wewnętrznie dostępny dla bloków peryferyjnych CLC i CWG. Ten tryb pracy wybierany po wpisaniu zera do bitu NxPFM nazywa się Fixed Duty Cycle (FDC).

Każde przepełnienie licznika – akumulatora powoduje również ustawienie znacznika przerwania NCOxIF. Jeżeli przerwanie nie jest zablokowane to zostanie zgłoszone i musi być obsłużone.

Ustawienie bitu NxPFM wprowadza tryb Pulse Frequency Mode (PF). W tym trybie po każdym przepełnieniu się licznika- akumulatora wyjście NCOx przechodzi w stan aktywny pozostaje w tym stanie przez czas równy zaprogramowanej wielokrotności okresu zliczanego sygnału wejściowego (zliczany przez ripple counter). Czas stanu aktywnego (wysoki) i nieaktywnego (niski) zależy od bitu określającego polaryzację NxPOL i wartości wpisanej do bitów NxPWS rejestru konfiguracyjnego NCOxCON.

Na rysunku 8 pokazano zależność czasu trwania stanu aktywnego dla NxPWS=0 i dla NxPWS=2. Podobnie jak w trybie FDC sygnał wyjściowy Może być podawany na wyjście NCOx przez selektor wyjściowy, lub wewnętrznie do modułów CLC i CFG.

 

Rys. 8. Generowanie sygnału wyjściowego w trybie PF

 

Programowanie NCO jest nieco skomplikowane i wymaga sporo pracy. Tę pracę może za nas wykonać w dużej części MPLAB Code Configurator. Po kliknięciu w okienku Device Resources na ikonkę NCO jest ona automatycznie przenoszona do okienka Project Resources. Teraz w tym oknie klikamy na NCO i otwiera się okno inicjalizacji modułu pokazane na rysunku 9.

 

 

Rys. 9. Inicjalizacja NCO

 

Przewidziano tu następujące ustawienia:

  • Enable NCO – zaznaczenia tej opcji powoduje włączenie modułu do pracy
  • Enable Pin Out – zaznaczenia tej opcji umożliwia podłączenie sygnału z wyjścia NCO do dedykowanego wyprowadzenia mikrokontrolera.
  • Clock Source – wybór zegara taktującego moduł NCO. Można tu wybrać przebieg taktujący mikrokontroler (z wyjścia generatora HFINTOSC, lub z wejścia zegara taktującego FOSC), z wyprowadzenia na które zostanie podany zewnętrzny przebieg taktujący, lub z wyjścia modułu Configurable Logic Cell CLC1 (CLC1 OUT). Tutaj wybieramy przebieg z wewnętrznego generatora RC o częstotliwości 16MHz taktującego mikrokontroler.
  • Output Polarity – umożliwia zanegowanie sygnału wyjściowego (0dwrócenie w fazie o 180 stopni)
  • NCO Mode- wybór trybu „pulse frequency” (PF), lub „fixed duty cycle” – sygnał wyjściowy z wypełnieniem 50%. . Po wyborze trybu PF w oknie Pulse Width Modulation Clocks wybiera się czas trwania pulsu w ilościach cykli zegarowych od 1 do 128.
  • NCO Output Frequency – w tym polu wpisuje się wartość generowanej częstotliwości w Hz, kHz, lub MHz.
  • Increment start value – wartość wpisywana do rejestru NCO1INCL. Po zapisaniu wartości częstotliwości w oknie NCO Output Frequency wartość okna Increment start value jest wyliczana automatycznie.

Po kliknięciu na Generate Code MPLAB Code Confugurator generuje plik nco1.c z funkcją NCO1_Initialize() pokazaną na listingu 3.

 

List. 3. Inicjalizacja modułu NCO

void NCO1_Initialize(void) {
  // Set the NCO to the options selected in the GUI
  // N1OUT out_lo; N1PFM FDC_mode; N1POL active_hi; N1EN disabled; N1OE enabled; 
  NCO1CON = 0x40;
  // N1PWS 1_clk; N1CKS HFINTOSC_16MHz; 
  NCO1CLK = 0x00;

  // NCOACCU 0; 
  NCO1ACCU = 0x00;

  // NCOACCH 0; 
  NCO1ACCH = 0x00;

  // NCOACCL 0; 
  NCO1ACCL = 0x00;

  // NCO1INCH 0
  NCO1INCH = 0;

  // NCO1INCL 131
  NCO1INCL = 131;

  // Enable the NCO module
  NCO1CONbits.N1EN = 1;
}

Skonfigurowany moduł powinien generować przebieg prostokątny o częstotliwości 1kHz.

Absolwent Wydziału Elektroniki Politechniki Wrocławskiej, współpracownik miesięcznika Elektronika Praktyczna, autor książek o mikrokontrolerach Microchip i wyświetlaczach graficznych, wydanych nakładem Wydawnictwa BTC. Zawodowo zajmuje się projektowaniem zaawansowanych systemów mikroprocesorowych.