У вас проблема простая:
Код:
ADMUX |= ((0 << MUX3) | (1 << MUX2) | (0 << MUX1) | (0 << MUX0));
если при измерении напряжения в бите MUX0 была 1, то "логическим или" она не сбросится.
Можно сделать так:
Код:
unsigned char set_ADMUX = ADMUX; //переменная для выбора канала АЦП
set_ADMUX &= ((1 << REFS1) | (1 << REFS0)); // оставить только Vref
set_ADMUX |= ch_ADC; //выбор канала АЦП 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)
//--- Функция оцифровки ацп канал ch_ADC ---
unsigned int ADC_Conv(unsigned char ch_ADC) //(переменная "канал ацп")
{
unsigned int adcv_value = 0; //сброс регистра хранения результата оцифровки напряжения
unsigned char set_ADMUX = ADMUX; //переменная для выбора канала АЦП
set_ADMUX &= ((1 << REFS1) | (1 << REFS0)); // оставить только Vref
set_ADMUX |= ch_ADC; //выбор канала АЦП ch_ADC
ADMUX = set_ADMUX;
_delay_us(10); //пауза 10мкс
for (unsigned char i = 0; i < MEASUREMENTS; i++) //цикл суммирования результатов оцифровки 64 замеров
{
ADCSRA |= (1 << ADSC); //запуск АЦП
while ((ADCSRA & (1 << ADSC)))
; //ожидание окончания преобразования
adcv_value += ADCW; //adcv_value=adcv_value+ADCW прибавим к сумме значений предыдущих измерений значение очередного измерения
}
return (unsigned int)adcv_value >> EXTRA_BITS; //выйдем из функции и вернём среднее значение (из регистров результата ADCL и ADCH АЦП)
} //оцифровки 64 замеров в переменную типа (unsigned int)
Почему-то, при измерении тока вы возвращаете только 1/2 среднего значения, но это легко исправить:
Код:
while (1) {
Display1_ADC = ADC_Conv(5); //считаем значение канала 5
ledprint_1(Display1_ADC); //отправим считанное значение в функцию вывода на индикатор вольтметра
_delay_ms(200); //пауза 0,2с
//Display2_ADC = ADCI_Conv(Read_3201()); //считаем значение регистра SPDR
Display2_ADC = ADC_Conv(4) >> 1; // 1/2 среднего значения
ledprint_2(Display2_ADC); //отправим считанное значение в функцию вывода на индикатор амперметра
_delay_ms(200); //пауза 0,2с
}