A/D převodník - Free Running mód

Zápisník experimentátora

Hierarchy: A/D prevodník

A/D převodník obsahuje jednu zajímavou možnost, jak měřit analogový signál co nejrychleji. Spuštění nového analogového měření může být vyvoláno ukončením předchozího měření. Tento mód se nazývá Free Running.

Příklad

Free Running mód se nastavuje v registru ADCSRB. Třeba nastavit všechny bity ADTS[0-2] na hodnotu 0. První měření je třeba spustit nastavením bitu ADSC. Je třeba nastavit i bit ADATE, který vyvolává automatické spouštění podle nastavené kombinace bitů ADTS.

Aby nebyl příklad úplně nudný, pomocí proměnné counter v přerušení počítám, kolik měření udělalo Arduino za jednu sekundu. Při takovémto nastavení děličky hodinového signálu udělá Arduino přibližně 9600 měření za jednu sekundu. Pokud potřebujete více měření, pak můžete manipulovat bity děličky ADPS. Bez vážnějších problémů se sníženou přesností měření lze nastavit hodnotu děličky na 16, čímž získáte přibližně 77000 měření za jednu sekundu.

const byte adc_pin = A0; // = 14 (pins_arduino.h)
volatile unsigned long counter = 0;
unsigned long counter_last = 0;

void setup() {
  Serial.begin (115200);
  Serial.println("ADC Auto Trigger");

  ADCSRB = 0; // ADTS[0-2]=0 - Free Running mode
  ADCSRA = bit(ADEN) // Turn ADC on
           | bit(ADATE) // ADC Auto Trigger Enable
           | 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
  bitSet(ADCSRA, ADSC);
}

void loop() {
  uint8_t SREG_old = SREG;
  noInterrupts();
  unsigned long cnt = counter;
  SREG = SREG_old;
 
  Serial.print("adc_value = ");
  Serial.print(ADC);
  Serial.print(", counter = ");
  Serial.print(cnt);
  Serial.print(" (+");
  Serial.print(cnt - counter_last);
  Serial.println(")");
  counter_last = cnt;
  delay(1000);
}

// ADC complete ISR
ISR(ADC_vect) {
  counter++;
}

Zdrojový kód

Zdrojový kód se nachází na serveru GitHub.


11.10.2018


Menu