LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

Mikrokontrolery AVR XMEGA w praktyce, część 13. PWM

    // konfiguracja timera
    TCE0.CTRLB        =    TC_WGMODE_DSBOTH_gc|        // tryb normalny
                           TC0_CCAEN_bm|
                           TC0_CCBEN_bm|
                           TC0_CCCEN_bm|
                           TC0_CCDEN_bm;
    TCE0.PER          =    10000;
    TCE0.CCA          =    2000;
    TCE0.CCB          =    4000;
    TCE0.CCC          =    6000;
    TCE0.CCD          =    8000;
    TCE0.CTRLA        =    TC_CLKSEL_DIV1024_gc;       // ustawienie preskalera i uruchomienie timera

…i to wystarczy, aby timer zaczął generować sygnały PWM (oczywiście odpowiednie piny muszą być skonfigurowane w rejestrze DIR jako wyjście).

    while(1) {
        // wyświetlenie aktualnej wartości licznika CNT i PER
        // CNT = ...
        // PER = ...
        LcdClear();
        Lcd("CNT = ");
        LcdDec(TCE0.CNT);
        Lcd2;
        Lcd("PER = ");
        LcdDec(TCE0.PER);
        _delay_ms(100);    
        
        if(!(PORTE.IN & PIN5_bm)) {                    // przycisk FLIP przyspiesza PWM
            TCE0.PER        =    1000;
            TCE0.CCA        =    10;
            TCE0.CCB        =    50;
            TCE0.CCC        =    200;
            TCE0.CCD        =    500;
            TCE0.CTRLA      =    TC_CLKSEL_DIV1_gc;        
        }
        
    }

Po uruchomieniu programu, świecą się wszystkie diody, a rejestr CNT licznika jest oczywiście wyzerowany. Zwróć uwagę na wskazania wyświetlacza. Kiedy licznik CNT przekroczy 2000 to zgaśnie dioda podłączona do pinu E0, bo steruje nią kanał A, którego rejestr CCA wynosi 2000. W ten sposób po kolei wszystkie diody mają zgasnąć, aż licznik osiągnie wartość 10000 i zacznie liczyć w dół. Diody będą się po kolei zapalać. Po wciśnięciu przycisku FLIP, preskaler timera zmienimy na 1 zamiast 1024 i ustawimy nieco inne wartości CCx. Dzięki temu będziemy mieć wrażenie, że diody świecą się z różną jasnością, choć rzeczywistości odbywa się podobny proces jaki oglądaliśmy przed chwilą, ale z dużo większą prędkością.

Działanie programu przedstawia poniższy filmik i zdjęcie.

 

Rys. 6. Diody świecą z różną jasnością 

Rys. 6. Diody świecą z różną jasnością

 

#define  F_CPU    2000000UL
#include 
#include 
#include 
#include "hd44780.h"

int main(void) {
    
    // przycisk
    PORTE.DIRCLR      =    PIN5_bm;                    // pin E5 jako wejście (przycisk FLIP)
    PORTE.PIN5CTRL    =    PORT_OPC_PULLUP_gc;         // podciągnięcie do zasilania
    
    // diody od PWM
    PORTE.DIRSET      =    0b00001111;                 // piny 3..0 jako wyjście
    
    // wyświetlacz
    LcdInit();
    
    // konfiguracja timera
    TCE0.CTRLB        =    TC_WGMODE_DSBOTH_gc|        // tryb PWM dual-slope
                           TC0_CCAEN_bm|
                           TC0_CCBEN_bm|
                           TC0_CCCEN_bm|
                           TC0_CCDEN_bm;
    TCE0.PER          =    10000;
    TCE0.CCA          =    2000;
    TCE0.CCB          =    4000;
    TCE0.CCC          =    6000;
    TCE0.CCD          =    8000;
    TCE0.CTRLA        =    TC_CLKSEL_DIV1024_gc;       // ustawienie preskalera i uruchomienie timera
    
    while(1) {
        // wyświetlenie aktualnej wartości licznika CNT i PER
        // CNT = ...
        // PER = ...
        LcdClear();
        Lcd("CNT = ");
        LcdDec(TCE0.CNT);
        Lcd2;
        Lcd("PER = ");
        LcdDec(TCE0.PER);
        _delay_ms(100);    
        
        if(!(PORTE.IN & PIN5_bm)) {                    // przycisk FLIP przyspiesza PWM
            TCE0.PER        =    1000;
            TCE0.CCA        =    10;
            TCE0.CCB        =    50;
            TCE0.CCC        =    200;
            TCE0.CCD        =    500;
            TCE0.CTRLA      =    TC_CLKSEL_DIV1_gc;        
        }
        
    }
}

Dystrybutorem zestawu X3-DIL64 jest KAMAMI.pl.

Dominik Leon Bieczyński

www.leon-instruments.pl