Operácie

Meranie časového intervalu: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentDVPS (diskusia | príspevky)
StudentDVPS (diskusia | príspevky)
 
(30 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 20: Riadok 20:
'''Literatúra:'''  
'''Literatúra:'''  
* [[Acrob007|Ako pracuje snímač vzdialenosti]]
* [[Acrob007|Ako pracuje snímač vzdialenosti]]
* http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob_technical_description |zapojenie DPS


__TOC__
__TOC__
Riadok 25: Riadok 26:
== Analýza ==
== Analýza ==


== Popis riešenia ==
Našou úlohou v semestrálnom projekte bolo vytvorenie merača časového intervalu. Projekt sme realizovali pomocou procesora ATmega 328P, LED displej, snímač.
 
 
'''Použitá doska plošných spojov'''
[[Súbor:AcrobDPS.jpg]]
 
 
'''Schéma zapojenia dosky plošných spojov'''
[[Súbor:AcrobSchZap.jpg]]
 
 
'''Popis pinov na DPS'''
[[Súbor:ConnectorsDPS.jpg]]
 
 
 
'''Použitý displej'''
'''Použitý displej'''
[[Súbor:Disp.jpg]]
[[Súbor:Disp.jpg]]
Riadok 40: Riadok 57:
   - Pracovná teplota: 0 až +70 °C
   - Pracovná teplota: 0 až +70 °C


'''Zapojenie displeja'''
 
 
 
'''Použitý snímač'''
[[Súbor:Sn.jpg]]
 
Technické parametre:
  - Napájanie: 4.5 - 5.5 V
  - Spotreba: 30 mA
  - Pripojenie: Analógový výstup
  - Rozmery: 29.5 x 13 x 13.5 mm
  - Rozsah merania: 10 - 80 cm
 
== Popis riešenia ==
Ku zvolenému zadaniu sme mali k dispozícií dosku plošného spoja Acrob (http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/S%C3%BAbor:AcrobBoard.png), ku ktorej sme pripojili modul LCD Terminal AppMod Parallax. Ďalej sme potrebovali pripojiť senzor vzdialenosti Sharp GP 2Y0A21, ktorý vyhodnocoval meraný časový interval. Senzor sme pripojili na analógový vstup DPS konektora X4 na piny 1,2,3. Snímač sme uchytili do stojana, kedy nám senzor vyhodnotil referenčnú hodnotu. Pri zmene hodnoty na senzore sme ju porovnávali s referenčnou hodnotou a spustilo sa meranie časového intervalu. Pri ďalšej zmene hodnoty na snímači sa následne toto meranie zastavilo a na displeji ostala zobrazená hodnota časového intervalu.
 
Podarilo sa nám rozbehať aj prvé dve tlačidlá pod displejom, ktorým sme priradili funkcie. Prvé tlačidlo vymaže displej, keď už je počítadlo zastavené a vypíše slovo "READY", teda môže sa začať ďalšie počítanie.
Druhé tlačidlo vymaže aktuálnu hodnotu času a začína počítať znova od nuly.
 
'''Celkové zapojenie'''
[[Súbor:Zapp.jpg]]
 
 
 
'''Zapojenie displeja k DPS'''
[[Súbor:zapoj.jpg]]
[[Súbor:zapoj.jpg]]


'''Schéma zapojenia snímača'''
'''Schéma zapojenia snímača'''
[[Súbor:Zapojenie.png]]
[[Súbor:Zapojenie.png]]


[[Súbor:Example.jpg]]


Pozn.: Názov obrázku musí byť jedinečný, uvedomte si, že Obr1.jpg už pred vami skúsilo
=== Algoritmus a program ===
nahrať už aspoň 10 študentov.  
 
Algorytmus je písaný v jazyku c, pomocou softvéru AVR Atmel Studio. Začíname zadefinovaním knižníc pre ovládanie displeja, sériovej linky, funcií. Ďalej sme vytvorili funkcie pre zapnutie a vypnutie časovača, ktorý v rutine prerušenia postupne napočítava milisekundy, ktoré určujú časový interval medzi dvoma prechodmi pred snímačom. Pre výpis na displej sme použili podprogramy na posúvanie bitov a prepínanie hodnoty daného bitu. Po zadefinovaní potrebných pomocných premenných a nastavení AD prevodníka začína hlavný program. Na začiatku je inicializácia AD prevodníka, sériovej linky, LCD displeja s jeho následným vymazaním. Po povolení globálnych prerušení skočíme do slučky while, kde stále meramie hodnotu z AD prevodníka, ktorý prepočítava analógový signál zo snímača vzdialenosti. V podmienke porovnávame či nastal prechod predmete pred snímačom. Ak sa tak stalo spustí sa časovač a hodnota je vypisovaná na displej. Pri ďalšom prechode sa tento časovač zastaví a celková hodnota časového intervalu je zobrazená na displeji. Pomocou tlačidiel sme vytvorili dve funkcie pre užívateľa.
 
Vyvojový diagram programu:
[[Súbor:vd.jpg]]
 
<source lang="c">
//pripojenie potrebnych kniznic
#include <avr/io.h>
#include <stdio.h>
#include "lcd.h"
#include "serial.h"
#include <string.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "LCDlibrary.h"
 
 
//Pomocne funkcie na spustenie a zastavenie casovaca


#define TIMER_STOP() bits_clear(TCCR0B,(bit(CS02)|bit(CS01)|bit(CS00)));TCNT0=0
#define TIMER_START() TCNT0+=5;bits_set(TCCR0B,(bit(CS01)|bit(CS00)))




=== Algoritmus a program ===
//Makra na pracu s bitmi
#define bit(m) ((1<<m))
#define bit_set(p,m) ((p) |= bit(m))
#define bits_set(p,m) ((p) |= (m))
#define bits_clear(p,m) ((p) &= ~(m))
 


Uveďte stručný popis algoritmu, v akom jazyku a verzii vývojového prostredia ste ho vytvorili.
FILE mystdout=FDEV_SETUP_STREAM(sendchar,NULL,_FDEV_SETUP_WRITE);  // 'sendchar' je nova funkcia pre jeden znak
Je vhodné nakresliť aspoň hrubú štruktúru programu napríklad vo forme vývojového diagramu.
Rozsiahly program pre lepšiu prehľadnosť rozdeľte do viacerých súborov.


Vyberte podstatné časti zdrojového kódu, použite na to prostredie ''source'':
//zadefinovanie premennych
int stara=0;
char zobraz[8]={0};
int aktual=0;
int meranie=0;
volatile uint32_t milisekunda;


<source lang="c">
// A/D converter initialization
/* A nezabudnite zdroják hojne komentovať  */
void adc_init(void)                                   
{
  ADMUX = 0b01000100;                                  // Ref: external, Channel 4 (ADC4) - NTC
  ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // =0b10000111, A/D ON, prescaler = 128
}


int main(void) {
int main(void) {
      
 
    printf("Hello, World!\n");   
inituart(); // inicializacia seriovej linky
    return(0);
lcdInit4();                            // inicializacia LCD displeja v 4-bitovom rezime
adc_init(); // inicializacia AD prevodnika
     lcdControlWrite(LCD_CLR);              // vymazanie displeja
stdout = &mystdout; // odteraz funguje printf();
lcd_puts_addr(0x01,"Ready");
bit_set(TIMSK0,TOIE0); //Povolenie prerusenia Casovaca 0
sei();
 
 
while(1)
{
//nacitanie referencnych hodnot z ADC
stara= aktual; // Do premennej stara ulozime predchadzajuci vypocet AD prevodnika
ADCSRA |= (1<<ADSC);                            // Start A/D conversion
  while ( !(ADCSRA & (1<<ADIF)));                // Wait until AD not finished
    aktual=ADC; // Aktualna hodnota vypocitana ADC
if (milisekunda>0)
{
sprintf(zobraz,"%d ms",milisekunda); // ulozenie casu v milisekundach do smernika zobraz
lcd_puts_addr(0x40,zobraz);
 
                /*
                printf("%d ms",milisekunda);                    // vypis milisekund na terminal pomocou seriovej linky
 
                */
}
 
//spustenie casovaca pri prechode pod senzorom
if ((meranie == 0)&&(aktual<(stara-100))) //&& (meranie==0))
{
lcd_puts_addr(0x00,"Counting");
  TIMER_START();
meranie =1; // zmena premennej, vdaka ktorej mozeme zastavit casovac
}
//Zastavenie casovaca po dalsom prechode objektu pred snimacom
else if ((meranie==1)&&(aktual < (stara-100))) //&& (meranie == 1) )
{
lcd_puts_addr(0x00,"Stopped ");
TIMER_STOP();
 
meranie=0;
}
 
// Pouzitie tlacidiel
if (ReadButtons() == 1 && meranie==0) // Prve tlacidlo vynuluje počítadlo a vymaze display
{ // ked je pocitanie stopnute
milisekunda=0;
lcd_clrscr();
lcd_puts_addr(0x00," Ready");
 
 
}
 
else if (ReadButtons() == 2 && meranie==1) // Pri pocitani intervalu vymaze hodnotu a
{ // pokracuje v pocitani od nuly
milisekunda=0;
lcd_clrscr();
lcd_puts_addr(0x00,"Counting");
TIMER_START();
}
 
//Program pripraveny pre ostatne dve tlacidla podla potreby uzivatela
 
/*else if (ReadButtons() == 4)
{
}
else if (ReadButtons() == 8)
{
}*/
}
return 0;
}
}
//Obsluha prerusenia pre casovac 0
ISR(TIMER0_OVF_vect)
{
TCNT0+=5; //Pre presnejsiu hodnotu (1ms) je potrebne inkrementovat register casovaca
milisekunda++;         //premenna obsahujuca pocet milisekund (32bit hodnota)
}
</source>
</source>


Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!
Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!


Zdrojový kód: [[Médiá:Serial.h|serial.h]] a [[Médiá:Pip.c|main.c]]
Zdrojový kód: [[Médiá:serial.h|serial.h]] a [[Médiá:serial.c|serial.c]] a [[Médiá:lcd.h|lcd.h]] a [[Médiá:lcd.c|lcd.c]] a [[Médiá:LCDlibrary.h|LCDlibrary.h]] a [[Médiá:LCDlibrary.c|LCDlibrary.c]]


[[Médiá:MojProgram.c|program.c]]
[[Médiá:MojProgram.c|program.c]]
Riadok 79: Riadok 252:
=== Overenie ===
=== Overenie ===


Na obrázku si môžete pozrieť ako je na displeji zobrazovaný nameraný časový interval.
V tejto časti uvádzame obrázky odfotené pri meraní a zároveň potvrdzujeme, že naše zapojenie fungovalo a robilo presne to, čo bolo naprogramované. Na každom obrázku je iná fáza merania.
 
 
Po spustení programu sa na displeji zobrazí tento nápis. V tomto stave stačí prerušiť svetelný lúč snímača a  spustí sa počítanie.
   
   
[[Súbor:ovr cas.jpg]]
[[Súbor:ovr cas.jpg]]


Nezabudnite napísať čosi ako užívateľský návod. Z neho by malo byť jasné čo program robí,
 
ako sa prejavuje a aké má užívateľské rozhranie (čo treba stlačiť, čo sa kde zobrazuje).
 
Ak ste namerali nejaké signály, sem s nimi. Ak je výsledkom nejaký údaj na displeji,
V tomto stave počítadlo počíta, čo môžeme vidieť na displeji. Hodnota neustále nabieha, až do momentu kým znova nepreruší svetelný lúč snímača. Čas je zobrazovaný v [ms].
odfotografujte ho.  
 
[[Súbor:Counting.jpg]]
 
 
 
V tomto stave počítadlo zastavilo počítanie a hodnota v [ms] ostáva zaznamenaná na displeji.
 
[[Súbor:Stopped.jpg]]
 
 


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

Aktuálna revízia z 18:41, 11. január 2014

Autori: Ladislav Vlahi, Matej Jurák
Študijný odbor: Aplikovaná mechatronika 2. Ing. (2013)

Zadanie

Na doske Acrob s LCD displejom je potrebné merať čas medzi dvoma prerušeniami "svetelného lúča". Ako senzor použite Sharp GP 2Y0A21, udalsoť bude predstavovaná zmenou vzdialenosti voči referenčnej. Okrem zobrazenia na displeji bude informácia prenesená aj cez USB rozhranie do PC.

K zapojeniu treba vypracovať dokumentáciu, popis programu, schému zapojenia displeja a riadiacej jednotky. Ako bonus doplňte riadenie intenzity displeja na základe vonkajšieho osvetlenia.


Literatúra:

Analýza

Našou úlohou v semestrálnom projekte bolo vytvorenie merača časového intervalu. Projekt sme realizovali pomocou procesora ATmega 328P, LED displej, snímač.


Použitá doska plošných spojov


Schéma zapojenia dosky plošných spojov


Popis pinov na DPS


Použitý displej

Vlastnosti:

 - 2x8 LCD Displej bez podsvetlenia
 - 4 Tlačítka
 - Trimer na zmenu kontrastu

Technické parametre:

 - Napájanie: 5 V @ 15 mA
 - Pripojenie: 4-Bit parallel interface (Hitachi HD44780 compatible)
 - Rozmery: 60 x 50 x 20 mm
 - Pracovná teplota: 0 až +70 °C



Použitý snímač

Technické parametre:

 - Napájanie: 4.5 - 5.5 V
 - Spotreba: 30 mA
 - Pripojenie: Analógový výstup
 - Rozmery: 29.5 x 13 x 13.5 mm
 - Rozsah merania: 10 - 80 cm

Popis riešenia

Ku zvolenému zadaniu sme mali k dispozícií dosku plošného spoja Acrob (http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/S%C3%BAbor:AcrobBoard.png), ku ktorej sme pripojili modul LCD Terminal AppMod Parallax. Ďalej sme potrebovali pripojiť senzor vzdialenosti Sharp GP 2Y0A21, ktorý vyhodnocoval meraný časový interval. Senzor sme pripojili na analógový vstup DPS konektora X4 na piny 1,2,3. Snímač sme uchytili do stojana, kedy nám senzor vyhodnotil referenčnú hodnotu. Pri zmene hodnoty na senzore sme ju porovnávali s referenčnou hodnotou a spustilo sa meranie časového intervalu. Pri ďalšej zmene hodnoty na snímači sa následne toto meranie zastavilo a na displeji ostala zobrazená hodnota časového intervalu.

Podarilo sa nám rozbehať aj prvé dve tlačidlá pod displejom, ktorým sme priradili funkcie. Prvé tlačidlo vymaže displej, keď už je počítadlo zastavené a vypíše slovo "READY", teda môže sa začať ďalšie počítanie. Druhé tlačidlo vymaže aktuálnu hodnotu času a začína počítať znova od nuly.

Celkové zapojenie


Zapojenie displeja k DPS


Schéma zapojenia snímača


Algoritmus a program

Algorytmus je písaný v jazyku c, pomocou softvéru AVR Atmel Studio. Začíname zadefinovaním knižníc pre ovládanie displeja, sériovej linky, funcií. Ďalej sme vytvorili funkcie pre zapnutie a vypnutie časovača, ktorý v rutine prerušenia postupne napočítava milisekundy, ktoré určujú časový interval medzi dvoma prechodmi pred snímačom. Pre výpis na displej sme použili podprogramy na posúvanie bitov a prepínanie hodnoty daného bitu. Po zadefinovaní potrebných pomocných premenných a nastavení AD prevodníka začína hlavný program. Na začiatku je inicializácia AD prevodníka, sériovej linky, LCD displeja s jeho následným vymazaním. Po povolení globálnych prerušení skočíme do slučky while, kde stále meramie hodnotu z AD prevodníka, ktorý prepočítava analógový signál zo snímača vzdialenosti. V podmienke porovnávame či nastal prechod predmete pred snímačom. Ak sa tak stalo spustí sa časovač a hodnota je vypisovaná na displej. Pri ďalšom prechode sa tento časovač zastaví a celková hodnota časového intervalu je zobrazená na displeji. Pomocou tlačidiel sme vytvorili dve funkcie pre užívateľa.

Vyvojový diagram programu: Chyba pri vytváraní náhľadu: Nepodporovaný typ obrázka

//pripojenie potrebnych kniznic
#include <avr/io.h>
#include <stdio.h>
#include "lcd.h"
#include "serial.h"
#include <string.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "LCDlibrary.h"


//Pomocne funkcie na spustenie a zastavenie casovaca

#define TIMER_STOP() bits_clear(TCCR0B,(bit(CS02)|bit(CS01)|bit(CS00)));TCNT0=0
#define TIMER_START() TCNT0+=5;bits_set(TCCR0B,(bit(CS01)|bit(CS00)))


//Makra na pracu s bitmi
#define bit(m)		((1<<m))
#define bit_set(p,m) ((p) |= bit(m))
#define bits_set(p,m)	((p) |= (m))
#define bits_clear(p,m) ((p) &= ~(m))


FILE mystdout=FDEV_SETUP_STREAM(sendchar,NULL,_FDEV_SETUP_WRITE);   // 'sendchar' je nova funkcia pre jeden znak

//zadefinovanie premennych
int stara=0;
char zobraz[8]={0};
int aktual=0;
int meranie=0;
volatile uint32_t milisekunda;

// A/D converter initialization
void adc_init(void)                                    
{
  ADMUX = 0b01000100;                                  // Ref: external, Channel 4 (ADC4) - NTC
  ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // =0b10000111, A/D ON, prescaler = 128 
}

int main(void) {
	   
	inituart();				// inicializacia seriovej linky
	lcdInit4();                             // inicializacia LCD displeja v 4-bitovom rezime
	adc_init();				// inicializacia AD prevodnika
    lcdControlWrite(LCD_CLR);               	// vymazanie displeja
	stdout = &mystdout;			// odteraz funguje printf();
	
	lcd_puts_addr(0x01,"Ready");
	
	bit_set(TIMSK0,TOIE0);			//Povolenie prerusenia Casovaca 0	
	sei();	


	while(1)
	{
		//nacitanie referencnych hodnot z ADC
		stara= aktual;					// Do premennej stara ulozime predchadzajuci vypocet AD prevodnika
		ADCSRA |= (1<<ADSC);                            // Start A/D conversion
   		while ( !(ADCSRA & (1<<ADIF)));                 // Wait until AD not finished
    	aktual=ADC;						// Aktualna hodnota vypocitana ADC
	
		if (milisekunda>0)
		{
		sprintf(zobraz,"%d ms",milisekunda);		// ulozenie casu v milisekundach do smernika zobraz
		lcd_puts_addr(0x40,zobraz);

                /*
                printf("%d ms",milisekunda);                    // vypis milisekund na terminal pomocou seriovej linky

                */
		}		

		//spustenie casovaca pri prechode pod senzorom
		if ((meranie == 0)&&(aktual<(stara-100))) //&& (meranie==0))
		{
			
			lcd_puts_addr(0x00,"Counting");
			
   			TIMER_START();
					
			meranie =1;				// zmena premennej, vdaka ktorej mozeme zastavit casovac
			
		}
		
		
		//Zastavenie casovaca po dalsom prechode objektu pred snimacom
		else if  ((meranie==1)&&(aktual < (stara-100))) //&& (meranie == 1) )
		{
			
			lcd_puts_addr(0x00,"Stopped ");
			
			TIMER_STOP();			

			meranie=0;			
			
		}
		
		

		// Pouzitie tlacidiel
		if (ReadButtons() == 1 && meranie==0)		// Prve tlacidlo vynuluje počítadlo a vymaze display
		{						// ked je pocitanie stopnute
			milisekunda=0;
			lcd_clrscr();
			lcd_puts_addr(0x00," Ready");


		}

		else if (ReadButtons() == 2 && meranie==1)	// Pri pocitani intervalu vymaze hodnotu a
		{						// pokracuje v pocitani od nuly
			milisekunda=0;							
			lcd_clrscr();
			lcd_puts_addr(0x00,"Counting");			
			TIMER_START();
		}

		
		//Program pripraveny pre ostatne dve tlacidla podla potreby uzivatela

		/*else if (ReadButtons() == 4)
		{
			
		}
		else if (ReadButtons() == 8)
		{
			
		}*/
		
		
	
	}
	return 0;
}


//Obsluha prerusenia pre casovac 0
ISR(TIMER0_OVF_vect)
{
	TCNT0+=5;				//Pre presnejsiu hodnotu (1ms) je potrebne inkrementovat register casovaca
	milisekunda++;			        //premenna obsahujuca pocet milisekund (32bit hodnota)
}

Nezabudnite však nahrať aj kompletné zdrojové kódy vášho programu!

Zdrojový kód: serial.h a serial.c a lcd.h a lcd.c a LCDlibrary.h a LCDlibrary.c

program.c

Overenie

V tejto časti uvádzame obrázky odfotené pri meraní a zároveň potvrdzujeme, že naše zapojenie fungovalo a robilo presne to, čo bolo naprogramované. Na každom obrázku je iná fáza merania.


Po spustení programu sa na displeji zobrazí tento nápis. V tomto stave stačí prerušiť svetelný lúč snímača a spustí sa počítanie.


V tomto stave počítadlo počíta, čo môžeme vidieť na displeji. Hodnota neustále nabieha, až do momentu kým znova nepreruší svetelný lúč snímača. Čas je zobrazovaný v [ms].


V tomto stave počítadlo zastavilo počítanie a hodnota v [ms] ostáva zaznamenaná na displeji.


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