Код модифицировал так:
Код
signed int AdcResult;
__C_task void main (void) {
unsigned char i;
signed long AdcSumma=0;
signed int tmp1;
ADCSRA = BIN(10010110); // 125kHz,Fosc=8MHz
ADCSRB = BIN(10000000); // bipolar mode
DIDR0 = BIN(11111111); // digital inputs disable
DIDR1 = BIN(11110000);
ADMUX = BIN(10010011); // (ADC4-ADC3)*1
Delay(500*ms);// wait for ADC stable
for(i=0;i<10;i++){// get 10 conversions
SETBIT(ADCSRA,ADSC);while(CHKBIT(ADCSRA,ADSC));
tmp1 = ADC;
if (CHKBIT(tmp1,9))tmp1|= 0xFC00;
AdcSumma += tmp1;
}
AdcResult = AdcSumma/10;
while(1);
}
Результаты измерений в целом:
(ADC3-ADC3)*20=ADCe=+3;
(ADC4-ADC3)*1=-1;
Смотрел через EEPROM все 10 значений как unsigned int - там большинство результатов 0x3FF, реже 0x000. Округление конечного результата при делении на 10 дает существенную ошибку. Если смотреть на формулу Result = 2*(ADC4-ADC3) - ADCe/10.0 то искомого результата (-3) чуть-чуть не получается... Если следовать общей формуле биполярного режима ADC = (ADC4-ADC3)*512*GAIN/Vref, то уверенно должно возвращаться (-3.2). Вижу необходимость переходить к float. Верно ли?