====== Potentsiomeeter ====== //Vajalikud teadmised: [HW] [[et:hardware:homelab:digi]], [ELC] [[et:electronics:voltage_divider]], [AVR] [[et:avr:adc]], [LIB] [[et:software:homelab:library:adc]], [LIB] [[et:software:homelab:library:module:segment_display]]// ===== Teooria ===== [{{ :examples:sensor:potentiometer:sensor_potentiometer_designator.png?120|Potentsiomeetri elektriline tähis}}] Potentsiomeeter on kolme kontaktiga muuttakisti, mille kahe äärmise kontakti vahel on fikseeritud takistus ja äärmiste ning keskmise kontakti vahel muutuv takistus. Potentsiomeeter on põhimõtteliselt ka pingejagur, kus takistid moodustuvad äärmiste kontaktide ja keskmise kontakti vahel. Potentsiomeetri (inglise keeles //potentiometer//) sünonüüm on reostaat (inglise keeles //rheostat//). 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, milles takistuse reguleerimine toimub mikroskeemi sees vastavalt juhtsignaalidele. ===== Praktika ===== [{{ :examples:sensor:pote.png?250|Pööratav potentsiomeeter}}] 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//, lühend ADC). 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: * void adc_init(reference, prescale) * unsigned short adc_get_value(channel) * unsigned short adc_get_average_value(channel, num_samples) Funktsioon //adc_init// tuleb välja kutsuda programmi alguses, millega seatakse AVR-i ADC töövalmis. Valida tuleb võrdluspinge kas AREF või AVCC viigult või hoopis sisemine pinge. Lisaks tuleb määrata muunduri töötakt, täpsemalt sagedusjaguri tegur, millega jagatakse läbi mikrokontrolleri töötakt. Kõrgema taktiga käib muundamine kiiremini, kuid võib kannatada mõõtmistäpsus. Mõõtmiseks on //adc_get_value// funktsioon, millega saab valida kanali ja mis tagastab 16-bitise täisarvuna 10-bitise (Kodulabor III puhul 11-bitise) mõõtmistulemuse. Mõõtmisfunktsioon on blokeeruv ehk see jääb ootama muundamise lõppu ja tagastab väärtuse alles siis, kui mõõtmine on tehtud. Järgnevad teegifunktsioonide näited on toodud ATmega2561 ADC muunduri kohta. // 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, ADSC); // Muundamise lõpu ootamine while (bit_is_set(ADCSRA, ADSC)) { asm volatile ("nop"); } // 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. // 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, ADC_PRESCALE_16); // Lõputu tsükkel while (1) { // Kanali 4-kordselt ümardatud väärtuse lugemine value = adc_get_average_value(ADC_CHANNEL, 4); // Näidu sajandike näitamine // Kodulabor II //segment_display_write(value * 10 / 1024); // Kodulabor III segment_display_write(value * 10 / 2048); } }