A/D prevodník - Meranie pomocou prerušenia

Zápisník experimentátora

Hierarchy: A/D prevodník

V predchádzajúcom článku sme si naprogramovali analógové meranie, ktoré neblokovalo Arduino počas merania. Koniec merania sme kontrolovali pomocou bitu ADSC. Koniec analógového merania môžeme kontrolovať aj pohodlnejšie pomocou prerušenia, ktoré nám Arduino na konci merania zavolá. V tomto článku si ukážeme, ako sa to dá naprogramovať.

Príklad

Ak používame premenné v normálnom kóde aj v prerušení, musíme ich označiť ako volatile, aby kompilátor vedel, že ich má pri každom použití aktualizovať a má ich zapisovať do RAM. Nastavenie registrov je podobné ako v predchádzajúcom príklade, iba pribudlo nastavenie bitu ADIE, ktoré zapína použitie prerušenia na konci A/D konverzie.

Zvyšok programu tvoria dve podmienky, ktoré obsluhujú koniec A/D konverzie, vypisujú výsledok na sériový port a zapínajú ďalšie analógové meranie.

const byte adc_pin = A0; // = 14 (pins_arduino.h)
volatile int adc_value;
volatile bool adc_done;
volatile bool adc_busy;
unsigned int something_different = 0;

void setup() {
  Serial.begin (115200);
  Serial.println("ADC with interrupt");

  ADCSRA = bit(ADEN) // Turn ADC on
           | bit(ADIE) // Enable interrupt
           | bit(ADPS0) | bit(ADPS1) | bit(ADPS2); // Prescaler of 128
  ADMUX  = bit(REFS0) // AVCC
           | ((adc_pin - 14) & 0x07); // Arduino Uno to ADC pin
}

// ADC complete ISR
ISR(ADC_vect) {
  adc_value = ADC;
  adc_done = true;
  adc_busy = false;
}

void loop() {
  // Last reading
  if (adc_done) {
    Serial.print("adc_value=");
    Serial.print(adc_value);
    Serial.print(", something_different=");
    Serial.println(something_different);
    delay(500);
    adc_done = false;
  }

  // Start new conversion
  if (!adc_busy) {
    adc_busy = true;
    // start the conversion
    bitSet(ADCSRA, ADSC);
  }

  // Do something
  something_different++;
}

Zdrojový kód

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


24.09.2018


Menu