This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:examples:sensor:thermistor [2012/06/09 10:58] – raivo.sell | et:examples:sensor:thermistor [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | < | ||
====== Termistor ====== | ====== Termistor ====== | ||
- | //Vajalikud teadmised: | + | //Vajalikud teadmised: |
+ | [HW] [[et: | ||
+ | [ELC] [[et: | ||
+ | [AVR] [[et: | ||
+ | [LIB] [[et: | ||
===== Teooria ===== | ===== Teooria ===== | ||
- | [{{ : | + | [{{ : |
Termistor on takisti, mille takistus muutub temperatuuriga. Termistore on kahte liiki: positiivse ja negatiivse temperatuuri koefitsiendiga. Positiivse koefitsiendiga termistori takistus temperatuuri tõustes kasvab ja negatiivsel väheneb. Vastavad lühendatud ingliskeelsed nimed on neil PTC (//positive temperature coefficient// | Termistor on takisti, mille takistus muutub temperatuuriga. Termistore on kahte liiki: positiivse ja negatiivse temperatuuri koefitsiendiga. Positiivse koefitsiendiga termistori takistus temperatuuri tõustes kasvab ja negatiivsel väheneb. Vastavad lühendatud ingliskeelsed nimed on neil PTC (//positive temperature coefficient// | ||
Line 23: | Line 28: | ||
Piiratud ressurssidega ja suurt täpsust mittenõudvates rakendustes kasutatakse eelnevalt välja arvutatud temperatuuri ja takistuse vahelise sõltuvuse tabelit. Tabelis on üldjuhul kirjas kindla vahemikuga temperatuurinäitude vastavus anduri takistuse, pinge või analoog-digitaalmuunduri väärtusega. Tabeli puhul on kogu eksponentsiaalne arvutus eelnevalt ära tehtud ja programmis tuleb vaid mõõdetud parameetrile vastav rida üles otsida ja temperatuur välja lugeda. | Piiratud ressurssidega ja suurt täpsust mittenõudvates rakendustes kasutatakse eelnevalt välja arvutatud temperatuuri ja takistuse vahelise sõltuvuse tabelit. Tabelis on üldjuhul kirjas kindla vahemikuga temperatuurinäitude vastavus anduri takistuse, pinge või analoog-digitaalmuunduri väärtusega. Tabeli puhul on kogu eksponentsiaalne arvutus eelnevalt ära tehtud ja programmis tuleb vaid mõõdetud parameetrile vastav rida üles otsida ja temperatuur välja lugeda. | ||
+ | < | ||
===== Praktika ===== | ===== Praktika ===== | ||
- | Kodulabori | + | Kodulabori |
- | Temperatuuri leidmiseks on AVR-i peal otstarbekas kasutada temperatuuri ja analoog-digitaalmuunduri väärtuste teisendustabelit. Mõistlik on leida soovitud temperatuurivahemikust igale kraadile vastav analoog-digitaalmuunduri väärtus, sest vastupidine tabel läheb 10-bitise ADC väärtuste hulga tõttu liiga suureks. Tabeli tegemiseks on soovitatav kasutada mõnd tabelarvutuse programmi (MS Excel, | + | Temperatuuri leidmiseks on AVR-il otstarbekas kasutada temperatuuri ja analoog-digitaalmuunduri väärtuste teisendustabelit. Mõistlik on leida soovitud temperatuurivahemikust igale kraadile vastav analoog-digitaalmuunduri väärtus, sest vastupidine tabel läheb 10-bitise ADC väärtuste hulga tõttu liiga suureks. Tabeli tegemiseks on soovitatav kasutada mõnd tabelarvutuse programmi (MS Excel, |
<code c> | <code c> | ||
- | // | + | // Temperatuuri ADC väärtuseks teisendamise tabel |
- | // Temperatuuri ADC väärtuseks teisendamise tabel. | + | // Iga massiivi element tähistab ühte Celsiuse kraadi |
- | // Iga massiivi element tähistab ühte Celsiuse kraadi. | + | // Elemendid algavad -20 kraadist ja lõpevad 100 kraadiga |
- | // Elemendid algavad -20 kraadist ja lõpevad 100 kraadiga. | + | // Kokku on massiivis 121 elementi |
- | // Kokku on massiivis 121 elementi. | + | |
- | // | + | |
const signed short min_temp = -20; | const signed short min_temp = -20; | ||
const signed short max_temp = 100; | const signed short max_temp = 100; | ||
Line 55: | Line 58: | ||
}; | }; | ||
</ | </ | ||
- | |||
- | ~~PB~~ | ||
Et tabelist ADC väärtuse järgi temperatuur leida, võib kasutada järgmist algoritmi: | Et tabelist ADC väärtuse järgi temperatuur leida, võib kasutada järgmist algoritmi: | ||
<code c> | <code c> | ||
- | // | + | // ADC väärtuse teisendamine Celsiuse kraadideks |
- | // ADC väärtuse teisendamine Celsiuse kraadideks. | + | |
- | // | + | |
signed short thermistor_calculate_celsius(unsigned short adc_value) | signed short thermistor_calculate_celsius(unsigned short adc_value) | ||
{ | { | ||
Line 74: | Line 73: | ||
// mõõdetud tulemus, siis temperatuur on vähemalt | // mõõdetud tulemus, siis temperatuur on vähemalt | ||
// sama kõrge kui elemendile vastav temperatuur | // sama kõrge kui elemendile vastav temperatuur | ||
+ | |||
if (adc_value >= conversion_table[celsius]) | if (adc_value >= conversion_table[celsius]) | ||
{ | { | ||
Line 89: | Line 89: | ||
Algoritm otsib tabelist vahemikku, kuhu ADC väärtus jääb, ja saab teada selle vahemiku aluspiiri järjekorranumbri. Järjekorranumber tähistab kraade, sellele tuleb ainult algtemperatuur otsa liita ja nii saadaksegi 1 kraadi täpsusega temperatuur. | Algoritm otsib tabelist vahemikku, kuhu ADC väärtus jääb, ja saab teada selle vahemiku aluspiiri järjekorranumbri. Järjekorranumber tähistab kraade, sellele tuleb ainult algtemperatuur otsa liita ja nii saadaksegi 1 kraadi täpsusega temperatuur. | ||
- | Toodud teisendustabel ja funktsioon on juba olemas Kodulabori teegis, nii et käesolevas harjutuses neid ise kirjutama ei pea. Teisendamise funktsioonil on teegis nimeks // | + | Toodud teisendustabel ja funktsioon on juba olemas Kodulabori teegis, nii et käesolevas harjutuses neid ise kirjutama ei pea. Teisendamise funktsioonil on teegis nimeks // |
- | ~~PB~~ | ||
<code c> | <code c> | ||
- | // | + | // Kodulabori termistori näidisprogramm |
- | // Kodulabori | + | // LCD ekraanil kuvatakse temperatuur kraadides |
- | // LCD ekraanil kuvatakse temperatuur kraadides. | + | |
- | // | + | |
#include < | #include < | ||
#include < | #include < | ||
Line 103: | Line 100: | ||
#include < | #include < | ||
#include < | #include < | ||
- | // | + | |
+ | // Robootika Kodulabor II | ||
+ | //#define ADC_CHANNEL 2 | ||
+ | |||
+ | // Robootika Kodulabor III | ||
+ | #define ADC_CHANNEL 14 | ||
// Põhiprogramm | // Põhiprogramm | ||
- | // | ||
int main(void) | int main(void) | ||
{ | { | ||
Line 122: | Line 124: | ||
lcd_gfx_goto_char_xy(1, | lcd_gfx_goto_char_xy(1, | ||
lcd_gfx_write_string(" | lcd_gfx_write_string(" | ||
- | |||
// ADC muunduri seadistamine | // ADC muunduri seadistamine | ||
Line 128: | Line 129: | ||
// Lõputu tsükkel | // Lõputu tsükkel | ||
- | while (true) | + | while (1) |
{ | { | ||
// Termistori pinge 4-kordselt ümardatud väärtuse lugemine | // Termistori pinge 4-kordselt ümardatud väärtuse lugemine | ||
- | value = adc_get_average_value(2, 4); | + | value = adc_get_average_value(ADC_CHANNEL, 4); |
// ADC väärtuse kraadideks ümberarvutamine | // ADC väärtuse kraadideks ümberarvutamine |