LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

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

www.leon-instruments.pl