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:40] – 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:electronics:voltage_divider]], | ||
| + | [AVR] [[et:avr:adc]], | ||
| + | [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; | ||
| } | } | ||
| </ | </ | ||