This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:avr:adc [2010/02/01 13:03] – toimetaja | et:avr:adc [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Analoog-digitaalmuundur ====== | ====== Analoog-digitaalmuundur ====== | ||
| - | Analoog-digitaalmuundur (inglise keeles //analog to digital converter//, | + | Analoog-digitaalmuundur (inglise keeles //analog to digital converter//, |
| - | AVR ADC töötab võrdlusmeetodil (inglise keeles // | + | AVR ADC töötab võrdlusmeetodil (inglise keeles // |
| - | Mõõtetulemust saab kasutaja lugeda 8- ja 10-bitisena. Kuna AVR on 8-bitine, siis ADC mõõteväärtuste jaoks on sel kaks 8-bitist registrit. Seadistustes saab määrata, kas 10-bitisest väärtusest 2 esimest või 2 viimast bitti lähevad eraldi registrisse. Kui eraldatakse 2 noorimat ehk tulemust vähem iseloomustavat bitti, saab mõõtetulemuse 8-bitisena lugeda - sellist kombinatsiooni nimetatakse vasak-asetusega mõõtetulemuseks (//left align//). Teistpidist kombinatsiooni, | + | Mõõtetulemust saab kasutaja lugeda 8- ja 10(12)-bitisena. Kuna AVR on 8-bitine, siis ADC mõõteväärtuste jaoks on sel kaks 8-bitist registrit. Seadistustes saab määrata, kas 10-bitisest väärtusest 2 esimest või 2 viimast bitti lähevad eraldi registrisse. Kui eraldatakse 2 noorimat ehk tulemust vähem iseloomustavat bitti, saab mõõtetulemuse 8-bitisena lugeda - sellist kombinatsiooni nimetatakse vasak-asetusega mõõtetulemuseks (inglise keeles |
| - | Mõõdetavaid analoogpinge sisendkanaleid on AVR-idel tavaliselt 8, ATtiny seerial üksikud, mõnel ATmega seeria kiibil 16, kuid muundureid on siiski | + | Mõõdetavaid analoogpinge sisendkanaleid on AVR-idel tavaliselt 8, ATtiny seerial üksikud, mõnel ATmega seeria kiibil 16, kuid muundureid on tavaliselt |
| - | ==== Näide | + | |
| + | <box 100% round #EEEEEE|Näide> | ||
| Vaja on mõõta ATmega128 ADC kanali 3 pinget vahemikus 0-5 V 8-bitise täpsusega. | Vaja on mõõta ATmega128 ADC kanali 3 pinget vahemikus 0-5 V 8-bitise täpsusega. | ||
| Line 16: | Line 17: | ||
| #include < | #include < | ||
| - | int main() | + | int main(void) |
| { | { | ||
| unsigned char result; | unsigned char result; | ||
| - | // Võrdluspingeks AREF viigu valimine | + | // Võrdluspingeks AREF viigu valimine (eeldatavasti on see ühendatud |
| - | // (eeldatavasti on see ühendatud | + | |
| // Multiplekseriga kanali 3 valimine | // Multiplekseriga kanali 3 valimine | ||
| // Tulemus on vasak-asetusega | // Tulemus on vasak-asetusega | ||
| ADMUX = (1 << REFS0) | (1 << ADLAR) | (3); | ADMUX = (1 << REFS0) | (1 << ADLAR) | (3); | ||
| - | // ADC üksuse käivitamine, | + | // ADC üksuse käivitamine, |
| + | // teisendustakti seadmine | ||
| ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADSC); | ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADSC); | ||
| Line 36: | Line 37: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | Vaja on mõõta ATxmega128A1U ADC viigu 3 pinget kasutades ADCA muunduri kanalit CH0 vahemikus 0-2 V (Vcc/1.6) 8-bitise täpsusega. Märgiga lugemist kasutatakse selleks, et sisendpinge 0 V läheduses tagastaks ka 0 V ADC mõõtetulemusena. | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | int main(void) | ||
| + | { | ||
| + | unsigned char result; | ||
| + | // Seadista ADCA lugema märgiga tulemit 8-bitise resolutsiooniga | ||
| + | ADCA.CTRLB = (ADC_CONMODE_bm|ADC_RESOLUTION_8BIT_gc); | ||
| + | // Seadista ADCA pingevõrdluseks VCC/1.6 pinge | ||
| + | ADCA.REFCTRL = (ADC_REFSEL_VCC_gc); | ||
| + | // Seadista ADCA taktsagedusega F_CPU/32 | ||
| + | ADCA.PRESCALER = (ADC_PRESCALER_DIV32_gc); | ||
| + | // Seadista ADCA kanal 0 lugema vaid üht sisendit | ||
| + | ADCA.CH0.CTRL = (ADC_CH_INPUTMODE_SINGLEENDED_gc); | ||
| + | // Seadista ADCA kanal 0 lugema viiku ADC3 | ||
| + | ADCA.CH0.MUXCTRL = (ADC_CH_MUXPOS_PIN3_gc); | ||
| + | |||
| + | // Käivita ADCA | ||
| + | ADCA.CTRLB |= (ADC_ENABLE_bm); | ||
| + | // Alusta lugemit kanalis CH0 | ||
| + | ADCA.CH0.CTRL |= (ADC_CH_START_bm); | ||
| + | // Oota, kuni CH0 on lõpetanud lugemise | ||
| + | while((ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) != 0x01); | ||
| + | |||
| + | // Loe tulemus | ||
| + | result = ADCA.CH0RES; | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | </ | ||