CODE
void ADC_task()
{
if(!bMeasure)
return;
__disable_interrupt(); - это я добавил только для пробы, влияет ли таймер динамической индикации на работу АЦП...
samples1 = 0;
ADCSRA &= ~(1<<ADSC);
ADMUX = (1<<REFS1) | (1<<REFS0) + 0;
for(U8 i=0;i<5;i++)
{
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADIF));
U8 low = ADCL;
U16 ADCResult = low + (ADCH<<8);
samples1 += (ADCResult*2.56)/1024;
}
samples1 = samples1/5;
fU = samples1*5.7; - компенсация делителя
ADCSRA &= ~(1<<ADSC); - это тоже уже от нечего делать...
ADMUX++; если закомментировать эту строчку, то напряжение fU - в норме,
совпадает с реальным, а если не комм. -
то меньше реального на некоторое значение
samples2 = 0;
for(U8 i=0;i<5;i++)
{
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADIF));
U8 low = ADCL;
U16 ADCResult = low + (ADCH<<8);
samples2 += (ADCResult*2.56)/1024;
}
samples2 = samples2/5;
bMeasure = false;
__enable_interrupt(); - аналогично disble'у...
}
{
if(!bMeasure)
return;
__disable_interrupt(); - это я добавил только для пробы, влияет ли таймер динамической индикации на работу АЦП...
samples1 = 0;
ADCSRA &= ~(1<<ADSC);
ADMUX = (1<<REFS1) | (1<<REFS0) + 0;
for(U8 i=0;i<5;i++)
{
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADIF));
U8 low = ADCL;
U16 ADCResult = low + (ADCH<<8);
samples1 += (ADCResult*2.56)/1024;
}
samples1 = samples1/5;
fU = samples1*5.7; - компенсация делителя
ADCSRA &= ~(1<<ADSC); - это тоже уже от нечего делать...
ADMUX++; если закомментировать эту строчку, то напряжение fU - в норме,
совпадает с реальным, а если не комм. -
то меньше реального на некоторое значение
samples2 = 0;
for(U8 i=0;i<5;i++)
{
ADCSRA |= (1<<ADSC);
while(ADCSRA & (1<<ADIF));
U8 low = ADCL;
U16 ADCResult = low + (ADCH<<8);
samples2 += (ADCResult*2.56)/1024;
}
samples2 = samples2/5;
bMeasure = false;
__enable_interrupt(); - аналогично disble'у...
}
После смены каналов (ADMUX) вставлял задержки __delay_cycles(), самые разные, даже до 1 секунды... Пробовал клокить АЦП по таймеру... От чипа к чипу не меняется ничего (таких 10 плат). Ничего не помогает... У меня осталось только одно подозрение. Как Вы считаете, может делитель 47/10 кОм имеет слишком большое сопротивление для нормальной работы АЦП? Дело в том что сейчас по факту, на втором канале (ADC1) 0 вольт (делитель пустой), ни к чему не подсоединён ("пирожок ни с чем"

Есть интересное наблюдение: если просмотреть самое первое считанное значение fU, то оно будет нормальным в любом случае, так как сразу после запуска проги на контроллере, первым измеряется именно ADC0, но после него идёт переключение канала ADMUX++ (раньше задавал жёстко, без считывания). Отсюда вывод: как только происходит хотя бы одно переключение, то следующие считывания канала ADC0 становятся испорченными... ПОЧЕМУ???
Снимал кондёр с риференс (был 1 нФ), пробовал увеличивать до 1 мкФ, ноль эмоций

К меге подсоединено восемь семисегментных индикаторов, реализована динам. индикация через таймер с прерыванием.
Что скажете? Что непонятно - спрашивайте. Могу выложить фотки устройства...