Mikrokontrolery AVR XMEGA w praktyce, część 16. Enkoder obrotowy
// konfiguracja systemu zdarzeń EVSYS.CH0MUX = EVSYS_CHMUX_PORTC_PIN0_gc; // pin C0 wywołuje zdarzenie EVSYS.CH0CTRL = EVSYS_QDEN_bm| // włączenie dekodera w systemie zdarzeń EVSYS_DIGFILT_8SAMPLES_gc; // filtr cyfrowy
Dekoder kwadraturowy jest nadajnikiem zdarzenia, a odbiornikiem musi być timer, który będzie zliczał odebrane impulsy. Wykorzystajmy do tego celu timer C0. W rejestrze CTRLA, jak pamiętamy z odcinka o timerach w XMEGA, musimy w nim zdefiniować źródło sygnału taktującego. Jest nim oczywiście kanał 0 systemu zdarzeń. W rejestrze CTRLD musimy tak skonfigurować timer, by był w stanie poprawnie odbierać impulsy z dekodera. W szczególności jest to ważne, by timer wiedział kiedy ma zwiększyć swoją wartość, a kiedy zmniejszyć, w zależności od kierunku obrotu enkodera.
// konfiguracja timera TCC0.CTRLA = TC_CLKSEL_EVCH0_gc; // taktowanie zegarem 2MHz TCC0.CTRLD = TC_EVACT_QDEC_gc | // włączenie dekodera kwadraturowego TC_EVSEL_CH0_gc; // dekoder zlicza impulsy z kanału 0
I to wszystko! Wystarczy teraz dopisać prostą procedurę pokazującą stan licznika na wyświetlaczu LCD. Pamiętać trzeba, że pojedynczy impuls enkodera powoduje zwiększenie lub zmniejszenie wartości timera o 4 – dlatego przed wyświetleniem wartości rejestru TCC0.CNT, musimy ją podzielić najpierw podzielić przez 4.
#define F_CPU 2000000UL #include <avr/io.h> #include <util/delay.h> #include "hd44780.h" int main(void) { // wejścia enkodera PORTCFG.MPCMASK = 0b00000011; // wybór pinów 0 i 1 do konfiguracji PORTC.PIN0CTRL = PORT_ISC_LEVEL_gc | // reagowanie na poziom niski PORT_OPC_PULLUP_gc; // podciągnięcie do zasilania // konfiguracja systemu zdarzeń EVSYS.CH0MUX = EVSYS_CHMUX_PORTC_PIN0_gc; // pin C0 wywołuje zdarzenie EVSYS.CH0CTRL = EVSYS_QDEN_bm| // włączenie dekodera w systemie zdarzeń EVSYS_DIGFILT_8SAMPLES_gc; // filtr cyfrowy // konfiguracja timera TCC0.CTRLA = TC_CLKSEL_EVCH0_gc; // taktowanie systemem zdarzeń TCC0.CTRLD = TC_EVACT_QDEC_gc | // włączenie dekodera kwadraturowego TC_EVSEL_CH0_gc; // dekoder zlicza impulsy z kanału 0 // wyświetlacz LcdInit(); while(1) { // wyświetlenie aktualnej wartości licznika CNT // CNT = ... LcdClear(); Lcd("CNT = "); LcdDec(TCC0.CNT / 4); // jeden przeskok to 4 impulsy _delay_ms(100); // czekanie 100ms } }
Dystrybutorem zestawu X3-DIL64 jest KAMAMI.pl. |
Dominik Leon Bieczyński