Входные каскады - схема. БП на LM7805, МК (ATMega16, 8 MHz), LCD типа HD4478, кнопки, светодиодики не рисовал, там всё стандартно.
ОУ DA2.1 - средняя точка 2.5в, регулируется R3.
Входы ADC1, 2 АЦП опрашиваются 20 раз за период 50 Гц (в обработчике таймера, 1 мс):
// Замер напряжения - ADC1
adc = read_adc(ADC_U);
// убираем смещение
adcU=adc-adcUsm;
// Квадрат
adcSqr=adcU;
adcSqr*=adcU;
// Сумма квадратов напряжения
summUsqr+=adcSqr;
....................................
Для тока (ADC2) абсолютно также, переменные другие. Все расчёты здесь - 100% целочисленные, никакой плавающей точки.
АЦП работает без прерываний, по опросам:
// ADC initialization
// ADC Clock frequency: 1000,000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: None
ADMUX=0x00;
ADCSRA=0x83; // 0x10000011 - Enable, CLK/8=1MHz
.......................
// Read the AD conversion result
word read_adc(byte adc_input)
{
ADMUX=adc_input;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion (ADSC)
ADCSRA|=0x40;
// Wait for the AD conversion to complete (ADIF)
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
// Обнуляем мл. бит
return ADCW&0xFFFE;
} // read_adc
Функция read_adc сгенерирована генератором кода CvAVR. Я её не менял.
Напряжение средней точки (ADC0) - adcUsm - замеряется в начале каждого цикла замеров. Каждый цикл - 0.5 сек - 10 периодов 50 Гц.
ADC2 - канал измерения большого тока (>4A) контроллером пока не обрабатывается.
Далее идут пересчёты в напряжение сети и ток.
Начал отлаживать. Канал напряжения (ADC1) откалибровал, работает. Показывает почти также, как и мультиметры. Для нашего брата сойдёт

Приступил к току (ADC2). Вот тут начались странности.
Когда напряжение подано, а нагрузки нет, тока нагрузки нет, на выходе ТТ - чистый 0, а прибор показывает на входе АЦП - 0.01-0.02в (округлённо - %.2f). Вопроса пересчёта напряжения на АЦП в амперы я здесь не касаюсь.
Облазил весь код - ничего, всё нормально.
Потом случайно отключил обмотку измерения напряжения T3 (подключена через разъёмчик), остался только R2, запаянный в плату. И, о, чудо - увидел 0в на обоих входах АЦП

После целенаправленных разборок в этом направлении увидел, что напряжение на ADC1 как-то влияет на ADC2.
Вопрос - можно ли как-то избавиться от этого влияния и как? Может я чего не учёл? Или взять модификацию ATMega16A? Слышал, что у них аналоговая часть сделана более грамотно.
Ставить внешний АЦП? У меня есть микрочиповский MCP3202. Где гарантия, что и у него нету подобных эффектов?
PS. Пошарив по интернету, нашёл ещё пару жалоб на такой же эффект в ATMega8, но решений так и нету. Где-то предлагали реже опрашивать АЦП, но мне это не выход, т.к. идеально вообще - ток и напряжение замерять строго одновременно.
Спасибо.