ADC im ATMEGA28

Gast #217364
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren