This is an old revision of the document!
Vajalikud teadmised: [HW] Kasutajaliidese moodul, [HW] Andurite moodul, [ELC] Pingejagur, [AVR] Analoog-digitaalmuundur, [LIB] Analoog-digitaalmuundur, [LIB] 7-segmendiline LED indikaator
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.
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:
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.
// // 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 Anduriplaadil see ühendatud analoogkanalisse 3, aga Kodulabor III Kasutajaliidese plaadil analoogkanalisse 15.
// // Kodulabori Andurite mooduli potentsiomeetri // näidisprogramm. 7-segmendilisel numberindikaatoril // kuvatakse potentsiomeetri asendit. // #include <homelab/adc.h> #include <homelab/module/segment_display.h> // Robootika Kodulabor II //#define ADC_CHANNEL 3 // Robootika Kodulabor III #define ADC_CHANNEL 15 // // Põhiprogramm // int main(void) { int value; // 7-segmendilise indikaatori seadistamine segment_display_init(); // ADC muunduri seadistamine adc_init(ADC_REF_AVCC, ADC_PRESCALE_8); // Lõputu tsükkel while (true) { // Kanali 4-kordselt ümardatud väärtuse lugemine value = adc_get_average_value(ADC_CHANNEL, 4); // Näidu sajandike näitamine segment_display_write(value * 10 / 2048); //Kodulabor 2 puhul //segment_display_write(value * 10 / 1024); } }