Snímanie polohy optickým enkodérom: Rozdiel medzi revíziami
Zo stránky SensorWiki
Riadok 24: | Riadok 24: | ||
[[Súbor:CaplaProficad.jpg|400px|thumb|center|Schéma zapojenia.]] | [[Súbor:CaplaProficad.jpg|400px|thumb|center|Schéma zapojenia.]] | ||
Signály A a B rotačného enkóderu. | |||
[[Súbor:rotaryencodersignals.jpg|400px|thumb|center|Signály rotačného enkóderu.]] | |||
zdroj: https://www.makerguides.com/quadrature-rotary-encoder-with-arduino/ | |||
Verzia z 19:32, 15. máj 2025
Záverečný projekt predmetu MIPS / LS2025 - Lukáš Čapla
Zadanie
Cieľom projektu je snímanie polohy natočenia optickým rotačným enkóderom, a túto polohu vypísať sériovú komunikáciu na počítač.

Literatúra:
Analýza a opis riešenia
V zadaní použijeme optický rotačný enkodér (LPD3806-600BM Rotary Encoder 600 Pulse NPN) teda 600 pulzov na jednu otáčku hriadeľa.

Schéma zapojenia

Signály A a B rotačného enkóderu.

zdroj: https://www.makerguides.com/quadrature-rotary-encoder-with-arduino/
Algoritmus a program
Algoritmus programu využíva prerušenia, pretože inak by sa mohlo stať, že niektoré signály procesor nespracuje. Teda použijeme piny PD2 a PD3 ako vstupy so zapnutými prerušeniami v sledovaní nábežnej hrany.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include "uart.h"
#include <util/delay.h>
volatile long counter = 0;
volatile long temp = 0;
/* Pripojenie periferii k vyvojovej doske Arduino: */
#define BAUD 9600
#define pinA PD7
#define pinA PD7
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, NULL, _FDEV_SETUP_WRITE);
// External Interrupt 0 (INT0) Handler (PD2)
ISR(INT0_vect) {
if (!(PIND & (1 << PIND3))) {
counter++;
} else {
counter--;
}
}
// External Interrupt 1 (INT1) Handler (PD3)
ISR(INT1_vect) {
if (!(PIND & (1 << PIND2))) {
counter--;
} else {
counter++;
}
}
int main(void) {
uart_init(); // Inicializacia seriovej linky
stdout = &mystdout; // Odteraz funguje printf();
// Set PD2 and PD3 as inputs with pull-up
DDRD &= ~((1 << DDD2) | (1 << DDD3)); // Inputs
PORTD |= (1 << PORTD2) | (1 << PORTD3); // Enable pull-up resistors
uart_init();
// Enable external interrupts on INT0 and INT1 on rising edge
EICRA |= (1 << ISC01) | (1 << ISC00); // INT0: Rising edge
EICRA |= (1 << ISC11) | (1 << ISC10); // INT1: Rising edge
EIMSK |= (1 << INT0) | (1 << INT1); // Enable INT0 and INT1
sei(); // Enable global interrupts
while (1) {
if (temp != counter) {
temp = counter;
printf("natocenie: %ld rychlost: 0\r",counter);
}
}
return 0;
}
Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x zdrojaky.zip:
Zdrojový kód: zdrojaky.zip
Overenie
Ako ste overili funkciu, napríklad... Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia. Na konci uvádzame fotku hotového zariadenia.

Video:
Kľúčové slová 'Category', ktoré sú na konci stránky nemeňte.