A/D prevodník - osembitové rozlíšenie

Zápisník experimentátora

Hierarchy: A/D prevodník

A/D prevodník v Arduino Uno má rozlíšenie 10 bitov. Ak nepotrebujeme také veľké rozlíšenie, môžeme použiť aj rozlíšenie 8 bitov. Získame tak prevod analógovej hodnoty na digitálnu hodnotu, ktorá má presne 8 bitov. Dosiahneme to tak, že si upravíme zarovnanie bitov vo výslednom 16 bitovom registri. Používanie 8 bitového A/D prevodu má výhodu v tom, že nemusíme dodržiavať doporučenú frekvenciu prevodu 50 kHz - 200 kHz a môžeme používať aj vyššie frekvencie.

ADLAR

Nastavenie bitu ADLAR upravuje spôsob zarovnania výsledkov.

ADLAR=0

bit 15 14 13 12 11 10 9 8
ADCH - - - - - - ADC9 ADC8
ADCL ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0
bit 7 6 5 4 3 2 1 0

ADLAR=1

bit 15 14 13 12 11 10 9 8
ADCH ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2
ADCL ADC1 ADC0 - - - - - -
bit 7 6 5 4 3 2 1 0

Príklad

Príklad je skoro rovnaký ako predchádzajúce príklady (A/D prevodník bez blokovania). Líši sa len v nastavení bitu ADMUX.ADLAR, ktoré upravuje zarovnanie výsledku. Pri tomto nastavení stačí prečítať obsah registra ADCH, aby sme získali výsledný 8 bitový výsledok.

const byte adcPin = A0; // = 14 (pins_arduino.h)

bool adc_conversion_working = false;

void setup() {
  Serial.begin(115200);
  Serial.println("ADC without blocking 8bit");

  ADCSRA = bit(ADEN) // Turn ADC on
           | bit(ADPS0) | bit(ADPS1) | bit(ADPS2); // Prescaler of 128
  ADMUX  = bit(REFS0) // AVCC
           | bit(ADLAR) // ADC Left Adjust Result
           | ((adcPin - 14) & 0x07); // Arduino Uno to ADC pin
}

void loop() {
  if (!adc_conversion_working) {
    bitSet(ADCSRA, ADSC);  // Start a conversion
    adc_conversion_working = true;
  }

  // The ADC clears the bit when done
  if (bit_is_clear(ADCSRA, ADSC)) {
    int value = ADCH;  // Read result
    adc_conversion_working = false;
    Serial.println(value);
    delay(500);
  }
}

Zdrojový kód

Zdrojový kód sa nachádza na serveri GitHub.


03.11.2018


Menu