Всем доброго времени!!! Помогите пожалуйста разобраться в проблеме... Устал, уже весь мозг сломал, всё перепробовал. Устройство: АЦП контроллера измеряет сигнал через делитель напряжения (47/10 кОм), уровень сигнала после делителя - 2 вольта (к примеру). Таких три входа - ADC0-2. Проблема заключается в том, что если считывать только один канал, то всё измеряется на ура, всё (почти) точно по вольтметру. НО! Если в процессе измерения добавить второй канал (или любой другой), то отконвертированное напряжение становится "не правильным", например вместо 12,6 вольт начинает показывать 9.5. Тем не менее, считанное значение остаётся пропорциональным сигналу. Вот код:
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'у...
}
После смены каналов (ADMUX) вставлял задержки __delay_cycles(), самые разные, даже до 1 секунды... Пробовал клокить АЦП по таймеру... От чипа к чипу не меняется ничего (таких 10 плат). Ничего не помогает... У меня осталось только одно подозрение. Как Вы считаете, может делитель 47/10 кОм имеет слишком большое сопротивление для нормальной работы АЦП? Дело в том что сейчас по факту, на втором канале (ADC1) 0 вольт (делитель пустой), ни к чему не подсоединён ("пирожок ни с чем"

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

(
К меге подсоединено восемь семисегментных индикаторов, реализована динам. индикация через таймер с прерыванием.
Что скажете? Что непонятно - спрашивайте. Могу выложить фотки устройства...
Сообщение отредактировал AngelChik - May 11 2011, 09:37