Operácie

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

Z SensorWiki

(Typy púzdier snímača)
 
(16 medziľahlých úprav od 2 ďalších používateľov nie je zobrazených)
Riadok 1: Riadok 1:
== Snímač teploty SMT160 ==
 
 
 
 
 
*Vypracovali:  
 
*Vypracovali:  
 
:::::'''Bc. Tivadar Solík'''
 
:::::'''Bc. Tivadar Solík'''
Riadok 9: Riadok 5:
  
 
*Študijný odbor: '''Aplikovaná mechatronika'''                              
 
*Študijný odbor: '''Aplikovaná mechatronika'''                              
*Ročník: '''2. Ing.'''
+
*Ročník: '''2. Ing.''' (2012)
 +
 
 +
 
 +
=== Zadanie: ===
 +
 
 +
Zobrazte na LCD aktuálnu teplotu zmeranú snímačom teploty SMT 160 (meranie šírky impulzov).
  
 +
[[Obrázok:SnimacTeplotySMT160.jpg]]
  
== Zadanie ==
+
'''Literatúra:'''
 +
 
 +
* [http://www.smartec-sensors.com/en/products/temperature-en.html Product Page] (smartec.nl)
 +
* [http://www.smartec.nl/pdf/DSSMT16030.PDF Datasheet]
 +
* Ondřej Vitouš: ''[http://www.hw.cz/Teorie-a-praxe/Programovani/ART387-Jak-na-prevodnik-SMT160-30-92.html Jak na převodník SMT160-30-92]''. (hw.cz)
 +
* Jan Řehák: ''[http://www.hw.cz/Produkty/Nove-soucastky/ART391-Prevodnik-teplota-strida-SMT160-30-92.html Převodník teplota/střída SMT160-30-92]''. (hw.cz)
  
  
#Zobrazte na LCD aktuálnu teplotu zmeranú snímačom teploty SMT 160 (meranie šírky impulzov).
 
  
  
Riadok 23: Riadok 29:
 
===Snímač teploty SMT160===
 
===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.
+
Snímač Smatrec SMT160 je kremíkový teplotný snímač s digitálným PWM výstupom. <br />
 +
Jeho veľkou výhodou je možnosť priamého pripojenia k rôznym typom mikropočítačov <br />
 +
bez potreby použitia A/D prevodu.
 
   
 
   
====Vlastnosti snímača====
+
====Vlastnosti====
*Merací rozsah snímača:  ''od -45°C do 150°C''
+
* Merací rozsah snímača:  ''od -45°C do 150°C''
*Absolútna presnosť:  ''+-0.7°C''
+
* Absolútna presnosť:  ''+-0.7°C''
*Lineárný výstup v rámci:  ''0.2°C''
+
* Lineárný výstup v rámci:  ''0.2°C''
*Maximalné rozlíšenie:  ''0.005°C''
+
* Maximalné rozlíšenie:  ''0.005°C''
  
====Typy púzdier snímača====
+
====Typy púzdier====
 
V našom prípade išlo o typ TO 92
 
V našom prípade išlo o typ TO 92
  
::::::::::[[Súbor:1_housing.jpg]]
+
::[[Súbor:1_housing.jpg]]
 
 
::::::::::::::::'''Obr. 1: Typy zapúzdrení snímača SMT160'''
 
  
 +
:::'''Obr. 1: Typy zapúzdrení snímača SMT160'''
 +
====Zapojenie====
 +
Snímač sme priamo pripojili pomocou kontaktného poľa dosky ACROB a vodičov na port D mikroradiča ATmega 328P bez potreby ďalších komponentov resp. filtrácie.
 +
::[[Súbor:2 SMT 160 WIRE.jpg]]
 +
:::'''Obr. 2: Zapojenie snímača do dosky ACROB'''
 +
 
====Výstupný signál snímača====
 
====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.
+
* 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:  
+
* Perióda výstupu je lineárne závislá od teploty podľa tejto rovnice:  
::::::::::::'''D.C. = 0.320+0.00470*t'''
+
::::::'''D.C. = 0.320+0.00470*t'''
::::::''D.C. = perióda signálu''
+
:::''D.C. = perióda signálu''
::::::''t = teplota v °C''
+
:::''t = teplota v °C''
*Príklad:
+
* Príklad:
 
Výstup pri 0°C  
 
Výstup pri 0°C  
::::::''D.C. = 0.32 alebo 32%''
+
:::''D.C. = 0.32 alebo 32%''
  
 +
=== LCD Modul Parallax===
 +
Dvojriadkový 8-znakový LDC display bez podsvietenia so štyrmi užívateľskými tlačidlami
 +
 +
::[[Obrázok:ParallaxLCDAppMod.jpg]]
 +
 +
:::'''Obr. 3: LCD Terminal AppMod'''
 +
 +
====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
 +
 +
====Zapojenie====
 +
[[Obrázok:Acrob_LCD_Schematic.png]]
 +
:::'''Obr. 4: Zapojenie radiča Hitachi HD44780 pre LCD Terminal AppMod na mikroradič ATmega328P'''
  
 
== Zdrojový kód ==
 
== Zdrojový kód ==
  
Potrebné súbory: [[lcd.c]] [[lcd.h]] [[serial.h]] [[serial.c]] [[ProjektSMT160.c]]  
+
'''Potrebné súbory:''' <br />
 +
 
 +
[[Médiá: ProjektSMT160.c | ProjektSMT160.c]] <br />
 +
[[Médiá: lcd_SMT160.c |‎ lcd.c]] <br />
 +
[[Médiá: lcd_SMT160.h |‎ lcd.h]] <br />
 +
[[Médiá: serial.c |‎ serial.c]] <br />
 +
[[Médiá: serial.h | serial.h]] <br />
  
 +
''Stiahnuť ako zip archív a so zdrojovým súborom:'' <br />
 +
[[Médiá: Source_files.zip | Source_files.zip]] <br />
  
Kód v jazyku C:
+
'''Kód v jazyku C:''' <br />
 
<source lang="c">
 
<source lang="c">
 
#include <avr\io.h>
 
#include <avr\io.h>
Riadok 64: Riadok 107:
 
FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);
 
FILE mystdout = FDEV_SETUP_STREAM(sendchar, NULL, _FDEV_SETUP_WRITE);
  
volatile int nova_Zmena = 0;       // premenna pre novu zmenu hrany signalu
+
volatile int nova_Zmena = 0;       // premenna pre novu zmenu hrany signalu
volatile int predosla_Zmena = 0;   // premenna pre staru 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
+
volatile char navestie_Zmeny = 0; // premenna pre urcenie spustenia vypisu teploty na display
unsigned int strieda = 0;   // premenna na vypocet striedy signalu
+
unsigned int strieda = 0;   // premenna na vypocet striedy signalu
unsigned int sirka = 0;   // energeticka sirka PWM signalu
+
unsigned int sirka = 0;           // energeticka sirka PWM signalu
unsigned int perioda = 0;   // perioda PWM signalu
+
unsigned int perioda = 0;   // perioda PWM signalu
int teplota;   // premenna pre realnu teplotu
+
int teplota;   // premenna pre realnu teplotu
int desiatky,jednotky,desatina;   // premenne pre vypis na display
+
int desiatky,jednotky,desatina;   // premenne pre vypis na display
  
  
ISR(TIMER1_CAPT_vect)       // Timer 1 rutina na zachytenie prerusenia
+
ISR(TIMER1_CAPT_vect)       // Timer 1 rutina na zachytenie prerusenia
 
{
 
{
 
 
TCCR1B = (TCCR1B ^ 0b01000000); // nastavenie sledovania hrany signalu
+
TCCR1B = (TCCR1B ^ 0b01000000); // nastavenie sledovania hrany signalu
  
nova_Zmena = ICR1; // zapis zmeny hrany signalu do pomocneho registra ICR1
+
nova_Zmena = ICR1; // zapis zmeny hrany signalu do pomocneho registra ICR1
navestie_Zmeny = 1; // informacia o zmene hrany pre vypis a display
+
navestie_Zmeny = 1; // informacia o zmene hrany pre vypis a display
  
if (TCCR1B & 0b01000000) // nastavenie merania sirky pasma a periody signalu
+
if (TCCR1B & 0b01000000) // nastavenie merania sirky pasma a periody signalu
sirka = (nova_Zmena - predosla_Zmena); // meranie sirky pri prechode z nabeznej hrany na dobeznu
+
sirka = (nova_Zmena - predosla_Zmena);         // meranie sirky pri prechode z nabeznej hrany na dobeznu
 
 
 
else
 
else
 
{
 
{
perioda = (nova_Zmena - predosla_Zmena); // meranie periody pri prechode z nabeznej hrany na dalsiu nabeznu hranu
+
perioda = (nova_Zmena - predosla_Zmena);       // meranie periody pri prechode z nabeznej hrany na dalsiu
predosla_Zmena = nova_Zmena; // navestie na dalsiu zmenu
+
predosla_Zmena = nova_Zmena; // navestie na dalsiu zmenu
 
 
 
}
 
}
  
strieda = ((sirka*200)/perioda); // strieda v percentach x2
+
strieda = ((sirka*200)/perioda); // strieda v percentach x2
teplota = (((strieda -64)*2000)/47)/4; // vypocet vyslednej teploty pri refencii 0°C
+
teplota = (((strieda -64)*2000)/47)/4; // vypocet vyslednej teploty pri refencii 0°C
 +
 +
 +
desiatky = teplota / 100; // teplota po deleni 100, vypise 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 (kat. hod. presnosti merania -30 az 100 je 0.7)
 
 
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  
{ // pri rozsahu 0 az 100 ratame presnost 0.5 (oblast najvacsej linearity prevodu - najvyssia pri 20°C)
+
desatina = 5; //oblast najvacsej linearity prevodu - najvyssia pri 20°C
desatina = 5;
 
 
}
 
}
 
else {
 
else {
Riadok 115: Riadok 162:
  
 
inituart();
 
inituart();
//stdout = &mystdout;       // Odteraz funguje printf(); pouzite bolo pri vypisovani hodnot na terminal
+
//stdout = &mystdout;       // Odteraz funguje printf();  
  
  
DDRD  = 0b00001110; // inicializaci portu a prislusnych pinov
+
DDRD  = 0b00001110; // inicializaci portu a prislusnych pinov
lcdInit4(); // inicializacia display-a
+
lcdInit4(); // inicializacia display-a
 
_delay_ms(10);
 
_delay_ms(10);
DDRB = 0x00;               // Set ICR - Port B, pin0 na Vstup
+
DDRB = 0x00;                       // Set ICR - Port B, pin0 na Vstup
TCCR1B = 0b00000010;       // nastavene na dobeznu hranu a nastavenie preddelicky 8-bit FAST PWM.
+
TCCR1B = 0b00000010;       // nastavene na dobeznu hranu a preddelicky 8-bit FAST PWM.
TCCR1A = 0b00000000;       // T1 v mode timera
+
TCCR1A = 0b00000000;       // T1 v mode timera
TCNT1 = 0x0000;           // inicializacia pocitadla (16-bit spodne+vrchne bity)
+
TCNT1 = 0x0000;           // inicializacia pocitadla (16-bit spodne+vrchne bity)
TIFR1 = (1<<ICF1);         // (1<<ICF1);  if a 1 is written to a ICF1 bit
+
TIFR1 = (1<<ICF1);         // navestie ICF1 bude automaticky zmazane po vykonani prerusenia
//    - the ICF1 bit will be cleared
 
 
 
TIMSK1 = 0b00100000;       // povolenie ICR preruseni
+
TIMSK1 = 0b00100000;       // povolenie ICR preruseni
sei();                   // povolenie globalneho prerusenia
+
sei();                   // povolenie globalneho prerusenia
 
 
 
lcdControlWrite(0b01000000);
 
lcdControlWrite(0b01000000);
Riadok 135: Riadok 181:
  
  
lcdControlWrite(0x00+0x80); // zapis na prvy riadok display-a
+
lcdControlWrite(0x00+0x80);         // zapis na prvy riadok display-a
 
_delay_ms(10);
 
_delay_ms(10);
 
lcdDataWrite('T');
 
lcdDataWrite('T');
Riadok 151: Riadok 197:
 
{
 
{
 
 
lcdControlWrite(0x40+0x80); //zapis na druhy riadok display-a
+
lcdControlWrite(0x40+0x80); //zapis na druhy riadok display-a
 
_delay_ms(10);
 
_delay_ms(10);
lcdDataWrite('0'+desiatky); //desiatky
+
lcdDataWrite('0'+desiatky); //desiatky
lcdDataWrite('0'+jednotky); //jednotky
+
lcdDataWrite('0'+jednotky); //jednotky
lcdDataWrite('.'); //desatinna ciara
+
lcdDataWrite('.'); //desatinna ciara
lcdDataWrite('0'+desatina); //desatinne cislo
+
lcdDataWrite('0'+desatina); //desatinne cislo
lcdDataWrite(0b11011111); //binarny kod stupna (°)
+
lcdDataWrite(0b11011111); //binarny kod stupna (°)
 
lcdDataWrite('C');
 
lcdDataWrite('C');
 
 
_delay_ms(1000); // oneskorenie, vypis na druhy riadok display-a sa uskutoční každých 5 sekúnd
+
_delay_ms(1000); // oneskorenie, vypis na druhy riadok display-a každých 5 sec
 
 
navestie_Zmeny = 0; // vynulovanie navestia zmeny
+
navestie_Zmeny = 0; // vynulovanie navestia zmeny
 
}
 
}
 
}
 
}

Aktuálna revízia z 14:01, 18. november 2013

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


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


Zadanie:

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

SnimacTeplotySMT160.jpg

Literatúra:



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

  • 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

V našom prípade išlo o typ TO 92

1 housing.jpg
Obr. 1: Typy zapúzdrení snímača SMT160

Zapojenie

Snímač sme priamo pripojili pomocou kontaktného poľa dosky ACROB a vodičov na port D mikroradiča ATmega 328P bez potreby ďalších komponentov resp. filtrácie.

2 SMT 160 WIRE.jpg
Obr. 2: Zapojenie snímača do dosky ACROB

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%

LCD Modul Parallax

Dvojriadkový 8-znakový LDC display bez podsvietenia so štyrmi užívateľskými tlačidlami

ParallaxLCDAppMod.jpg
Obr. 3: LCD Terminal AppMod

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

Zapojenie

Acrob LCD Schematic.png

Obr. 4: Zapojenie radiča Hitachi HD44780 pre LCD Terminal AppMod na mikroradič ATmega328P

Zdrojový kód

Potrebné súbory:

ProjektSMT160.c
‎ lcd.c
‎ lcd.h
‎ serial.c
serial.h

Stiahnuť ako zip archív a so zdrojovým súborom:
Source_files.zip

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
	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, vypise 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 (kat. hod. presnosti merania -30 az 100 je 0.7)
	
	
	{						// pri rozsahu 0 az 100 ratame presnost 0.5 
		desatina = 5;				//oblast najvacsej linearity prevodu - najvyssia pri 20°C
	}
	else {

		desatina = 0;
	}

};

int main(void)
{

	inituart();
	//stdout = &mystdout;        			// Odteraz funguje printf(); 


	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 preddelicky 8-bit FAST PWM.
	TCCR1A = 0b00000000;        			// T1 v mode timera
	TCNT1 = 0x0000;           			// inicializacia pocitadla (16-bit spodne+vrchne bity)
	TIFR1 = (1<<ICF1);          			// navestie ICF1 bude automaticky zmazane po vykonani prerusenia 
	
	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 každých 5 sec
			
			navestie_Zmeny = 0;		// vynulovanie navestia zmeny
		}
	}


	return 0;
}