This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:examples:sensor:potentiometer [2015/02/25 15:22] – raivo.sell | et:examples:sensor:potentiometer [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Potentsiomeeter ====== | ||
| + | //Vajalikud teadmised: | ||
| + | [HW] [[et: | ||
| + | [ELC] [[et: | ||
| + | [AVR] [[et: | ||
| + | [LIB] [[et: | ||
| + | |||
| + | ===== Teooria ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | 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, | ||
| + | |||
| + | ===== Praktika ===== | ||
| + | [{{ : | ||
| + | Kodulabori moodulil asub pööratav 10 kΩ potentsiomeeter. Potentsiomeeter on ühendatud maa ja mikrokontrolleri toite potentsiaalide vahele ning liugur ühendub mikrokontrolleri analoog-digitaalmuunduriga (inglise keeles //analog digital converter//, | ||
| + | |||
| + | * void adc_init(reference, | ||
| + | * unsigned short adc_get_value(channel) | ||
| + | * unsigned short adc_get_average_value(channel, | ||
| + | |||
| + | |||
| + | Funktsioon // | ||
| + | |||
| + | Järgnevad teegifunktsioonide näited on toodud ATmega2561 ADC muunduri kohta. | ||
| + | |||
| + | <code c> | ||
| + | // ADC käivitamine | ||
| + | void adc_init(adc_reference reference, adc_prescale prescale) | ||
| + | { | ||
| + | // ADC töötamise lubamine, sagedusjaguri valimine | ||
| + | ADCSRA = bit_mask(ADEN) | (prescale & 0x07); | ||
| + | |||
| + | // Võrdluspinge valimine | ||
| + | ADMUX = (reference & 0x03) << REFS0; | ||
| + | } | ||
| + | |||
| + | // ADC määratud kanali väärtuse muundamine | ||
| + | unsigned short adc_get_value(unsigned char channel) | ||
| + | { | ||
| + | // Kanali määramine | ||
| + | ADMUX = (ADMUX & 0xF0) | (channel & 0x0F); | ||
| + | |||
| + | // Muundamise alustamine | ||
| + | bit_set(ADCSRA, | ||
| + | |||
| + | // Muundamise lõpu ootamine | ||
| + | while (bit_is_set(ADCSRA, | ||
| + | { | ||
| + | asm volatile (" | ||
| + | } | ||
| + | |||
| + | // Tulemuse tagastamine | ||
| + | return ADCW; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 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 Andurimoodulil see ühendatud analoogkanalisse 3, aga Kodulabor III Kasutajaliidese moodulil analoogkanalisse 15. | ||
| + | |||
| + | <code c> | ||
| + | // Kodulabori potentsiomeetri näidisprogramm | ||
| + | // 7-segmendilisel numberindikaatoril kuvatakse potentsiomeetri asend | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Robootika Kodulabor II | ||
| + | //#define ADC_CHANNEL 3 | ||
| + | |||
| + | // Robootika Kodulabor III | ||
| + | #define ADC_CHANNEL 15 | ||
| + | |||
| + | // Põhiprogramm | ||
| + | int main(void) | ||
| + | { | ||
| + | int value; | ||
| + | |||
| + | // 7-segmendilise numberindikaatori seadistamine | ||
| + | segment_display_init(); | ||
| + | |||
| + | // ADC muunduri seadistamine | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | |||
| + | // Lõputu tsükkel | ||
| + | while (1) | ||
| + | { | ||
| + | // Kanali 4-kordselt ümardatud väärtuse lugemine | ||
| + | value = adc_get_average_value(ADC_CHANNEL, | ||
| + | |||
| + | // Näidu sajandike näitamine | ||
| + | // Kodulabor II | ||
| + | // | ||
| + | // Kodulabor III | ||
| + | segment_display_write(value * 10 / 2048); | ||
| + | } | ||
| + | } | ||
| + | </ | ||