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
.
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 sa nachádza na serveri GitHub.
11.10.2018