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ą
#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