Gast
#217364
Ich hatte so einige Experimente mit dem ADC unter dem ATmega16 gemacht.
Beim ATMEGA 128 bekomme ich aber nicht so meine Werte, wie ich messen
will raus. Die Initialisierung sieht so aus:
char adc_tab[] = {
15, 47, 47, 47, 47, 47
};
unsigned short adc_field[ADC_CHANNELS] = {
0, 0, 0, 0, 0, 0
};
DDRF = 0x00;
ADMUX |= 1<<REFS1 | 1<<REFS0;
ADCSRA |= 1<<ADPS2 | 1<<ADPS1 | 1<<ADPS0 | 1<<ADEN;
Das messen und ausgeben so:
unsigned short i;
unsigned char av, amv;
char conv_buf[5];
unsigned char count;
for (count = 0; count < ADC_CHANNELS; count++) {
ADCSRA |= 1<<ADSC;
while (ADCSRA & (1<<ADSC));
i = ADC * (256 * 100 / 1024) / 100;
i = i * (adc_tab[count] + 10) / 10;
adc_field[count] = i;
av = i / 100;
amv = (i - av * 100);
uart1_puts("\r\nADC");
itoa(count, conv_buf, 10);
uart1_puts(conv_buf);
uart1_puts(": ");
itoa(av, conv_buf, 10);
uart1_puts(conv_buf);
uart1_puts(".");
itoa(amv, conv_buf, 10);
uart1_puts(conv_buf);
uart1_puts(" V\r\n");
ADMUX++;
}
ADMUX &= ~(0x1F);
Mache ich da einen Programmfehler oder ist das alles richtig und ein
HW-Problem liegt evtl. vor? An allen Kanälen liegen ca. 2V an. Die
Hardware ist so verdrahtet. Umgerechnet wird an Hand der festgelegten
Spannungsteiler (0 = 15k / 10k -> 5V, 1 = 47 / 10k -> 12V, 2 ...).
Aber an der Umrechnung liegt es nicht. Die ausgerechnete Spannung ist
ziemlich genau halb so hoch, wie reell sein sollte.
Es liegen genau 2V an den Eingängen an ... und somit müsste was in ADC
steht so um die 800 - 900 liegen. Es liegt aber auch hier bei der
Hälfte.
Hier mal der Output:
ADC0: 2.55 V
ADC1: 5.64 V
ADC2: 5.64 V
ADC3: 5.70 V
ADC4: 5.70 V
ADC5: 5.70 V