Operácie

Snímanie polohy optickým enkodérom: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentMIPS (diskusia | príspevky)
StudentMIPS (diskusia | príspevky)
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:encoder.webp|400px|thumb|center|LPD3806-600BM.]]
[[Súbor:encoderCapla.webp|400px|thumb|center|LPD3806-600BM.]]


Nezabudnite doplniť schému zapojenia! V texte by ste mali opísať základné veci zo zapojenia, samotná schéma nie je dostačujúci opis.
Schéma zapojenia


[[Súbor:GeminiAI-image2.jpg|400px|thumb|center|Schéma zapojenia.]]
[[Súbor:CaplaProficad.jpg|400px|thumb|center|Schéma zapojenia.]]




=== Algoritmus a program ===
=== Algoritmus a program ===


Algoritmus programu využíva toto a toto, základné funkcie sú takéto a voláma ich tuto...
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.
Výpis kódu je nižšie...




<tabs>
<tabs>
<tab name="AVR C-code"><syntaxhighlight  lang="c++" style="background: LightYellow;">
 
<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;


int main(void)
/* Pripojenie periferii k vyvojovej doske Arduino: */
{
  unsigned int measuredValue;


  while (1)
#define BAUD 9600
  {
    /*  relax  */ 
  }


  return(0);
#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--;
}
}
}


</syntaxhighlight ></tab>
// External Interrupt 1 (INT1) Handler (PD3)
<tab name="filename.h"><syntaxhighlight lang="c++" style="background: LightYellow;">
ISR(INT1_vect) {
#include <avr/io.h>
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


void adc_init(void);                                   // A/D converter initialization
while (1) {
if (temp != counter) {
temp = counter;
printf("natocenie: %ld rychlost: 0\r",counter);
}
}


unsigned int adc_read(char a_pin);
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č.

PinOut dosky Arduino nano.

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.

LPD3806-600BM.

Schéma zapojenia

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.

Aplikácia.

Video:



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