У вас проблема простая:
Код:
ADMUX |= ((0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (0 << MUX0));
если при измерении напряжения в бите MUX0 была 1, то "логическим или" она не сбросится.
Можно сделать так:
Код:
unsigned char set_ADMUX = ADMUX;
set_ADMUX &= ((1 << REFS1) | (1 << REFS0));
set_ADMUX |= ch_ADC;
ADMUX = set_ADMUX;
в обеих функциях измерения.
Можно функции ADCV_Conv и ADCI_Conv заменить на одну:
Код:
#define EXTRA_BITS 6
#if EXTRA_BITS > 6
#error EXTRA_BITS > 6
#endif
#define MEASUREMENTS (1 << EXTRA_BITS)
unsigned int ADC_Conv(unsigned char ch_ADC)
{
unsigned int adcv_value = 0;
unsigned char set_ADMUX = ADMUX;
set_ADMUX &= ((1 << REFS1) | (1 << REFS0));
set_ADMUX |= ch_ADC;
ADMUX = set_ADMUX;
_delay_us(10);
for (unsigned char i = 0; i < MEASUREMENTS; i++)
{
ADCSRA |= (1 << ADSC);
while ((ADCSRA & (1 << ADSC)))
;
adcv_value += ADCW;
}
return (unsigned int)adcv_value >> EXTRA_BITS;
}
Почему-то, при измерении тока вы возвращаете только 1/2 среднего значения, но это легко исправить:
Код:
while (1) {
Display1_ADC = ADC_Conv(5);
ledprint_1(Display1_ADC);
_delay_ms(200);
Display2_ADC = ADC_Conv(4) >> 1;
ledprint_2(Display2_ADC);
_delay_ms(200);
}