This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:examples:sensor:thermistor [2010/02/18 12:42] – vana versioon taastatud mikk.leini | et:examples:sensor:thermistor [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | < | ||
====== Termistor ====== | ====== Termistor ====== | ||
- | //Vajalikud teadmised: [HW] [[et: | + | //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 < | ||
#include < | #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) | ||
{ | { | ||
unsigned short value; | unsigned short value; | ||
- | signed short temperature; | + | signed short temperature; |
char text[16]; | char text[16]; | ||
- | + | ||
- | // LCD ekraani | + | // LCD ekraani |
- | lcd_alpha_init(LCD_ALPHA_DISP_ON); | + | lcd_gfx_init(); |
- | + | ||
- | // LCD ekraani puhastamine | + | // LCD ekraani puhastamine |
- | lcd_alpha_clear(); | + | lcd_gfx_clear(); |
- | + | lcd_gfx_backlight(true); | |
- | // Programmi | + | |
- | lcd_alpha_write_string(" | + | // Programmi |
- | + | lcd_gfx_goto_char_xy(1, | |
+ | lcd_gfx_write_string(" | ||
// ADC muunduri seadistamine | // ADC muunduri seadistamine | ||
adc_init(ADC_REF_AVCC, | adc_init(ADC_REF_AVCC, | ||
- | + | ||
// 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 | ||
Line 134: | Line 138: | ||
// Temperatuuri tekstiks teisendamine | // Temperatuuri tekstiks teisendamine | ||
- | // Kraadi märgi kuvamiseks on oktaalarv | + | // Kraadi märgi kuvamiseks on oktaalarv |
- | sprintf(text, | + | sprintf(text, |
+ | |||
+ | // Teksti kuvamine LCD kolmandal real | ||
+ | lcd_gfx_goto_char_xy(5, | ||
+ | lcd_gfx_write_string(text); | ||
+ | |||
+ | hw_delay_ms(1000); | ||
- | // Teksti kuvamine LCD teise rea alguses | ||
- | lcd_alpha_goto_xy(0, | ||
- | lcd_alpha_write_string(text); | ||
} | } | ||
+ | return 0; | ||
} | } | ||
</ | </ |