#define TCNT2_US_PERIOD 125
#define TCNT2_PRESCALER 8
void initADC()
{
ADCSRA = 0;
// Setting the ADC
// Set ADC prescaler to 128 - 125KHz sample rate @ 16MHz
ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
ADMUX = 0;
// Set voltage reference
// REFS1 REFS0 Voltage Reference Selection
// 0 0 AREF, Internal Vref turned off
// 0 1 AVCC with external capacitor at AREF pin
// 1 0 Reserved
// 1 1 Internal 1.1V Voltage Reference with external capacitor at AREF pin
ADMUX |= (1 << REFS0);
// Enable ADC and ADC interrupt
ADCSRA |= (1 << ADEN) | (1 << ADIE);
// Start first conversion which takes 25 cycles
ADCSRA |= (1 << ADSC); // Start conversion
// Wait for the first conversion to complete
while(!(ADCSRA & ADIF));
}
uint16_t adc_value[6] = {0};
ISR(ADC_vect)
{
static uint8_t adc_sample_table[] = {0, 1, 2, 3, 0, 1, 4, 5};
static uint8_t adc_index = 0;
adc_value[adc_sample_table[adc_index++]] = ADC;
if(adc_index == 8) adc_index = 0;
ADMUX = (ADMUX & 0xF0) | adc_sample_table[adc_index];
}
void initUltimateTimer()
{
noInterrupts();
TCCR2A = (1 << WGM21);
TCCR2B = (1 << CS21);
OCR2A = TCNT2_US_PERIOD * F_CPU / 1e6 / TCNT2_PRESCALER;
TIMSK2 = (1 << OCIE2A);
interrupts();
}
ISR(TIMER2_COMPA_vect)
{
ADCSRA |= (1 << ADSC); // Start conversion
}
void setup()
{
// put your setup code here, to run once:
Serial.begin(115200);
//AVCC with external capacitor at AREF pin
initADC();
initUltimateTimer();
}
void loop()
{
delay(100);
Serial.print("A0: "); Serial.print(adc_value[0]); Serial.print(", ");
Serial.print("A1: "); Serial.print(adc_value[1]); Serial.print(", ");
Serial.print("A2: "); Serial.print(adc_value[2]); Serial.print(", ");
Serial.print("A3: "); Serial.print(adc_value[3]); Serial.print(", ");
Serial.print("A4: "); Serial.print(adc_value[4]); Serial.print(", ");
Serial.print("A5: "); Serial.print(adc_value[5]); Serial.println(". ");
}