[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.