Kvadraturní dekodér

Modul je založena na mikrokontroléru Atmega48PA [1] na frekvenci 20MHz od společnosti ATMEL. Mikrokontrolér čte vstupní signály od dvou kvadraturních enkodérů pomocí externího přerušení. Dekóduje směr otáčení z přečtených hodnot a upravuje stav vnitřních 16bit čítačů. Dle směru pohybu enkodérů buď inkrementuje nebo dekrementuje stav těchto čítačů. Stav čítačů enkodérů lze zjistit komunikací s modulem po sběrnici I2C.

Připojení enkodérů je řešeno pomocí dvou postranních zámkových konektorů. Mikrokontrolér dále ovládá 6 led diod ve spodní části modulu, které lze použít pro ladící a testovací účely. Pro případné aktualizace firmwaru mikrokontroléru je vyveden standardní 6 pinový programovacího konektor ISP na straně modulu.

Návrh plošného spoje desky:

  1. Konektor kvadraturních enkodérů
  2. Konektor I2C (5V logické úrovně)
  3. Konektor I2C (3.3V logické úrovně)
  4. Konektor kvadraturních enkodérů
  5. Konektor SPI pro nahrávání nového firmwaru pro Atmegu48pa
  6. Atmega48pa
  7. Řada led diod sloužící pro testovací účely

Osazená deska:

Zapojení jednotlivých konektorů:

Konektor enkodéry Konektor I2C Konektor ISP

Ukázka kódu pro komunikaci s modulem pomocí Raspberry Pi
#include <stdio.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
 
int main(){
        int i2cDevice;
        int decoderAddress = 0x30;
        unsigned char buffer[4];
 
        if((i2cDevice = open("/dev/i2c-1",O_RDWR)) < 0){
                  printf("Failed to open bus");
                  exit(1);
        }
 
        if(ioctl(i2cDevice,I2C_SLAVE,decoderAddress)){
                  printf("Cannot set i2c slave address to decoder module \n\r");
                  exit(1);
        }
 
        while(1){
                buffer[0] = 10; // send command for reading encoders value from decoder   
                if(write(i2cDevice,buffer,1) != 1){
                        printf("Failed to write to the i2c bus. \n\r");
                }else{
                        if(read(i2cDevice,buffer,4) != 4){
                                printf("Failed to read from the i2c bus. \n\r");
                        }else{
                    //encodersState.right = buffer[0] | (buffer[1] << 8);i
                                printf("Right %i \n\r",  buffer[0] | buffer[1]<< 8);
                                printf("Left %i \n\r",  buffer[2] | buffer[3]<< 8);
                    //encodersState.left = buffer[2] | (buffer[3] << 8);
                                printf("Buffer [%i,%i,%i,%i] \n\r", buffer[0], buffer[1], buffer[2], buffer[3]);
                        }
                }
                usleep(100000);
        }
}
Ke stažení
Reference