Snímanie polohy optickým enkodérom: Rozdiel medzi revíziami
Zo stránky SensorWiki
Riadok 19: | Riadok 19: | ||
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. | 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. | ||
[[Súbor: | [[Súbor:encoderCapla.webp|400px|thumb|center|LPD3806-600BM.]] | ||
Schéma zapojenia | |||
[[Súbor: | [[Súbor:CaplaProficad.jpg|400px|thumb|center|Schéma zapojenia.]] | ||
=== Algoritmus a program === | === Algoritmus a program === | ||
Algoritmus programu využíva | 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. | ||
<tabs> | <tabs> | ||
<tab name=" | |||
<tab name="main.h"><syntaxhighlight lang="c++" style="background: LightYellow;"> | |||
#include <avr/io.h> | #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; | |||
} | |||
</syntaxhighlight ></tab> | </syntaxhighlight ></tab> | ||
</tabs> | </tabs> |
Verzia z 19:27, 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

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.