Robię woltomierz używajac adc z atmega16, przy pomiarach mam błedy na poziomie 10mV do 50mV. Kondensatory 100nF wpięte między gnd a Aref i Acc. Przy używaniu Aref i Acc jako źródła odniesienia wyniki takie same. Czy jest sposob aby to poprawić ? Skalibrować ?
Miernik : EZ DM-441
Miernik / Atmega
5.001 4.9951
4.094 4.101
3.42 3.41
2.80 2.79
1.91 1.88
1.299 1.265
1.08 1.04
0.77 0.73
0.25 0.20
Czytałem tez ze wewnętrzne źródło odniesienia ma pewien rozrzut produkcyjny - jak sprawdzić wartość mojego ?
Próbowałem zrobić na podstawie jakiegoś przykładu oversampling do 11bitow ale wynik mam ten sam jak w normalnym pomiarze. Co robię nie tak?
Kod:
Miernik : EZ DM-441
Miernik / Atmega
5.001 4.9951
4.094 4.101
3.42 3.41
2.80 2.79
1.91 1.88
1.299 1.265
1.08 1.04
0.77 0.73
0.25 0.20
Czytałem tez ze wewnętrzne źródło odniesienia ma pewien rozrzut produkcyjny - jak sprawdzić wartość mojego ?
Próbowałem zrobić na podstawie jakiegoś przykładu oversampling do 11bitow ale wynik mam ten sam jak w normalnym pomiarze. Co robię nie tak?
Kod:
char str[10];
uint8_t i=0;
float wynik;
unsigned short pomiar1,pomiar2,pomiar3,suma=0;
ADMUX = (0<<REFS1) |(0<<REFS0);
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
while(1)
{
suma=0;
for(i = 0; i < 16; i++)
{
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC)); // while(!(ADCSRA & (1 << ADIF)))
suma+=ADCW;
}
pomiar1=(suma>>2); //11bit
ADMUX |= _BV(0);
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));
pomiar2=ADCW;
ADMUX&=(~(1<<MUX0));
ADMUX|=(1<<MUX1);
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));
pomiar3=ADCW;
ADMUX&=(~((1<<MUX0)|(1<<MUX1)));
wynik=0.0012207*pomiar1;
dtostrf(wynik, 7, 4, str);
LCD_WriteText(str);
wynik=0.0048828*pomiar3; //=(pomiar*5)/1024;
dtostrf(wynik, 7, 4, str);
LCD_WriteText(str);