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.
- Konektor kvadraturních enkodérů
- Konektor I2C (5V logické úrovně)
- Konektor I2C (3.3V logické úrovně)
- Konektor kvadraturních enkodérů
- Konektor SPI pro nahrávání nového firmwaru pro Atmegu48pa
- Atmega48pa
- Řada led diod sloužící pro testovací účely
Zapojení jednotlivých konektorů:
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); } }