Спасибо ещё раз за мнение и совет. Снижу сопротивление в 10 раз, отпишуся...
Факир был пьян, фокус не удался

(( Заменил на делитель 4,7/1,0 кОм, не помогло нисколечко...Куда копать дальше?... Забыл признаться в гадости - у меня питание AVCC через фильтр 10 Ом 10 мкФ. Это ведь никак не могло повлиять?
Есть одна подвижка, подтверждающая теорию о недозаряде. Ускорил клоки АЦП со 128 до 16... Теперь напряжение показывает не 9,5 против реальных 12, а 4.7

))
Питание - 5.03, на ИОНе - 2.563... Вроде всё как и должно быть.
5 выборок - это пока произвольно, здесь дело в принципе запустить для начала.
Цитата
И - во втором цикле первый результат будет из канала (1<<REFS1) | (1<<REFS0), который внесет свою коррективу в размере 20%)
Не совсем понял, а что за корректива??? Ну насчёт переворота понятно, поэтому я и поменял местами переменные samples1 и samples2.
АААААА... До меня дошло, о чём Вы

))) Первое считывание второго цикла - это результат из последнего считывания первого цикла, а вношу в усреднение другой переменной

)) Ща исправим.
Теперь код у нас вот такой:
Код
|= (1<<ADSC);
ADMUX = (1<<REFS1) | (1<<REFS0) + 0;
while(ADCSRA & (1<<ADIF));
U8 low = ADCL;
U16 ADCResult = low + (ADCH<<8);
samples2 = (ADCResult*2.56)/1024;
__delay_cycles(32000); // - 2 мс
ADCSRA |= (1<<ADSC);
ADMUX = (1<<REFS1) | (1<<REFS0) + 1;
while(ADCSRA & (1<<ADIF));
U8 low = ADCL;
U16 ADCResult = low + (ADCH<<8);
samples1 = (ADCResult*2.56)/1024;
fU = samples1*5.7;
УРААААА!!!!!!!! Я пошёл искать бетонную стену... Вот это чё такое?!?!!?
Код
while(ADCSRA & (1<<ADIF));
А должно быть
Код
while(!(ADCSRA & (1<<ADIF)));
Ждать-то надо, пока нет флага!!!
ИТОГ:
Код
void ADC_task()
{
if(!bMeasure)
return;
samples1 = 0;
ADMUX = (1<<REFS1) | (1<<REFS0) + 0;
__delay_cycles(10);
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;
samples2 = 0;
ADMUX = (1<<REFS1) | (1<<REFS0) + 1;
__delay_cycles(10);
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;
}
Сообщение отредактировал AngelChik - May 11 2011, 11:05