ADC sampling rate doesn't tally with sampling rate calculated from plot

Yup, read that document a while ago, thanks! Decimation should work great on the power component under steady-state conditions, whereas voltage and current vary too much for decimation to work its magic. I will re-attempt to do decimation on the power components (real and apparent) at some point and compare the results to the straight averaging I am doing right now.

In theory, I should be able to get 16 bit precision since I am getting more than 4096 samples/s. In practice, I may settle for averaging six 15-bit results since the 328Ps sampling rate @ 16MHz is now about 5540 samples/s with a 64 pre-scaler and 4432 samples/s with the standard 128 pre-scaler. The latter is preferable since running the ADC at 250kHz will not produce 10bit results per Atmel. Getting to about 5500 samples per second is possible, however, just use a 20MHz resonator and the 128 pre-scaler for a 158kHz ADC clock.

There is no change in terms of the samples/s when I switch from a ADC clock divisor below 64, i.e. the main CPU takes longer to do it's business than the ADC at that point. Since the program math is unlikely to be optimized further, 5500 samples/second (for each of the two channels, i.e. 11k samples/s total) is the current sampling limit - which is still plenty fast to characterize a 60Hz Voltage curve or the current (though some SMPS produce funky current draws as what I suspect is shown above).

With some additional work, I got mysticalzeros second program to work on my Arduino. At one point, the ISR was executing about 30,000 times a second, which is great if the data can be used that quickly, not so useful if it cannot. Because the program I am using needs to do some calculations on the data between each analog read, I discovered that using an ISR had practical limitations for my application. For the time being, I have moved the ADC commands from inside the ISR into the core of the program, with a while loop wait as insurance to hold off on reading ADC results until the ADC sends the all-clear after each conversion.

That said, I found that the use of UART transmissions as each second elapses had some impact on the number of samples my loop could capture. For example, removing the Serial.print commands for current voltage, amps, power (apparent and real) increased the sample rate by 20. Nothing huge, but it pointed to these print commands having an impact, so I may revisit doing all the heavy lifting inside the ISR to get closer to the actual sampling rate that the ADC can produce. I have also considered changing the UART transmission rate between my Arduinos to be higher than 115200 but then I cannot monitor it easily.

Thanks again for the note and a special thanks to mysticalzero for posting his code. I used parts of the first and the second example to put together my main loop, which works great.