Operácie

Projekt: Snímač teploty SMT160: Rozdiel medzi revíziami

Z SensorWiki

(Vytvorená stránka „Sem príde správa z riešenia projektu. Category:AVR Category:DVPS“)
 
Riadok 1: Riadok 1:
Sem príde správa z riešenia projektu.
+
== Snímač teploty SMT160 ==
 +
 
 +
 
 +
 
 +
*Vypracovali:
 +
:::::'''Bc. Tivadar Solík'''
 +
:::::'''Bc. Pavol Šnyr'''
 +
 
 +
 
 +
*Študijný odbor: '''Aplikovaná mechatronika'''                            
 +
*Ročník: '''2. Ing.'''
 +
 
 +
 
 +
== Zadanie ==
 +
 
 +
 
 +
#Zobrazte na LCD aktuálnu teplotu zmeranú snímačom teploty SMT 160 (meranie šírky impulzov).
 +
 
 +
 
 +
== Riešenie ==
 +
 
 +
 
 +
===Snímač teploty SMT160===
 +
 
 +
Snímač Smatrec SMT160 je kremíkový teplotný snímač s digitálným PWM výstupom. Jeho veľkou výhodou je možnosť priamého pripojenia k rôznym typom mikropočítačov bez potreby použitia A/D prevodu.
 +
 +
====Vlastnosti snímača====
 +
*Merací rozsah snímača:  ''od -45°C do 150°C''
 +
*Absolútna presnosť:  ''+-0.7°C''
 +
*Lineárný výstup v rámci:  ''0.2°C''
 +
*Maximalné rozlíšenie:  ''0.005°C''
 +
 
 +
====Typy púzdier snímača====
 +
V našom prípade išlo o typ TO 92
 +
[[Súbor:1_housing.jpg]]
 +
'''Obr. 1: Typy zapúzdrení snímača SMT160'''
 +
 
 +
====Výstupný signál snímača====
 +
*Výstupom je obdlžníkový signal s definovanou šírkou periódy v závislosti od meranej teploty.
 +
*Perióda výstupu je lineárne závislá od teploty podľa tejto rovnice:
 +
::::::::::::'''D.C. = 0.320+0.00470*t'''
 +
::::::''D.C. = perióda signálu''
 +
::::::''t = teplota v °C''
 +
*Príklad:
 +
Výstup pri 0°C
 +
::::::''D.C. = 0.32 alebo 32%''
 +
 
 +
 
 +
== Zdrojový kód ==
 +
 
 +
Potrebné súbory: [[lcd.c]] [[lcd.h]] [[serial.h]] [[serial.c]] [[ProjektSMT160.c]]
 +
 
 +
 
 +
Kód v jazyku C:
 +
<source lang="c">
 +
#include <avr\io.h>
 +
#include "serial.h"
 +
#include <stdio.h>
 +
#include "lcd.h"
 +
#include <avr/interrupt.h>
 +
 
 +
FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);
 +
 
 +
volatile int nova_Zmena = 0;      // premenna pre novu zmenu hrany signalu
 +
volatile int predosla_Zmena = 0;  // premenna pre staru zmenu hrany signalu
 +
volatile char navestie_Zmeny = 0;  // premenna pre urcenie spustenia vypisu teploty na display
 +
unsigned int strieda = 0;   // premenna na vypocet striedy signalu
 +
unsigned int sirka = 0;   // energeticka sirka PWM signalu
 +
unsigned int perioda = 0;   // perioda PWM signalu
 +
int teplota;   // premenna pre realnu teplotu
 +
int desiatky,jednotky,desatina;   // premenne pre vypis na display
 +
 
 +
 
 +
ISR(TIMER1_CAPT_vect)      // Timer 1 rutina na zachytenie prerusenia
 +
{
 +
 +
TCCR1B = (TCCR1B ^ 0b01000000); // nastavenie sledovania hrany signalu
 +
 
 +
nova_Zmena = ICR1; // zapis zmeny hrany signalu do pomocneho registra ICR1
 +
navestie_Zmeny = 1; // informacia o zmene hrany pre vypis a display
 +
 
 +
if (TCCR1B & 0b01000000) // nastavenie merania sirky pasma a periody signalu
 +
sirka = (nova_Zmena - predosla_Zmena); // meranie sirky pri prechode z nabeznej hrany na dobeznu
 +
 +
else
 +
{
 +
perioda = (nova_Zmena - predosla_Zmena); // meranie periody pri prechode z nabeznej hrany na dalsiu nabeznu hranu
 +
predosla_Zmena = nova_Zmena; // navestie na dalsiu zmenu
 +
 +
}
 +
 
 +
strieda = ((sirka*200)/perioda); // strieda v percentach x2
 +
teplota = (((strieda -64)*2000)/47)/4; // vypocet vyslednej teploty pri refencii 0°C
 +
 +
 +
desiatky = teplota / 100; // teplota po deleni 100, dostanem prve cislo ktore vypiseme na display (desiatky)
 +
jednotky = (teplota/10) % 10; // teplota po delení 10 a modulo 10, tj po deleni 10 a zvysok po deleni 10, dostanem druhe cislo na display (jednotky)
 +
desatina = teplota % 10; // teplota zvysok po deleni 10 ziskam desatinnu hodnotu
 +
 +
if ( (desatina>3 & desatina<7) )     // podmienka na vypis desatinnej hodnoty a zaokruhlenie na pol stupna (katalogova hodnota presnoti merania -30 az 100 je 0.7)
 +
{ // pri rozsahu 0 az 100 ratame presnost 0.5 (oblast najvacsej linearity prevodu - najvyssia pri 20°C)
 +
desatina = 5;
 +
}
 +
else {
 +
 
 +
desatina = 0;
 +
}
 +
 
 +
};
 +
 
 +
