в прерывании АЦП:
1. Выборка отсчетов на частоте 2 или 2,4 кГц
2. Фильтр удаления постоянной составляющей (для приличного дифференциального АЦП не понадобится, но ATmega8 не тот случай)
3. Отсчеты возводятся в квадрат и помещаются в хитрый буфер, длиной = период обновления показаний + время необходимое на вычисления
в фоновом процессе (main):
1. Фиксируется положение головы буфера и начиная с нее извлекаются отсчеты за период обновления показаний (именно поэтому буфер хитрый, он работает не совсем как обычный кольцевой буфер).
2. Каждый отсчет умножается на оконную функцию и добавляется к сумме. Это уменьшает болтанку показаний в зависимости от того, на какую часть периода ходного сигнала в этот раз попала выборка. Лучший результат дает синусоидальная оконная функция.
3. Из суммы извлекается целочисленный корень и результат масштабируется.
пока идут эти вычисления в буфер продолжают поступать новые отсчеты.
ATmega168 обсчитывала три таких канала.
С экспоненциальными функциями вычисления действующего значения экспериментировал. Не тратится оперативная память на буфер, но получается большая загрузка вычислениями (я даже придумал новый для себя способ организации многозадачности в результате), показания или сильно гуляют или долго устанавливаются. В общем, для измерения тока или напряжения в сети смысла нет.