Zliczanie impulsów encodera inkrementalnego

    -- Sebastian Pawlak, 2003.


Zaprezentowany program zlicza impulsy encodera inkrementalnego w obu kierunkach. Zastosowałem taką konstrukcję algorytmu, która uniemożliwia zliczanie "fałszywych" impulsów powstających np. podczas wibracji wałka encodera.
Na poniższym schemacie zobrazowałem podłączenie encodera do procesora. Dodatkowo należy podłączyć wyświetlacz LCD pod właściwe piny (patrz: program lcd.c)

Schemat podłączeniowy
Schemat podłączeniowy


Kod źródłowy pliku "encoder.c":

/* Encoder
 * Program zlicza i wyswietla na wyswietlaczu impulsy encodera.
 * Sebastian Pawlak, 2003.
 */

#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include "lcd.h"

/*#define __AVR_AT90S8535__*/

volatile long int licz = 0;
volatile int flagaA = 0, flagaB = 0;


SIGNAL (SIG_INTERRUPT0)
{
   if (!(inb(PIND) & 16))  /* jesli 0 na kanale B */
        flagaA = 1;
    else                       /* w przeciwnym przypadku (1 na kanale B) */
        flagaB = 1;
}


SIGNAL (SIG_INTERRUPT1)
{
    if (inb(PIND) & 16) {     /* jesli 1 na kanale B */
        if (flagaA)               /* jesli flagaA ustawiona */
            licz++, flagaA = 0;
    } else if (flagaB)            /* jesli flagaB ustawiona */
        licz--, flagaB = 0;
}


int main(void)
{
    char s[16];

    outp(0, DDRD);

    /* Ustawianie przerwan INT 0 i INT1 wyzwalanych zboczem narastajacym
     * i opadajacym.
     */
    outp((1<<INT0)|(1<<INT1), GIMSK);
    outp((1<<ISC01)|(1<<ISC00) | (1<<ISC11), MCUCR);


    initLCD();

    sei();  /* zezwala na przerwania */

    for (;;) {
        cursorHome();
        sprintf(s, "%ld ", licz);
        wypiszLancuch(s);
    }

    return 0;
}
8 lutego 2012
Aktualności:
20 marca 2010
Nowości w dziale Java. Reorganizacja strony.
więcej
17 lutego 2007
Nowy dział dotyczący programowania w Javie.
więcej
14 grudnia 2005
Dodano nowy dział "sieci". Nowe programy w "Język C".
więcej
w3cw3c
projektowanie ogrodów, ogrody