int main(void)
 +
{
 +
 
 +
inituart();
 +
//stdout = &mystdout;        // Odteraz funguje printf(); pouzite bolo pri vypisovani hodnot na terminal
 +
 
 +
 
 +
DDRD  = 0b00001110; // inicializaci portu a prislusnych pinov
 +
lcdInit4(); // inicializacia display-a
 +
_delay_ms(10);
 +
DDRB = 0x00;                // Set ICR - Port B, pin0 na Vstup
 +
TCCR1B = 0b00000010;        // nastavene na dobeznu hranu a nastavenie preddelicky 8-bit FAST PWM.
 +
TCCR1A = 0b00000000;        // T1 v mode timera
 +
TCNT1 = 0x0000;          // inicializacia pocitadla (16-bit spodne+vrchne bity)
 +
TIFR1 = (1<<ICF1);          // (1<<ICF1);  if a 1 is written to a ICF1 bit
 +
//    - the ICF1 bit will be cleared
 +
 +
TIMSK1 = 0b00100000;        // povolenie ICR preruseni
 +
sei();                    // povolenie globalneho prerusenia
 +
 +
lcdControlWrite(0b01000000);
 +
_delay_us(10);
 +
 
 +
 
 +
lcdControlWrite(0x00+0x80); // zapis na prvy riadok display-a
 +
_delay_ms(10);
 +
lcdDataWrite('T');
 +
lcdDataWrite('e');
 +
lcdDataWrite('p');
 +
lcdDataWrite('l');
 +
lcdDataWrite('o');
 +
lcdDataWrite('t');
 +
lcdDataWrite('a');
 +
lcdDataWrite(':');
 +
 
 +
while(1)
 +
{
 +
if(navestie_Zmeny)
 +
{
 +
 +
lcdControlWrite(0x40+0x80); //zapis na druhy riadok display-a
 +
_delay_ms(10);
 +
lcdDataWrite('0'+desiatky); //desiatky
 +
lcdDataWrite('0'+jednotky); //jednotky
 +
lcdDataWrite('.'); //desatinna ciara
 +
lcdDataWrite('0'+desatina); //desatinne cislo
 +
lcdDataWrite(0b11011111); //binarny kod stupna (°)
 +
lcdDataWrite('C');
 +
 +
_delay_ms(1000); // oneskorenie, vypis na druhy riadok display-a sa uskutoční každých 5 sekúnd
 +
 +
navestie_Zmeny = 0; // vynulovanie navestia zmeny
 +
}
 +
}
 +
 
 +
 
 +
return 0;
 +
}
 +
 
 +
</source>
 +
 
  
 
[[Category:AVR]] [[Category:DVPS]]
 
[[Category:AVR]] [[Category:DVPS]]

Verzia zo dňa a času 14:52, 3. január 2013

Snímač teploty SMT160

  • Vypracovali:
Bc. Tivadar Solík
Bc. Pavol Šnyr


  • Študijný odbor: Aplikovaná mechatronika
  • Ročník: 2. Ing.


Zadanie

  1. Zobrazte na LCD aktuálnu teplotu zmeranú snímačom teploty SMT 160 (meranie šírky impulzov).


Riešenie

Snímač teploty SMT160

Snímač Smatrec SMT160 je kremíkový teplotný snímač s digitálným PWM výstupom. Jeho veľkou výhodou je možnosť priamého pripojenia k rôznym typom mikropočítačov bez potreby použitia A/D prevodu.

Vlastnosti snímača

  • Merací rozsah snímača: od -45°C do 150°C
  • Absolútna presnosť: +-0.7°C
  • Lineárný výstup v rámci: 0.2°C
  • Maximalné rozlíšenie: 0.005°C

Typy púzdier snímača

V našom prípade išlo o typ TO 92 1 housing.jpg Obr. 1: Typy zapúzdrení snímača SMT160

Výstupný signál snímača

  • Výstupom je obdlžníkový signal s definovanou šírkou periódy v závislosti od meranej teploty.
  • Perióda výstupu je lineárne závislá od teploty podľa tejto rovnice:
D.C. = 0.320+0.00470*t
D.C. = perióda signálu
t = teplota v °C
  • Príklad:

Výstup pri 0°C

D.C. = 0.32 alebo 32%


Zdrojový kód

Potrebné súbory: lcd.c lcd.h serial.h serial.c ProjektSMT160.c


