#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#define NUM_CHANNELS 4
#define SAMPLE_INTERVAL 1000 // Sample interval in milliseconds
volatile uint16_t adcValues[NUM_CHANNELS];
volatile uint32_t adcSum[NUM_CHANNELS];
volatile uint16_t sampleCount = 0;
volatile uint8_t currentChannel = 0;
void setup() {
Serial.begin(9600);
ADMUX = (1 << REFS0); // AVcc with external capacitor at AREF pin
ADCSRA = (1 << ADEN) | (1 << ADIE) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Enable ADC, ADC interrupt, prescaler 128
TCCR1A = 0;
TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10); // CTC mode, prescaler 64
OCR1A = 249; // 1 ms interval (16MHz / 64 / 1000 - 1)
TIMSK1 = (1 << OCIE1A); // Enable Timer1 compare interrupt
sei();
startADC(); // Start first ADC conversion
}
void loop() {
}
ISR(TIMER1_COMPA_vect) {
static uint16_t intervalCount = 0;
intervalCount++;
if (intervalCount >= SAMPLE_INTERVAL) {
intervalCount = 0;
for (uint8_t i = 0; i < NUM_CHANNELS; i++) {
if (sampleCount > 0) {
uint16_t avgValue = adcSum[i] / sampleCount;
float voltage = avgValue * (5.0 / 1024.0);
Serial.print("Channel ");
Serial.print(i);
Serial.print(": Average Voltage = ");
Serial.print(voltage);
Serial.println(" V");
}
adcSum[i] = 0; // Reset sum for next interval
}
sampleCount = 0; // Reset sample count for next interval
}
}
ISR(ADC_vect) {
uint16_t adcValue = ADC;
adcValues[currentChannel] = adcValue;
adcSum[currentChannel] += adcValue;
currentChannel++;
if (currentChannel >= NUM_CHANNELS) {
currentChannel = 0;
sampleCount++;
}
startADC(); // Start next ADC conversion
}
void startADC() {
ADMUX = (ADMUX & 0xF0) | (currentChannel & 0x0F); // Select ADC channel
ADCSRA |= (1 << ADSC); // Start ADC conversion
}