This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:examples:sensor:photoresistor [2015/03/02 13:37] – raivo.sell | et:examples:sensor:photoresistor [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Fototakisti ====== | ||
| + | //Vajalikud teadmised: | ||
| + | [HW] [[et: | ||
| + | [ELC] [[et: | ||
| + | [AVR] [[et: | ||
| + | [LIB] [[et: | ||
| + | [LIB] [[et: | ||
| + | |||
| + | ===== Teooria ===== | ||
| + | |||
| + | [{{ : | ||
| + | [{{ : | ||
| + | |||
| + | Fototakisti on andur, mille elektriline takistus muutub sõltuvalt temale pealelangeva valguse intensiivsusest. Mida intensiivsem on valgus, seda rohkem tekib vabu laengukandjaid ning seda väiksemaks jääb elemendi takistus. Fototakisti kaks välist metallkontakti ulatuvad läbi keraamilise alusmaterjali valgustundliku kileni, mis oma geomeetria ja materjali omaduse poolest määravad elektrilised takistuslikud omadused. Kuna fototundlik materjal on iseloomult suure takistusega, | ||
| + | |||
| + | ^ Värv ^ Lainepikkuse vahemik (nm) ^ | ||
| + | | Lilla | 400 – 450 | | ||
| + | | Sinine | ||
| + | | Roheline | ||
| + | | Kollane | ||
| + | | Oranž | ||
| + | | Punane | ||
| + | |||
| + | Fototakistil on kindlasti määratud ka töötemperatuuri vahemik. Kui tahta lasta anduril töötada erinevatel temperatuuridel, | ||
| + | |||
| + | Valguse intensiivsuse iseloomustamiseks kasutatakse füüsikalist suurust valgustustihedus (tähis E), mis näitab mingile pinnale jõudva valgusvoo hulka. Mõõdetavaks ühikuks on luks (lx), kus 1 luks tähendab, et 1 m< | ||
| + | |||
| + | ^ Keskkond | ||
| + | | Täiskuu | ||
| + | | Hämarus | ||
| + | | Auditoorium | ||
| + | | Päikesetõus või -loojang | ||
| + | | Otsene päikesevalgus | ||
| + | |||
| + | ===== Praktika ===== | ||
| + | |||
| + | Kodulabori moodul on varustatud VT935G fototakistiga. Selle üks viik on ühendatud toitega ja teine mikrokontrolleri analoog-digitaalmuunduri analoog kanaliga (Kodulabor II puhul kanal 1, Kodulabor III puhul kanal 13). Sama mikrokontrolleri viigu ja maaga on ühendatud ka takisti, mis koos fototakistiga moodustab pingejaguri. Kuna fototakisti elektriline takistus väheneb temale langeva valguse intensiivsuse kasvades, siis mõõdetav pinge mikrokontrolleri viigu peal kasvab valguse intensiivsuse kasvades. Tasuks arvestada, et Kodulaboris kasutatav fototakisti reageerib kõige intensiivsemalt kollasele ja oranžile valgusele. | ||
| + | |||
| + | VT935G andur ei olegi tegelikult mõeldud konkreetseks mõõteseadmeks, | ||
| + | |||
| + | Käesolev harjutus on aga natukese keerulisem, kuna leitakse andurile langeva valguse valgustustihedust luksides. Selle tegemiseks on kasutusel ligikaudne arvutusvalem ja ujukoma arvud. Ujukoma arvud on C-keeles //float// ja //double// tüüpi, millega saab esitada murdarve. Nende puuduseks on suhteliselt suur ressursinõudlikkus. Arvutites on nende arvutamiseks spetsiaalne riistvara, 8-bitisel AVR mikrokontrolleril tehakse arvutused tarkvaras, mis võtab suhteliselt palju programmimälu ja aega. Kui puudused pole olulised, on ujukoma arvud väärt kasutamist. | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Fototakisti valgustustiheduse ja elektritakistuse vahelise seose kohta annab anduri andmeleht ligikaudse valemi. Nagu kõrvalolevalt graafikult näha, on logaritmskaalas valgustustihedus ja takistus ligikaudu lineaarses seoses ning moodustavad sirge võrrandi, sest kehtib teisendus: | ||
| + | |||
| + | log(a/b) = log(a) - log(b) | ||
| + | |||
| + | Seost iseloomustab γ faktor (sirge tõus), mis VT935G anduril on 0,9. Teada on ka joone ühe punkti andmed: 18,5 kΩ takistus (R< | ||
| + | |||
| + | log(E< | ||
| + | E< | ||
| + | |||
| + | Sellega on takistusest valgustustiheduse arvutamise valem olemas. Takistust otse aga mikrokontrolleriga mõõta ei saa - selleks on fototakisti pingejaguris, | ||
| + | |||
| + | U< | ||
| + | |||
| + | Pingejaguri valemist (vaata pingejaguri peatükki) saab leida skeemis ülemise fototakisti takistuse (R< | ||
| + | |||
| + | R< | ||
| + | |||
| + | Järgnevalt on pinge ja takistuse arvutamisel teadaolevad tegurid asendatud väärtustega ja alaindeksid ära jäetud: | ||
| + | |||
| + | U = 5 ⋅ (ADC / 1024) \\ \\ | ||
| + | R = (10 ⋅ 5) / U - 10 \\ \\ | ||
| + | |||
| + | Valgustustiheduse leidmisel saab teha lihtsustavaid teisendusi: | ||
| + | |||
| + | E = 10< | ||
| + | = 10< | ||
| + | = (18, | ||
| + | |||
| + | Arvutades välja muutuja R ees oleva konstandi, jääb avaldis kujule: | ||
| + | |||
| + | E = 255,84 ⋅ R< | ||
| + | |||
| + | Nende valemite abil saab kasutada vaid Kodulabori moodulil olevat fototakistit. Teiste komponentidega skeemi kasutades tuleks valemites muuta vastavaid arvväärtusi. Järgnevalt on toodud näidisprogrammi lähtekood, mis teostab ADC-ga mõõtmist, arvutamist ja valgustustiheduse kuvamist LCD ekraanile. | ||
| + | |||
| + | Näidisprogrammis defineeritakse pinge, takistuse ja valgustustiheduse muutujad ujukoma tüüpi arvuna //double//. Arvud, mida soovitakse kindlasti ujukoma tehetes kasutada, peavad alati sisaldama komakohta (C-keeles punkti), olgu kas või nulli, sest siis ei tõlgenda kompilaator neid valesti. | ||
| + | |||
| + | <code c> | ||
| + | // Kodulabori fototakisti näidisprogramm | ||
| + | // LCD ekraanil kuvatakse ligikaudne valgustustihedus luksides | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Põhiprogramm | ||
| + | int main(void) | ||
| + | { | ||
| + | char text[16]; | ||
| + | unsigned short adc_value; | ||
| + | double voltage, resistance, illuminance; | ||
| + | |||
| + | // LCD ekraani seadistamine | ||
| + | lcd_gfx_init(); | ||
| + | |||
| + | // LCD taustavalguse tööle seadmine | ||
| + | lcd_gfx_backlight(true); | ||
| + | | ||
| + | // LCD ekraani puhastamine | ||
| + | lcd_gfx_clear(); | ||
| + | |||
| + | //LCD-l kirjutamise koha valik | ||
| + | lcd_gfx_goto_char_xy(3, | ||
| + | | ||
| + | // Programmi nimi | ||
| + | lcd_gfx_write_string(" | ||
| + | |||
| + | // ADC muunduri seadistamine | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | |||
| + | // Lõputu tsükkel | ||
| + | while (1) | ||
| + | { | ||
| + | // Fototakisti keskmise väärtuse lugemine | ||
| + | adc_value = adc_get_average_value(13, | ||
| + | // Kodulabor II | ||
| + | // | ||
| + | |||
| + | // Pinge arvutamine ADC sisendis | ||
| + | // Kodulabor II | ||
| + | //voltage = 5.0 * ((double)adc_value / 1024.0); | ||
| + | // Kodulabor III | ||
| + | voltage = 2.0625 * ((double)adc_value / 2048.0); | ||
| + | |||
| + | // Fototakisti takistuse arvutamine pingejaguris | ||
| + | // Kodulabor II | ||
| + | // | ||
| + | // Kodulabor III | ||
| + | resistance = (33.0) / voltage - 10.0; | ||
| + | |||
| + | // Valgustustiheduse luksideks arvutamine | ||
| + | illuminance = 255.84 * pow(resistance, | ||
| + | // Muutuja ekraanile kuvamiseks selle kaheks | ||
| + | // eraldi täisarvuliseks muutujaks jagamine | ||
| + | int8_t illu = illuminance; | ||
| + | int16_t illudp = trunc((illuminance - illu) * 1000); | ||
| + | |||
| + | // Valgustustiheduse tekstiks teisendamine | ||
| + | sprintf(text, | ||
| + | |||
| + | // Näidu LCD-l kuvamine | ||
| + | lcd_gfx_goto_char_xy(3, | ||
| + | lcd_gfx_write_string(text); | ||
| + | |||
| + | // Viide 500 ms | ||
| + | sw_delay_ms(500); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | /* | ||
| + | [[et: | ||
| + | */ | ||