Kód v jazyku C:

#include <avr\io.h>
#include "serial.h"
#include <stdio.h>
#include "lcd.h"
#include <avr/interrupt.h>

FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);

volatile int nova_Zmena = 0;       								// premenna pre novu zmenu hrany signalu
volatile int predosla_Zmena = 0;   								// premenna pre staru zmenu hrany signalu
volatile char navestie_Zmeny = 0;  								// premenna pre urcenie spustenia vypisu teploty na display
unsigned int strieda = 0;		   								// premenna na vypocet striedy signalu
unsigned int sirka = 0;			   								// energeticka sirka PWM signalu
unsigned int perioda = 0;		   								// perioda PWM signalu
int teplota;					   								// premenna pre realnu teplotu
int desiatky,jednotky,desatina;	   								// premenne pre vypis na display


ISR(TIMER1_CAPT_vect)       									// Timer 1 rutina na zachytenie prerusenia
{
	
	TCCR1B = (TCCR1B ^ 0b01000000);								// nastavenie sledovania hrany signalu

	nova_Zmena = ICR1;											// zapis zmeny hrany signalu do pomocneho registra ICR1
	navestie_Zmeny = 1;											// informacia o zmene hrany pre vypis a display

	if (TCCR1B & 0b01000000) 									// nastavenie merania sirky pasma a periody signalu
	sirka = (nova_Zmena - predosla_Zmena);						// meranie sirky pri prechode z nabeznej hrany na dobeznu
	
	else
	{
		perioda = (nova_Zmena - predosla_Zmena);				// meranie periody pri prechode z nabeznej hrany na dalsiu nabeznu hranu
		predosla_Zmena = nova_Zmena;							// navestie na dalsiu zmenu
		
	}

	strieda = ((sirka*200)/perioda);							// strieda v percentach x2
	teplota = (((strieda -64)*2000)/47)/4;						// vypocet vyslednej teploty pri refencii 0°C
	
	
	desiatky = teplota / 100;									// teplota po deleni 100, dostanem prve cislo ktore vypiseme na display (desiatky)
	jednotky = (teplota/10) % 10; 								// teplota po delení 10 a modulo 10, tj po deleni 10 a zvysok po deleni 10, dostanem druhe cislo na display (jednotky)
	desatina = teplota % 10;									// teplota zvysok po deleni 10 ziskam desatinnu hodnotu
	
	if ( (desatina>3 & desatina<7) )				    		// podmienka na vypis desatinnej hodnoty a zaokruhlenie na pol stupna (katalogova hodnota presnoti merania -30 az 100 je 0.7)
	{															// pri rozsahu 0 az 100 ratame presnost 0.5 (oblast najvacsej linearity prevodu - najvyssia pri 20°C)
		desatina = 5;
	}
	else {

		desatina = 0;
	}

};

int main(void)
{

	inituart();
	//stdout = &mystdout;        								// Odteraz funguje printf(); pouzite bolo pri vypisovani hodnot na terminal


	DDRD  = 0b00001110;											// inicializaci portu a prislusnych pinov
	lcdInit4();													// inicializacia display-a
	_delay_ms(10);
	DDRB = 0x00;                								// Set ICR - Port B, pin0 na Vstup
	TCCR1B = 0b00000010;        								// nastavene na dobeznu hranu a nastavenie preddelicky 8-bit FAST PWM.
	TCCR1A = 0b00000000;        								// T1 v mode timera
	TCNT1 = 0x0000;           									// inicializacia pocitadla (16-bit spodne+vrchne bity)
	TIFR1 = (1<<ICF1);          								// (1<<ICF1);   if a 1 is written to a ICF1 bit
	//    - the ICF1 bit will be cleared
	
	TIMSK1 = 0b00100000;        								// povolenie ICR preruseni
	sei();                    									// povolenie globalneho prerusenia
	
	lcdControlWrite(0b01000000);
	_delay_us(10);


	lcdControlWrite(0x00+0x80);									// zapis na prvy riadok display-a
	_delay_ms(10);
	lcdDataWrite('T');
	lcdDataWrite('e');
	lcdDataWrite('p');
	lcdDataWrite('l');
	lcdDataWrite('o');
	lcdDataWrite('t');
	lcdDataWrite('a');
	lcdDataWrite(':');

	while(1)
	{
		if(navestie_Zmeny)
		{
			
			lcdControlWrite(0x40+0x80);							//zapis na druhy riadok display-a
			_delay_ms(10);
			lcdDataWrite('0'+desiatky);							//desiatky
			lcdDataWrite('0'+jednotky);							//jednotky
			lcdDataWrite('.');									//desatinna ciara
			lcdDataWrite('0'+desatina);							//desatinne cislo
			lcdDataWrite(0b11011111);							//binarny kod stupna (°)
			lcdDataWrite('C');
			
			_delay_ms(1000);									// oneskorenie, vypis na druhy riadok display-a sa uskutoční každých 5 sekúnd
			
			navestie_Zmeny = 0;									// vynulovanie navestia zmeny
		}
	}


	return 0;
}