This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:avr:adc [2010/02/09 18:20] – raivo.sell | 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 16 korda aeglasemaks töötaktist | ||
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; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ |