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 [2]

Jak temu zapobiec? Nieoczekiwanie i wbrew intuicji poprzez zmniejszenie częstotliwości taktowania na przykład z 16 MHz do 1MHz. Wykres zależności rozdzielczości od współczynnika wypełnienia został pokazany na rysunku 18. Można też zwiększyć rozdzielczość przez zanegowanie sygnału PWM, kiedy osiągnie wypełnienie 50% – rysunek 19

 

 

Rys. 18. zależność rozdzielczości bitowej od współczynnika wypełnienia dla Fpwm=3kHz i Fosc=1MHz

 

 

Rys. 19. Zwiększenie rozdzielczości bitowej przez negowanie sygnału PWM

 

Jeszcze ciekawiej się robi, kiedy zwiększy się częstotliwość sygnału PWM. Na rysunku 20 pokazano zależność rozdzielczości od współczynnika wypełnienia dla częstotliwości PWM równej 500kHz i częstotliwości taktowania równej 16MHz. W tym przypadku rozdzielczość w całym zakresie zmienia się do 15 bitów do 17 bitów, czyli jest bardzo wysoka. 

 

 

Rys. 20. Zależność rozdzielczości bitowej od współczynnika wypełnienia dla Fpwm=500kHz i Fosc=16MHz

 

Praktyczną implementację modułu PWM zaczniemy od skonfigurowania źródła sygnału Timing Source z rysunku 16. Timing Source jest sygnałem, który wyznacza częstotliwość okres sygnału PWM, tak jak to zostało pokazane na rysunku 15 (Period Generator). Źródła tego sygnału mogą być różne, a ja do testów wybrałem moduł PWM2. Przy pomocy MPLAB Code Configurator z okna zasobów Service Resources wybieramy i konfigurujemy PWM2 tak by jego częstotliwość była równa na przykład 10kHz i wypełnienie wynosiło 1%.

 

 

Rys. 21. Konfiguracja TMR2

 

Częstotliwość pracy modułu PWM określa wartość wpisana do rejestru PR2 licznika TMR2. Dlatego przy wyborze PWM2 Code Configurator automatycznie dołącza konfigurację licznika TMR2. Licznik jest taktowany częstotliwością 16MHz/4 =4MHz. Żeby uzyskać 10kHz trzeba ta częstotliwość podzielić przez 4, a potem przez 100 – rysunek 21.

 

 

Rys. 22. Konfiguracja modułu PWM2

 

Potem konfigurujemy przebieg PWM o częstotliwości 10kHz i wypełnieniu 1% – rysunek 22. Funkcje konfiguracyjnie wygenerowane przez MPLAB Code Configurator zostały pokazane na listingach 5 i 6.

 

List. 5. Konfiguracja timera TMR2

void TMR2_Initialize(void) {
  // Set TMR2 to the options selected in the User Interface

  // TMR2ON off; T2CKPS 1:4; T2OUTPS 1:1; 
  T2CON = 0x01;
  // PR2 99; 
  PR2 = 0x63;
  // TMR2 0x0; 
  TMR2 = 0x00;
  // Clearing IF flag.
  PIR1bits.TMR2IF = 0;

  // Start TMR2
  TMR2_StartTimer();
}

List. 6. Konfiguracja PWM2

void PWM2_Initialize(void) {
  // Set the PWM to the options selected in the MPLAB® Code Configurator.
  // PWM2POL active_hi; PWM2OE enabled; PWM2EN enabled; 
  PWM2CON = 0xC0;

  // PWM2DCH 0; 
  PWM2DCH = 0x00;

  // PWM2DCL 192; 
  PWM2DCL = 0xC0;
}

Zgodnie z tym co wcześniej napisaliśmy, czas trwania duty cycle jest określony przez okres sygnału z generatora NCO. Dla PWM o częstotliwości 10kHz i współczynnika wypełnienia 50% częstotliwość pracy NCO będzie równa 20kHz. Jeżeli popatrzymy na przykład na rysunek 17, to widać, że dla małych wypełnień częstotliwość NCO musi być dużo większa od częstotliwości 10kHz (dlatego tam rozdzielczość jest największa), a dla wypełnienia dążącego do 100% będzie się zbliżać do wartości 10kHz. Jeżeli przyjmiemy współczynnika wypełnienia 50%, to dla 10KHz Tpwm= 100us, a Tdc=50us. Czyli częstotliwość pracy NCO musi wynieść 20kHz i taką częstotliwość ustawimy. Oprócz częstotliwości pracy zgodnie z tym co zostało powiedziane wcześniej NCO musi być ustawione w tryb pracy PF, a sygnał wyjściowy musi być zanegowany. Konfiguracja modułu została pokazana na rysunku 23, a funkcja konfiguracyjna wygenerowana przez MPLAB Code Configurator na listingu 7.

 

 

Rys. 23. Konfiguracja NCO

 

List. 7. konfiguracja NCO

void NCO1_Initialize(void) {

  // Set the NCO to the options selected in the GUI
  // N1OUT out_lo; N1PFM PFM_mode; N1POL active_lo; N1EN disabled; N1OE enabled; 
  NCO1CON = 0x51;

  // N1PWS 4_clk; N1CKS HFINTOSC_16MHz; 
  NCO1CLK = 0x40;

  // NCOACCU 0; 
  NCO1ACCU = 0x00;

  // NCOACCH 0; 
  NCO1ACCH = 0x00;

  // NCOACCL 0; 
  NCO1ACCL = 0x00;
  // NCO1INCH 5
  NCO1INCH = 5;

  // NCO1INCL 29
  NCO1INCL = 29;

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

Skonfigurowane moduły PWM i NCO trzeba teraz połączyć między sobą według schematu z rysunku 16. D tego celu wykorzystamy moduł makroceli CLC (Configuration Logic Cell), który szczegółowo przedstawimy w kolejnym odcinku kursu.

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.