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: | ||
− | + | == 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
Obsah
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 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;
}