A/D prevodník - Free Running mód

Zápisník experimentátora

Hierarchy: A/D prevodník

A/D prevodník obsahuje jednu zaujímavú možnosť, ako merať analógový signál čo najrýchlejšie. Spustenie nového analógového merania môže byť vyvolané ukončením predchádzajúceho merania. Tento mód sa nazýva Free Running.

Príklad

Free Running mód sa nastavuje v registri ADCSRB. Treba nastaviť všetky bity ADTS[0-2] na hodnotu 0. Prvé meranie je potrebné spustiť nastavením bitu ADSC. Je potrebné nastaviť aj bit ADATE, ktorý vyvoláva automatické spúšťanie podľa nastavenej kombinácie bitov ADTS.

Aby nebol príklad úplne nudný, pomocou premennej counter v prerušení počítam, koľko meraní urobilo Arduino za jednu sekundu. Pri takomto nastavení deličky hodinového signálu urobí Arduino približne 9600 meraní za jednu sekundu. Ak potrebujete viac meraní, potom môžete manipulovať bitmi deličky ADPS. Bez vážnejších problémov so zníženou presnosťou merania môžete nastaviť hodnotu deličky na 16, čím získate približne 77000 meraní 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 sa nachádza na serveri GitHub.


11.10.2018


Menu