This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:examples:sensor:potentiometer [2014/10/09 07:35] – raivo.sell | et:examples:sensor:potentiometer [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ~~PB~~ | + | < |
====== Potentsiomeeter ====== | ====== Potentsiomeeter ====== | ||
- | //Vajalikud teadmised: [HW] [[et: | + | //Vajalikud teadmised: |
+ | [HW] [[et: | ||
+ | [ELC] [[et: | ||
+ | [AVR] [[et: | ||
+ | [LIB] [[et: | ||
===== Teooria ===== | ===== Teooria ===== | ||
Line 9: | Line 13: | ||
Potentsiomeeter on kolme kontaktiga muuttakisti, | Potentsiomeeter on kolme kontaktiga muuttakisti, | ||
- | |||
- | [{{ : | ||
Tüüpiline potentsiomeeter koosneb voolu juhtiva pinnaga takistist ja sellel liuglevast liikuvast kontaktist ehk liugurist. Mida lähemal on liugur takisti servale, seda väiksem on liuguri ja selle serva vaheline takistus ning vastupidi. Takisti rolli võib täita kas suure eritakistusega materjal või takistustraadist keritud mähis. Potentsiomeetreid on olemas nii lineaarse kui ka logaritmilise takistuse ja positsiooni suhtega. Suurem osa potentsiomeetritest on pööratavad (näide kõrvaloleval pildil), kuid eksisteerib ka liugtakisteid. Potentsiomeetrite eriliik on digitaalsed potentsiomeetrid, | Tüüpiline potentsiomeeter koosneb voolu juhtiva pinnaga takistist ja sellel liuglevast liikuvast kontaktist ehk liugurist. Mida lähemal on liugur takisti servale, seda väiksem on liuguri ja selle serva vaheline takistus ning vastupidi. Takisti rolli võib täita kas suure eritakistusega materjal või takistustraadist keritud mähis. Potentsiomeetreid on olemas nii lineaarse kui ka logaritmilise takistuse ja positsiooni suhtega. Suurem osa potentsiomeetritest on pööratavad (näide kõrvaloleval pildil), kuid eksisteerib ka liugtakisteid. Potentsiomeetrite eriliik on digitaalsed potentsiomeetrid, | ||
===== Praktika ===== | ===== Praktika ===== | ||
- | + | [{{ : | |
- | Kodulabori moodulil asub pööratav potentsiomeeter. Potentsiomeeter on ühendatud maa ja mikrokontrolleri toite potentsiaalide vahele ning liugur ühendub mikrokontrolleri analoog-digitaalmuunduriga. Selliselt ühendatuna saab potentsiomeetri väljundpinget reguleerida vahemikus 0 V kuni toitepinge. Kui ka AVR-i analoog-digitaalmuunduri võrdluspinge võtta AVCC viigult, saab potentsiomeetri väljundpinge digitaalse väärtuse kogu selle reguleerimispiirkonna ulatuses. Kodulabor III puhul on maksimaalseks pingeks AVCC viigul 2.7 V kuid sisenditesse võib lasta kuni 3.3 V pinget. AVR ADC kasutamiseks on Kodulabori teegis kirjutatud järgmised funktsioonid: | + | Kodulabori moodulil asub pööratav |
* void adc_init(reference, | * void adc_init(reference, | ||
Line 24: | Line 26: | ||
Funktsioon // | Funktsioon // | ||
+ | |||
+ | Järgnevad teegifunktsioonide näited on toodud ATmega2561 ADC muunduri kohta. | ||
<code c> | <code c> | ||
- | // | ||
// ADC käivitamine | // ADC käivitamine | ||
- | // | ||
void adc_init(adc_reference reference, adc_prescale prescale) | void adc_init(adc_reference reference, adc_prescale prescale) | ||
{ | { | ||
Line 38: | Line 40: | ||
} | } | ||
- | // | ||
// ADC määratud kanali väärtuse muundamine | // ADC määratud kanali väärtuse muundamine | ||
- | // | ||
unsigned short adc_get_value(unsigned char channel) | unsigned short adc_get_value(unsigned char channel) | ||
{ | { | ||
Line 53: | Line 53: | ||
{ | { | ||
asm volatile (" | asm volatile (" | ||
- | } | + | } |
// Tulemuse tagastamine | // Tulemuse tagastamine | ||
Line 62: | Line 62: | ||
Näiteprogrammis kasutatakse äsja selgitatud analoog-digitaalmuunduri ja 7-segmendilise LED numberindikaatori teeki. Analoog-digitaalmuunduri väärtus korrutatakse kümnega ja jagatakse 2048-ga, et saada väärtus vahemikus 0 kuni 9. Väärtus 10 ei saa tekkida, sest C-keeles arvutatakse jagatises täisosa väärtus, mitte ümardatud tulemus. Täpsema mõõtetulemuse saamiseks kasutatakse muunduri tulemuse keskmistamise funktsiooni. Tulemusena näitab töötav programm vastavalt potentsiomeetri asendile indikaatoril numbreid 0 kuni 9. | Näiteprogrammis kasutatakse äsja selgitatud analoog-digitaalmuunduri ja 7-segmendilise LED numberindikaatori teeki. Analoog-digitaalmuunduri väärtus korrutatakse kümnega ja jagatakse 2048-ga, et saada väärtus vahemikus 0 kuni 9. Väärtus 10 ei saa tekkida, sest C-keeles arvutatakse jagatises täisosa väärtus, mitte ümardatud tulemus. Täpsema mõõtetulemuse saamiseks kasutatakse muunduri tulemuse keskmistamise funktsiooni. Tulemusena näitab töötav programm vastavalt potentsiomeetri asendile indikaatoril numbreid 0 kuni 9. | ||
- | Tähele tuleks panna seda, kuhu konkreetsel riistvaral potentsiomeetri analoogsisend on ühendatud. Näiteks on Kodulabor II Anduriplaadil | + | Tähele tuleks panna seda, kuhu konkreetsel riistvaral potentsiomeetri analoogsisend on ühendatud. Näiteks on Kodulabor II Andurimoodulil |
<code c> | <code c> | ||
- | // | + | // Kodulabori potentsiomeetri |
- | // Kodulabori | + | // 7-segmendilisel numberindikaatoril kuvatakse potentsiomeetri |
- | // näidisprogramm. | + | |
- | // kuvatakse potentsiomeetri | + | |
- | // | + | |
#include < | #include < | ||
#include < | #include < | ||
Line 79: | Line 76: | ||
#define ADC_CHANNEL 15 | #define ADC_CHANNEL 15 | ||
- | // | ||
// Põhiprogramm | // Põhiprogramm | ||
- | // | ||
int main(void) | int main(void) | ||
{ | { | ||
int value; | int value; | ||
- | // 7-segmendilise | + | // 7-segmendilise |
segment_display_init(); | segment_display_init(); | ||
// 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) |
{ | { | ||
// Kanali 4-kordselt ümardatud väärtuse lugemine | // Kanali 4-kordselt ümardatud väärtuse lugemine | ||
Line 99: | Line 94: | ||
// Näidu sajandike näitamine | // Näidu sajandike näitamine | ||
- | segment_display_write(value * 10 / 2048); | + | // Kodulabor |
- | // | + | |
// | // | ||
+ | // Kodulabor III | ||
+ | segment_display_write(value * 10 / 2048); | ||
} | } | ||
} | } | ||
</ | </ |