A/D převodník - osmibitové rozlišení

Zápisník experimentátora

Hierarchy: A/D prevodník

A/D převodník v Arduino Uno má rozlišení 10 bitů. Pokud nepotřebujeme takové velké rozlišení, můžeme použít i rozlišení 8 bitů. Získáme tak převod analogové hodnoty na digitální hodnotu, která má přesně 8 bitů. Dosáhneme to tak, že si upravíme zarovnání bitů ve výsledném 16 bitovém registru. Používání 8 bitového A / D převodu má výhodu v tom, že nemusíme dodržovat doporučenou frekvenci převodu 50 kHz - 200 kHz a můžeme používat i vyšší frekvence.

ADLAR

Nastavení bitu ADLAR upravuje způsob zarovnání výsledků.

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

Příklad

Příklad je skoro stejný jako předchozí příklady (A/D převodník bez blokování). Liší se pouze v nastavení bitu ADMUX.ADLAR, které upravuje zarovnání výsledku. Při tomto nastavení stačí přečíst obsah registru ADCH, abychom získali výsledný 8 bitový výsledek.

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 se nachází na serveru GitHub.


03.11.2018


Menu