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
}
}
Dominik Leon Bieczyński

Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



